前篇:
笔记(二)操作系统的启动、中断、异常、系统调用
笔记(三)(四)内存层次、地址空间、连续/非连续内存分配
Index:
5-1 虚拟内存:起因
5-2 覆盖技术
5-3 交换技术
5-4,5 虚拟内存
5-1 虚拟内存:起因
内存越来越不够用,理想中的存储器是更大,更快,更便宜的非易失存储器。
为了有效管理物理内存,采用了分段,分页,也许在这个基础上可以达到更大更快的理想情况,但数据随着掉电会丢失,硬件还达不到。
仍然希望将不经常访问的数据放在硬盘中,对硬件和OS要求很高。
对系统内存不够用采取的措施:
(1) 早期,微软的DOS,内存仅640K,程序大—–手动覆盖(overlay),把需要的指令和数据保存在内存中
(2) 程序多,自动交换技术(swapping),暂时不能执行的程序送到外存,代价大
(3) 以更小的页粒度单位在有限的内存中装入更多更大的程序,采用自动的虚拟存储技术
5-2 怎么更好地利用内存:覆盖技术
背景:早期,DOS,硬件只有640kb的内存,软件几十k,大的上兆。
Turbo Pascal 的overlay系统单元支持程序员控制的覆盖技术
目标:小内存中运行较大程序,常用于多道程序系统,与分区存储管理配合使用。
原理:按自身逻辑把程序分成几个功能上相对独立的模块,不会同时执行的模块可以共享同一块内存区域,按时间先后运行(分时)。
TIPS:
必要的代码和数据常驻内存,optional的不常用的在其余模块中实现,放外村,需要时放内存,不存在调用关系的模块不必同时载入内存,可以相互覆盖,共用一个分区。
例子:A,B,C,D,E这5个函数占用空间及调用关系如左图,如B,C之间不会相互调用因此可以共用一个分区。
还可以A占一个分区20 k,B,E,F共用一个分区50k,C,D用一个:30k,总共只用100k
缺点:
(1) 设计开销,程序员要划分模块和确定覆盖关系,编程复杂度增加了
(2) 覆盖模块从外村装入内存,实际是以时间来换空间。
id=”swap”>5-3 怎么更好滴利用内存:交换技术
背景:UNIX,让OS管理而不是程序员管理,以运行的程序为单位
目标:多道程序在内存中时,让正在运行的程序或需要运行的程序有更多的内存资源。
方法:可将暂时不能运行的程序送到外存以获得空闲内存空间,操作系统在内存管理单元MMU帮助下把一个进程的整个地址空间的内容保存到外存中(换出swap out),而将外存中的某个进程的地址空间读入到内存中(换入swap in)。其大小为整个程序的地址空间(比较大,几十几百个页)。
何时交换?
硬盘操作很慢,一动系统就要等,所以要当内存空间确实不够,或者有不够的危险时换出
交换区的大小?
极端下是内存中只留一个程序,其余都在交换区。必须够大以存放所有用户进程的所有内存映像的拷贝;必须能对这些内存映像直接存取;
swap in重定位:再次换入的内存地址一定要在原来位置上吗?
不一定,可能已被占用,要正确寻址,需要动态地址映射,虚拟地址一样,物理地址不一样。
覆盖、交换的比较:
目的是一样的。
覆盖是发生在一个运行中的程序内部没有调用关系的模块之间,代价是程序员手动指定和划分逻辑覆盖结构;交换是内存中程序与管理程序或OS之间发生的,以进程作为交换的单位,需要把进程的整个地址空间都换进换出,对程序员是透明的,开销相对较大。
“5-4、5 虚存技术
覆盖和交换都有缺点。
为了实现虚存,要利用程序的局部性原理(principle of locality)
程序在执行过程的一个较短时期,所执行的指令的地址,指令的操作数地址都局限于一定区域。
–时间局部性:一条指令的一次执行和下次执行,一个数据的一次访问和下次访问都在较短时间内;
–空间局部性:当前指令和邻近的几条指令,当前访问的数据和邻近的几个数据都集中在一个较小区域内。
小空间,高效
原理表明理论上虚存可以实现。程序只有一小部分在内存上,大部分在硬盘上,os在MMU帮助下完成。
E.G:编程对缺页率的影响:
一个二维数组a[i][j],C默认的先行后列排列法,每一行放在一个页面中。甲是for(j=0;j<1024;j++)for(i=0;i<1024;i++)a[i][j]=0;乙是i在外循环,j在内循环。页面大小4k,分配给每个进程的物理页面数为1.
甲方法产生1024*1024次缺页中断;乙方法则仅1024次。
要求程序具有局部性。
虚存机制:
在分页、分段内存管理的硬件支持下,在装入程序时,只把当前需要执行的部分页或段装入内存,就可以开始执行;
当执行到指令或数据不在内存上时(缺页、缺段异常),由处理器通知操作系统,若有空余空间则将相应的页面或段调入内存,继续执行;
另一方面,os将内存中暂时不用的页、段调出保存在外存上以腾出空间。
虚存技术基本特征:
- 大的用户空间:内存可以小,硬盘必须足够。提供给用户的虚拟空间=物理内存+硬盘。
- 部分交换:swap in /swap out 是对部分虚拟地址空间进行的
- 不连续:物理内存分配的不连续,虚拟空间使用的不连续(内外存)
具体实现:多采用虚拟页式内存管理,增加了请求调页和页面置换功能
只装入部分页面即可启动程序,如果要运行的程序和数据不在内存即页表某项invaid,则会抛出异常,向系统发出缺页中断请求,OS根据产生异常的地址找到对应在外存中的页面调入,使得继续运行。
页表项:
- 驻留位:为1,该页在内存,0,在外存,访问会缺页中断;
- 保护位:是否允许某种访问,只读,可读写,可执行;
- 修改位:在内存中是否被修改过,回收物理页面时据此决定是不是把内容写回外存;
- 访问位:如果被访问(读、写)设1,用于页面置换算法。不常用的高可能被置换。
例子:第一个操作:把虚拟地址0读入寄存器中
最底下,2代表驻留位是1,页帧号是2,页面大小4k,物理地址2*4096=8192
第二个操作:把虚拟地址32780读入,对应第8个32k-36k,X说明缺页,抛出缺页异常
对缺页中断的处理:
(1) 如果在内存中有空闲的物理空间,则分配一个物理页帧f,然后转4,否则2
(2) 采用某种页面置换算法,选择一个被替换的物理页帧,其对应逻辑页为q,没修改过可直接释放,如果修改位是1则要写回外存
(3) 把q的对应页表项驻留位设为0
(4) 把需要访问的页面p装入到物理页面f中
(5) 修改p对应页表项,驻留位为1,物理页帧好置为f
(6) restart
在何处保存未被映射的页?
能简单地被识别,在二级存储器中的页;交换空间(磁盘/文件):特殊格式,用于存储未被映射的页面swap file
硬盘也有多种方式存储,数据,代码,动态库—>后备存储中的前三个,动态产生的数据,是没与文件直接对应的内存内容→硬盘上专门开一个区swap file
后备存储(backing store),二级存储
数据:一个虚拟地址空间的页面可以被映射到一个二级存储中文件的某个位置;
代码段:映射到可执行二进制文件;
动态加载的共享库程序段:映射到动态调用的库文件
其他段:可能被映射到交换文件(swap file)
虚拟内存性能
为了便于理解分页开销,使用有效存储器访问时间的概念
—–effective memory access time(EAT)
EAT = 访存时间 * 页表命中几率(即1-page fault) + page fault处理时间 * page fault 几率
page fault处理时间* page fault 几率= 总的磁盘访问时间 = 单次访问磁盘时间(读/写)page fault 几率 (1 + dirty page几率)
如果有修改,还要将修改位为1的页面读出到外存
开销决定于p,所以程序必须有局部性特点