传统存储管理方式的不足
- 一次性:作业必须一次性全部装入内存后才能开始运行。这会造成:当作也很大时不能全部装入内存;当大量作业要求运行时,由于内存无法容纳所有作业,因此只有少量作业能够运行,导致多道程序并发度下降
- 驻留性:一旦作业被装入内存,就会一直留驻在内存中,直至作业运行结束。导致内存中驻留大量的、暂时用不到的数据,浪费了宝贵的内存资源。
局部性原理
- 时间局部性:如果执行了程序中的某条指令,那么不久后这条指令很可能再次执行;如果某个数据被访问过,那么这个数据很可能再次被访问
- 空间局部性:一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也很有可能被访问。
高速缓冲技术的思想:将近期会频繁访问到的数据放到更告诉的存储器中,暂时用不到的数据放在更低速存储器中。
快表机构就是将近期长访问的页表项副本放到更高速的联想寄存器中。
虚拟内存
由于局部性原理,在程序装入时,可以将程序中很快用到的部分装入内存,暂时用不到的部分留在外存,就可以让程序开始执行。在程序执行过程中,当访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存,然后继续执行程序。若内存空间不够,由操作系统负责将内存中暂时用不到的信息换出外存。
在操作系统的管理下,在用户看来似乎有一个比实际内存大得多的内存,这就是虚拟内存。(操作系统虚拟性的体现)
虚拟内存的最大容量是由计算机的地址结构(CPU寻址范围)确定的
虚拟内存的实际容量=min(内存和外存容量之和,CPU寻址范围)
主要特征:
- 多次性:允许多次装入
- 对换性:允许作业运行过程中将作业换入换出
- 虚拟性:使得用户看到的内存容量大于实际容量
主要区别:如果访问的信息不再内存时,有操作系统将所需信息从外存调入内存(请求调页/段)
如果内存空间不够,由操作系统负责将内存中暂时用不到的信息换到外存(页面/段置换)
请求分页管理方式
请求调页:操作系统需要知道每个页面是否已经调入内存;如果没有调入,需要知道该页面在外存存放的位置
页面置换:根据某些指标来决定换出哪些页面,有的页面没有被修改过,就不用再浪费时间写回外存。有的页面修改过,就需要将外存中就数据覆盖,因此操作系统需要记录各个页面是否被修改的信息。
缺页中断机构
在请求分页系统中,每当要访问的页面不再内存时,便产生一个缺页中断,然后由操作系统的缺页中断处理程序处理中断。此时缺页的进程阻塞,放入阻塞队列,调页完成后再将其唤醒,放回就绪队列。
如果内存中有空闲块,则为进程分配一个空闲块,将所缺页面装入该块,并修改页表中相应的页表项。
如果内存中没有空闲块,则由页面置换算法选择一个页面淘汰,若该页面在内存期间被修改过,则要将其写回外存。未修改过的页面不用写回外存。
缺页中断是因为当前执行的指令想要访问的目标页面未调入内存而产生的,因此属于内中断。
一条指令在执行期间可能产生多次缺页中断
地址变换
请求分页存储管理与基本分页存储管理的区别:
新增步骤1:请求调页(查到页表项时进行判断)
新增步骤2:页面置换(需要调入页面,但没有空闲内存块时)
新增步骤3:需要修改请求页表中新增的表项
- 只有写指令才需要修改修改位。并且,一般来说只需要修改快表中的数据,只有要将快表想删除时才需要写回内存中的慢表,这样就可以减少访存次数。
- 和普通的中断处理一样,却也中断处理依然需要保留CPU现场
- 页面换入/换出都要启动慢速的I/O操作
- 页面调入内存后,需要修改慢表,同时也需要将表项复制到快表中
页面置换算法
最佳置换算法(OPT)
每次选择淘汰的页面将时以后永不使用或者在最长时间内不再被访问的页面,这样可以保证最低的缺页率。
注意:缺页时未必发生页面置换,若还有可用的空闲内存块,就不用进行页面置换
缺页率=缺页中断次数/页面访问次数
只有没有空闲内存块的缺页中断才需要页面置换
理想化算法,实际无法实现
先进先出置换算法(FIFO)
每次选择淘汰的页面是最早进入内存的页面
把调入内存的页面根据调入的先后顺序排成一个队列,需要换出页面时选择队头,将新页面放入队尾
Belady异常:当为进程分配的物理块数增大时,缺页次数不减反增的异常现象。
只有FIFO算法会产生Belady异常。
最近最久未使用置换算法(LRU)
每次淘汰的页面是最近最久未使用的页面
实现方法:在每个页面对应的页表项中,用访问字段记录该页面自从上次被访问以来经历的时间t,当需要 淘汰一个页面时,选择现有页面中t中最大的,即最近最久未使用的页面
算法性能好,实现困难,开销大
性能最接近OPT
时钟置换算法(CLOCK)
是一种性能和开销较均衡的算法,又称作CLOCK算法,或最近未使用算法(NRU not recently used)
简单CLOCK算法实现:为每个页面设置一个访问位(1,表示最近访问,0,表示最近没有访问),再讲内存中的页面都通过链接指针链接成一个循环队列。当某页被访问时,其访问位置为1。当需要淘汰一个页面时,只需要检查页的访问位,如果时0,就将该页换出;如果是1,则将它置为0,暂不换出,继续检查下一个页面。若第一轮扫面中所有页面都是1,则将这些页面的访问位依次置为0后再进行第二次扫描。
简单CLOCK算法选择一个淘汰页面最多会经过两次扫描。
改进型的时钟置换算法:简单时钟置换算法仅仅考虑一个页面最近是否被访问,事实上,如果被淘汰的页面没有被修改过,就不需要执行I/O操作写回外存。只有被淘汰的页面被修改过时才需要写回外存。
因此考虑一个页面最近有没有被访问过之外,操作系统还应该考虑页面有没有被修改过。在其他条件都相同时,应优先淘汰没有修改过的页面,避免I/O操作。
实现:设置修改位,0表示没有被修改,1表示被修改。
(访问位,修改位)
算法规则:
将所有可能被置换的页面排成一个循环队列
- 从当前位置开始扫描第一个(0,0)的帧用于替换,不修改任何标志位
- 如果第一轮扫描失败,则重新扫描。查找第一个(0,1)的帧用于替换,本轮将所有扫描过的帧访问位设为0
- 如果第二轮扫描失败,则重新扫描,查找第一个(0,0)的帧用于替换,本轮扫描不修改任何标志位
- 若第三轮扫描失败,则重新扫描,找到第一个(0,1)的帧用于替换。
由于第二轮已经将所有帧的访问位设置为0,因此经过第三轮第四轮扫描一定会有一个帧被选中,因此改进型CLOCK置换算法选择一个淘汰页面最多会进行四次扫描
页面分配置换策略
驻留集:请求分页管理中给进程分配的物理块的集合
在采用了虚拟存储的系统中,驻留集大小一般小于进程的总大小
如果驻留集太小,则会频繁缺页,系统要花大量的时间处理缺页,实际用于进程推进的时间很少
驻留集太大,会导致多道程序并发度下降,资源利用率降低。
-
固定分配:操作系统为每个进程分配一组固定数目的物理块,在进程运行期间不再改变。
-
可变分配:纤维每个进程分配一定数目的物理块,在进程运行期间可根据情况做适当的增加或者减少,即,驻留集大小可变
-
局部置换:发生缺页时只能选进程自己的物理块进行置换
-
全局置换:可以将操作系统保留的空闲物理块分配给却也进程,也可以将别的进程持有的物理块置换到外存,再分缺页进程。
-
固定分配局部置换:缺点:很难在刚开始就确定为每个进程分配多少个物理块才算合适。采用这种策略的系统一般会根据一定的参数确定内存块
-
可变分配全局置换:只要某进程发生缺页,都能获得新的物理块,仅当空闲物理块用完时,系统才选择一个未锁定的页面调出。被选择调出的页面可能是系统中任何一个进程中的页,因此这个被选中的进程拥有的物理块会减少,缺页率会增加。
系统会锁定一些页面,这些页面中的内容不能置换出去。 -
可变分配局部置换:如果进程在运行中频繁地换页,系统回味该进程多分配几个物理块,直至该进程缺页率趋势适当程度。反之,如果进程在运行时缺页率特别低,可适当减少分配给该进程的内存块。
可变分配全局置换:只要就分配新物理块
可变分配局部置换:根据缺页率动态增加或者减少物理块
调入页面
时间
- 预调页策略:根据局部性原理,一次调入若干个相邻的页面可能比一次调入一个页面更加高效。预测不久之后可能要访问的页面,将他们预先调入内存。预测成功率只有50%。这种策略主要用于进程的首次进入。
- 请求调页策略:进程在运行期间发现缺页才将所缺页面调入内存。这种策略调入的页面一定会被访问到。但是每次都只能调入一页,而每次调页都要磁盘I/O操作,因此I/O开销较大
地点
- 如果系统拥有足够的调换去空间,页面的调入调出都是内存与对换区之间进行的,这样可以保证页面的调入调出速度很快。在进程运行前,需要讲进程相关的数据从内存区复制到对换区。
- 如果系统缺少足够的对换区空间:凡是不会被修改的数据都直接从文件区调入,由于这些页面不会被修改,因此换出时不需要写回磁盘,下次需要时再从文件区调入即可。对于可能被修改的部分,换出时需要写回磁盘对换区,下次需要时再从对换区调入。
- UNIX:运行之前进程有关的数据全部放在文件区,故未使用过的页面都可以从文件区调入。若被使用过的页面需要换出,则写回对换区,下次需要时再从对换区调入。
抖动(颠簸)现象
抖动现象是指在更换页面时,如果被更换的页面是一个很快再次访问的页面,则会频繁地发生页面调度,以至于调度页面所需时间过长,系统效率急剧下降的现象。
解决策略:
- 有针对性地选择更优秀的页面置换算法以减少页面替换策略失误
- 挂起低优先级的进程,减少多道程序数量使得能够增大驻留集,让进程拥有更多的内存块
- 给进程分配合适大小的内存块。为了解决给进程分配多少个内存块比较合适,可以使用Denning提出的 “工作集”的概念进行解决。首先操作系统根据窗口尺寸统计工作集的大小,然后让驻留集的大小大于等于工作集的大小即可。与之相关的我们可以每次选择一个不再工作集中的页面进行淘汰。
- 使用L=S准则调节缺页率,让程序最大可能地并发处理,提高磁盘和处理机的利用率。
工作集
工作集:在某段时间间隔内,进程实际访问页面的集合
驻留集:请求分页存储管理中给进程分配的内存块的集合
一般来说驻留集的大小不能小于工作集的大小,否则进程运行过程中将会频繁缺页
拓展:基于局部性原理可知,进程在一段时间内访问的页面与不久之后访问的页面是有相关性的。因此可以根据近期访问的页面集合来设计页面置换算法:选择一个不再工作集中的页面进行淘汰