前言
以下内容源自计算机操作系统(第四版)
关于操作系统,
CSDN有很多的优秀博客。
在这里,
本文摘取其他博客内容,
并附上相关链接,
如有侵权,
联系删除,
仅供学习交流使用
请您阅读文章声明,默认同意该声明
推荐
计算机操作系统(第四版)之虚拟存储器要点梳理
第五章 虚拟存储器
5.1 虚拟存储器概述
虚拟存储器实现了内存扩充功能。但该功能并非是从物理上实际地扩大内存的容量,而是从逻辑上实现对内存容量的扩充。
第四章所介绍的各种存储器管理方式有一个共同的特点,即它们都要求将一个作业全部装入内存后方能运行。于是,出现了下面这样两种情况:
1)有的作业很大,其所要求的内存空间超过了内存总容量。
2)有大量作业要求运行,但由于内存容量不足以容纳所有这些作业。
都是由于内存容量不够大导致的,一种解决方法是从逻辑上扩充内存容量,这正是虚拟存储技术所要解决的主要问题。
5.1.1 常规存储管理方式的特征和局部性原理
1.常规存储器管理方式的特征
1)一次性。指作业必须一次性地全部装入内存后方能开始运行。
2)驻留性。作业装入内存后,整个作业会一直驻留在内存中,其中任何部分都不会被换出,直至作业运行结束。
一次性及驻留性特征,使许多在程序运行中不用或暂不用的程序(数据)占据了大量的内存空间,使得一些需要运行的作业无法装入运行。
2.局部性原理
程序在执行时将呈现出局部性规律,即在一较短的时间内,程序的执行仅局限于某个部分,相应地,它所访问的存储空间也局限于某个区域。 论点如下:
1)程序执行时,除了少部分的转移和过程调用指令外,在大多数情况下是顺序执行的。
2)过程调用将会使程序的执行轨迹由一部分区域转至另一部分区域。
3)程序中存在许多循环结构,这些虽然只由少数指令构成,但是它们将多次执行。
4)程序中还包括许多对数据结构的处理,如对数组进行操作,它们往往都局限于很小的范围内。
局限性还表现在下述两个方面:
1)时间局限性。如果程序中的某条指令(或数据)一旦被执行(或被访问),则不久以后该指令(或数据)可能再次被执行(或被访问)。产生时间局限性的典型原因是由于在程序中存在着大量的循环操作。
2)空间局限性。程序在一段时间内所访问的地址,可能集中在一定的范围之内,其典型情况便是程序的顺序执行。
3.虚拟存储器的基本工作情况
基于局部性原理可知,应用程序在运行之前,没有必要全部装入内存,仅须将那些当前要运行的少数页面或段先装入内存便可运行,其余部分暂留在盘上。程序在运行时,如果它所要访问的页(段)已调入内存,便可继续执行下去;但如果程序所要访问的页(段)尚未调入
内存(称为缺页或缺段),此时程序应利用 OS 所提供的请求调页(段)功能,将它们调入内存,以使进程能继续执行下去。如果此时内存已满,无法再装入新的页(段),则还须再利用页(段)的置换功能,将内存中暂时不用的页(段)调至盘上,腾出足够的内存空间后,再将要访问的页(段)调入内存,使程序继续执行下去。这样,便可使一个大的用户程序能在较小的内存空间中运行;也可在内存中同时装入更多的进程使它们并发执行。
5.1.2虚拟存储器的定义和特征
1.虚拟存储器的定义
所谓虚拟存储器,是指具有请求调入功能和置换功能,能从逻辑上对内存容量加以扩充的一种存储器系统。其逻辑容量由内存容量和外存容量之和所决定,其运行速度接近于内存速度,而每位的成本却又接近于外存。
2.虚拟存储器的特征
1)多次性。是指一个作业中的程序和数据无需在作业运行时一次性地全部装入内存,而是允许被分成多次调入内存运行,即只需将当前要运行的那部分程序和数据装入内存即可开始运行。
2)对换性。是指一个作业中的程序和数据,无须在运行时一直常驻内存,而是允许在作业的运行过程中进行换进、换出。
3)虚拟性。是指能够从逻辑上扩充内存容量,使用户所看到的内存容量远大于实际内存容量。就可以在小的内存中运行大的作业,或者能提高多道程序度。
虚拟性是以多次性和对换性为基础的,而多次性和对换性是必须建立在离散分配的基础上。
5.1.3虚拟存储器的实现方法
1.分页请求系统
这是在分页系统的基础上,增加了请求调页功能和页面置换功能所形成的页式虚拟存储系统。置换时以页面为单位。
1)硬件支持。
①请求分页的页表机制。
②缺页中断机构。
③地址变换机构。
2)实现请求分页的软件。
包括有用于实现请求调页的软件和实现页面置换的软件。
2.分段请求系统
这是在分段系统的基础上,增加了请求调段及分段置换功能后所形成的段式虚拟存储系统。置换时以段为单位。
1)硬件支持。
①请求分段的段表机制。
②缺段中断机构。
③地址变换机构。
2)实现请求分段的软件。
包括有用于实现请求调段的软件和实现段置换的软件。
因为请求分页系统换进和换出的基本单位都是固定大小的页面,所以在实现上要容易些。而请求分段系统换进换出的基本单位是段,其长度是可变的,分段的分配类似于动态分区方式,它在内存分配和回收上都比较复杂。
段页式虚拟存储器系统。
在段页式系统基础上,增加请求调页和页面置换功能形成段页式虚拟存储器系统。
5.2 请求分页存储管理方式
5.2.1 请求分页中的硬件支持
1.请求页表机制
在请求页表中增加了四个字段:
1)状态位(存在位) P:指示该页是否已调入内存。
2)访问字段A:记录该页在一段时间内的访问次数,或者最近多久未被访问,为置换算法选择置换页提供参考;
3)修改位M:指示该页在调入内存后是否被修改过。
4)外存地址:指示该页在外存的地址,通常是物理块号。
2.缺页中断机构
在请求分页系统中,每当所要访问的页面不在内存时,便产生一缺页中断,请求 OS 将所缺之页调入内存。缺页中断作为中断,它们同样需要经历诸如保护 CPU 环境、分析中断原因、转入缺页中断处理程序进行处理、恢复 CPU 环境等几个步骤。但缺页中断又是一种特殊的中断,它与一般的中断相比,有着明显的区别,主要表现在下面两个方面:
1)在指令执行期间产生和处理中断信号。即在指令执行期间,发现所要访问的指令或数据不在内存时所产生和处理的。
2)一条指令在执行期间,可能产生多次缺页中断。并保证最后能返回到中断前产生缺页中断的指令处继续执行。
3.地址变换机构
在检索块表和页表时,对于写指令,还须将修改位置成“1”。
5.2.2 请求分页中的内存分配
1.最小物理块数的确定
这里所说的最小物理块数,是指能保证进程正常运行所需的最小物理块数。进程应获得的最少物理块数与计算机的硬件结构有关,取决于指令的格式、功能和寻址方式。
2.内存分配策略
在请求分页系统中,可采取两种内存分配策略,即固定和可变分配策略。在进行置换时,也可采取两种策略,即全局置换和局部置换。于是可组合出以下三种适用的策略。
1)固定分配局部置换。
所谓固定分配,是指为每个进程分配一定数目的物理块,在整个运行期间都不再改变。所谓局部置换,是指如果进程在运行中发现缺页,则只能从分配给该进程的 n 个页面中选出一个页换出,然后再调入一页,以保证分配给该进程的内存空间不变。实现这种策略的困难在于:应为每个进程分配多少个物理块难以确定。
2)可变分配全局置换。
所谓可变分配,是指先为系统中的每个进程分配一定数目的物理块,在进程运行期间,可根据情况做适当的增加或减少。所谓全局置换,是指当进程发现缺页时,则将 OS 所保留的空闲物理块(一般组织为一个空闲物理块队列)取出一块分配给该进程,或者以所有物理块为标的,选择一块换出,然后将所缺之页调入。
在采用这种策略时,凡产生缺页(中断)的进程,都将获得新的物理块,仅当空闲物理队列中的物理块用完时,OS 才能从内存中选择一页调出,而被选择调出的页所属的进程拥有的物理块就会减少,导致其缺页率增加。
3)可变分配局部置换。
该策略为每个进程分配一定数目的物理块,但当某进程发现缺页时,只允许从该进程在内存的页面中选出一页换出,这样就不会影响其它进程的运行。如果进程在运行中频繁地发生缺页中断,则系统须再为该进程分配若干附加的物理块,直至该进程的缺页率减少到适当程度为止;反之,若一个进程在运行过程中的缺页率特别低,则此时可适当减少分配给该进程的物理块数,但不应引起其缺页率的明显增加。
3.物理块分配算法
在采用固定分配策略时,如何分配物理块采用以下算法:
1)平均分配算法。
2)按比例分配算法,即根据进程的大小按比例分配物理块的算法。
3)考虑优先权的分配算法。通常采取的方法是把内存中可供分配的所有物理块分成两部分:一部分按比例地分配给各进程;另一部分则根据各进程的优先权进行分配。
5.2.3 页面调入策略
1.何时调入页面
1)预调页策略。一次调入若干个相邻的页。
①可用于进程的首次调入时。②在采用工作集的系统中使用。
2)请求调页策略。
进程在运行中提出缺页请求时调入。这种策略每次仅调入一页,故须花费较大的系统开销,增加了磁盘 I/O 的启动频率。
2.从何处调入页面
通常,由于对换区是采用连续分配方式,而文件区是采用离散分配方式,故对换区的磁盘 I/O 速度比文件区的高。
1)系统拥有足够的对换区空间,这时可以全部从对换区调入所需页面,以提高调页速度。为此,在进程运行前,便须将与该进程有关的文件从文件区拷贝到对换区。
2)系统缺少足够的对换区空间,这时凡是不会被修改的文件都直接从文件区调入;但对于那些可能被修改的部分,在将它们换出时,便须调到对换区,以后需要时,再从对换区调入。
3)UNIX 方式。凡是未运行过的页面,都应从文件区调入。而对于曾经运行过但又被换出的页面,由于是被放在对换区,因此在下次调入时,应从对换区调入。
3.页面调入过程
每当程序所要访问的页面未在内存时(存在位为“0”),便向 CPU 发出一缺页中断,中断处理程序首先保留 CPU 环境,分析中断原因后转入缺页中断处理程序。该程序通过查找页表,得到该页在外存的物理块后,如果此时内存能容纳新页,则启动磁盘 I/O 将所缺之页调入内存,然后修改页表。如果内存已满,则须先按照某种置换算法从内存中选出一页准备换出;如果该页未被修改过(修改位为“0”),可不必将该页写回磁盘;但如果此页已被修改(修改位为“1”),则必须将它写回磁盘,然后再把所缺的页调入内存,并修改页表中的相应表项,置其存在位为“1”,并将此页表项写入快表中。在缺页调入内存后,利用修改后的页表,去形成所要访问数据的物理地址,再去访问内存数据。整个页面的调入过程对用户是透明的。
4.缺页率
如果在进程的运行过程中,访问页面成功(即所访问页面在内存中)的次数为S,访问页面失败(即所访问页面不在内存中,需要从外存调入)的次数为F,则该进程总的页面访问次数为A = S + F,那么该进程在其运行过程中的缺页率即为
f=F/A
缺页率受以下因素的影响:
1)页面大小。
2)进程所分配物理块的数目。
3)页面置换算法。因此缺页率是衡量页面置换算法的重要指标。
4)程序固有特性。
事实上,在缺页处理时,选择被置换页面还需要考虑置换的代价,如页面是否被修改过。
5.3 页面置换算法
把内存已无空闲空间时选择换出页面的算法称为页面置换算法(Page-Replacement Algorithms)。
不适当的算法可能会导致进程发现“抖动”,即刚被换出的页很快又要被访问,需要将它重新调入,可能会出现频繁地更换页面,以致一个进程在运行中把大部分时间都花费在页面置换工作上。
一个好的页面置换算法,应具有较低的页面更换频率。
5.3.1 最佳置换算法和先进先出置换算法
最佳置换算法是一种理想化的算法,通常使用最佳置换算法作为标准,来评价其它算法的优劣。先进先出置换算法是最直观的算法,由于与通常页面的使用规律不服,可能是性能最差的算法,故实际应用极少。
1.最佳(Optimal)置换算法
其所选择的被淘汰页面,将是以后永不使用的,或许是在最长(未来)时间内不再被访问(即下一次访问时间最晚)的页面。采用最佳置换算法,通常可保证获得最低的缺页率。
假定系统为某进程分配了三个物理块,并考虑有以下的页面好引用串:
7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1
置换图如下:
每次把最长(未来)时间内不在访问的页面置换出
7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1
7 7 7 2 2 2 2 2 2 2 2 2 2 2 2 2 2 7 7 7
0 0 0 0 0 0 4 4 4 0 0 0 0 0 0 0 0 0 0
1 1 1 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1
+ + + + + + + +
置换次数是6次,前三次不是置换,只是缺页
缺页中断次数9,缺页率9/20
2.先进先出(FIFO)页面置换算法
总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。
FIFO 置换算法性能之所以较差,是因为它所依据的条件是各个页面调入内存的时间,而页面调入的先后并不能反映页面的使用情况。
假定系统为某进程分配了三个物理块,并考虑有以下的页面好引用串:
7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1
置换图如下:
置换出最先进入内存的页面,置入放在最底了,这样最顶就是最先进入内存
当不需要置换时,保持不变。
7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1
7 7 7 0 0 1 2 3 0 4 2 2 2 3 0 0 0 1 2 7
0 0 1 1 2 3 0 4 2 3 3 3 0 1 1 1 2 7 0
1 2 2 3 0 4 2 3 0 0 0 1 2 2 2 7 0 1
+ + + + + + + + + + + + + + +
置换次数是12次,前三次不是置换,只是缺页
缺页中断次数15,缺页率15/20
5.3.2 最近最久未使用和最少使用置换算法
1.LRU(Least Recently Used) 置换算法的描述
最近最久未使用(LRU)的页面置换算法,是根据页面调入内存后的使用情况进行决策的。即选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 t,当须淘汰一个页面时,选择现有页面中其 t 值最大的,即最近最久未使用的页面予以淘汰。
最佳置换算法是从“向后看”的观点出发的,即它是依据以后各页的使用情况;而 LRU 算法则是“向前看”的,即根据各页以前的使用情况来判断,而页面过去和未来的走向之间并无必然的联系。
2.LRU 置换算法的硬件支持
1)寄存器。
为每个在内存中的页面配置一个移位寄存器,可表示为
R=Rn-1Rn-2Rn-3…R2R1R0
当进程访问某物理块时,要将相应寄存器的 Rn-1 位置成 1。此时,定时信号将每隔一定时间(例如 100 ms)将寄存器右移一位。如果我们把 n 位寄存器的数看做是一个整数,那么,具有最小数值的寄存器所对应的页面,就是最近最久未使用的页面。
2)栈。
可利用一个特殊的栈来保存当前使用的各个页面的页面号。每当进程访问某页面时,便将该页面的页面号从栈中移出,将它压入栈顶。因此,栈顶始终是最新被访问页面的编号,而栈底则是最近最久未使用页面的页面号。
假定系统为某进程分配了三个物理块,并考虑有以下的页面好引用串:
7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1
置换图如下:
置换出最进未使用入的页面,置入放在最底了,这样最顶就是最近最久未使用的页面
当不需要置换是,也需把新页面放在最底,保证了最底层是最近最久使用的页面。
7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1
7 7 7 0 1 2 2 3 0 4 2 2 0 3 3 1 2 0 1 7
0 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0
1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1
+ + + + + + + + + + + +
置换次数是9次,前三次不是置换,只是缺页
缺页中断次数12,缺页率12/20
3.最少使用 LFU 置换算法
该算法用移位寄存器方式。每次访问某页时,便将该移位寄存器的最高位置 1,再每隔一定时间(例如 100 ms)右移一次。LFU 置换算法的页面访问图与 LRU 置换算法的访问图完全相同;或者说,利用这样一套硬件既可实现 LRU 算法,又可实现 LFU 算法。但 LRU 算法是根据将 n 位看作一个整数找到最近最久未使用的页面,而 LFU 算法的在最近一段时间使用最少的页面将是∑Ri 最小的页。
应该指出,LFU 算法并不能真正反映出页面的使用情况,因为在每一时间间隔内,只是用寄存器的一位来记录页的使用情况,因此,在该时间间隔内,对某页访问一次和访问 1000 次是完全等效的。
5.3.3 Clock 置换算法
虽然 LRU 算法是较好的一种算法,但由于它要求有较多的硬件支持,故在实际应用中,大多采用 LRU 的近似算法。Clock 算法就是用得较多的一种 LRU 近似算法。
1.简单的 Clock 置换算法。
只需为每页设置一位访问位,再将内存中的所有页面都通过链接指针链接成一个循环队列。当某页被访问时,其访问位被置 1。置换算法在选择一页淘汰时,只需检查页的访问位。如果是 0,就选择该页换出;若为 1,则重新将它置 0,暂不换出,而给该页第二次驻留内存的机会,再按照 FIFO 算法检查下一个页面。该算法是循环地检查各页面的使用情况的。又把该算法称为最近未用算法 NRU。
2.改进型 Clock 置换算法
在改进型 Clock 算法中,除须考虑页面的使用情况外,还须再增加一个因素,即置换代价,这样,选择页面换出时,既要是未使用过的页面,又要是未被修改过的页面。把同时满足这两个条件的页面作为首选淘汰的页面。由访问位 A 和修改位 M 可以组合成下面四种类型的页面:
1 类(A=0,M=0):表示该页最近既未被访问,又未被修改,是最佳淘汰页。
2 类(A=0,M=1):表示该页最近未被访问,但已被修改,并不是很好的淘汰页。
3 类(A=1,M=0):表示该页最近已被访问,但未被修改,该页有可能再被访问。
4 类(A=1,M=1):表示该页最近已被访问且被修改,该页可能再被访问。
在内存中的每个页必定是这四类页面之一,在进行页面置换时,与简单 Clock 算法差别在于该算法须同时检查访问位与修改位,以确定该页是四类页面中的哪一种。其执行过程可分成以下三步:
1)从指针所指示的当前位置开始,扫描循环队列,寻找 A=0 且 M=0 的第一类页面,将所遇到的第一个页面作为所选中的淘汰页。在第一次扫描期间不改变访问位 A。
2)如果第一步失败,即查找一周后未遇到第一类页面,则开始第二轮扫描,寻找 A=0 且 M=1 的第二类页面,将所遇到的第一个这类页面作为淘汰页。在第二轮扫描期间,将所有扫描过的页面的访问位都置 0。
3)如果第二步也失败,亦即未找到第二类页面,则将指针返回到开始的位置,并已将所有的访问位复 0。然后重复第一步,如果仍失败,必要时再重复第二步,此时就一定能找到被淘汰的页。
该算法与简单 Clock 算法比较,可减少磁盘的 I/O 操作次数。但为了找到一个可置换的页,可能须经过几轮扫描。换言之,实现该算法本身的开销将有所增加。
5.3.4 页面缓冲算法 PBA
1.影响页面换进换出效率的若干因素
1)页面置换算法。
2)写回磁盘的频率。对于已经被修改过的页面,在将其换出时,应当写回磁盘。
但如果在系统中已建立了一个已修改换出页面的链表,则对每一个要被换出的页面(已修改),系统可暂不把它们写回磁盘,而是将它们挂在已修改换出页面的链表上,仅当被换出页面数目达到一定值时,例如64个页面,再将它们一起写回到磁盘上,这样就显著减少了磁盘 I/O的操作次数。或者说,减少已修改页面换出的开销。
3)读入内存的频率。在设置了已修改换出页面链表后,在该链表上就暂时有一批装有数据的页面,如果有进程在这批数据还未写回磁盘时需要再次访问这些页面时,就不需从外存上调入,而直接从已修改换出页面链表中获取,这样也可以减少将页面从磁盘读入内存的频率,减少页面换出的开销。
2.页面缓冲算法 PBA
PBA 算法特点:① 显著地降低了页面换进、换出的频率。② 正是由于换入换出的开销大幅度减小,才能使其可采用一种较简单的置换策略,如先进先出(FIFO)算法。
介绍VAX/VMS操作系统所使用的页面缓冲算法。在该系统中内存分配策略上采用了可变分配和局部置换方式,同时在内存中设置了两个链表:
1)空闲页面链表。
实际上是一个空闲物理块链表。当进程需要读入一个页面时,便可利用空闲物理块链表中的第一个物理块来装入该页。当有一个未被修改的页要换出时,而是把它们所在的物理块挂在空闲链表表尾。
2)修改页面链表。
是由已修改的页面所形成的链表。当进程需要将一个已修改的页面换出时,系统并不立即把它换出到外存上,而是将它所在的物理块挂在修改页面链表的末尾。当达到一定数量时,再将它们一起写回磁盘。
5.3.5 访问内存的有效时间
在请求分页管理方式中,内存有效访问时间不仅要考虑访问页表和访问实际物理地址数据的时间,还必须考虑缺页中断的处理时间。
1)被访问页在内存中,且其对应的页表项在快表中。
2)被访问页在内存中,且其对应的页表项不在快表中。
3)被访问页不在内存中,即需要进行缺页中断处理。
事实计算时还要考虑快表命中率和页面缺页率的因素。
5.4 “抖动”与工作集
5.4.1 多道程序度与“抖动”
1.多道程序度与处理机的利用率
随着多道程序度的增大,处理机的利用率先上升后下降。当多道程序度过高时,会发生“抖动”。
2.产生“抖动”的原因
根本原因是,同时在系统中运行的进程太多,由此分配配给每一个进程的物理块太少,不能满足进程正常运行的基本要求,致使每个进程在运行时,频繁地出现缺页,必须请求系统将所缺之页调入内存。造成每个进程的大部分时间都用于页面的换进/换出,而几乎不能再去做任何有效的工作,从而导致发生处理机的利用率急剧下降并趋于0的情况。
5.4.2 工作集
1.工作集的基本概念
进程发生缺页率的时间间隔与进程所获得的物理块数有关(即成反比)。
基于程序运行时的局部性原理得知,程序在运行期间,对页面的访问时不均匀的,在一段时间内仅局限于较少的页面。这些页面被称为活跃页面。
2.工作集的定义
所谓工作集,是指在某段时间间隔Δ里,进程实际所要访问页面的集合。具体地说,把某进程在时间 t 的工作集记作 w(t, Δ),其中的变量 Δ 称为工作集的“窗口尺寸”。可将工作集的定义为,进程在时间间隔 (t-Δ, t) 中引用页面的集合。
工作集是窗口尺寸 Δ 的非降函数。即 w(t, Δ) ⊆ w(t, Δ+1)。
5.4.3 “抖动”的预防方法
这些方法几乎都是采用调节多道程序度来控制“抖动”发生的。
1.采取局部置换策略。
即使该进程发生了“抖动”,也不会对其它进程产生影响,于是可把该进程“抖动”所造成的影响限制在较小的范围内。但在某进程发生“抖动”后,它还会长期处在磁盘 I/O 的等待队列中,使队列的长度增加,这会延长其它进程缺页中断的处理时间。
2.把工作集算法融入到处理机调度中
当调度程序发现处理机利用率低下时,它将试图从外存调入一个新作业进入内存,在从外存调入作业之前,必须检查每个进程在内存的驻留页面是否足够多。如果都足够多,此时便可以从外存调入新的作业,不会因新作业的调入而导致缺页率的增加;反之,如果有些进程的内存页面不足,则应首先为那些缺页率居高的作业增加新的物理块,此时将不再调入新的作业。
3.利用“L=S”准则调节缺页率
其中L是缺页之间的平均时间,S是平均缺页服务时间,即用于置换一个页面所需的时间。如果是L远比S大,说明很少发生缺页,磁盘的能力尚未得到充分的利用;反之,如果是L比S小,则说明频繁发生缺页,缺页的速度已超过磁盘的处理能力。只有当L与S接近时,磁盘和处理机都可达到它们的最大利用率。理论和实践都已证明,利用“L=S”准则,对于调节缺页率是十分有效的。
4.选择暂停进程
基于某种原则选择暂停某些进程。将它们调出到磁盘上,以便腾出内存空间分配给缺页率发生偏高的进程。
5.5 请求分段存储管理方式
5.5.1 请求分段中的硬件支持
1.请求段表机制
除了段名(号)、段长、段在内存中的起始地址外,还增加了以下诸项:
1)存取方式:根据信息的属性对分段实施保护。如果该字段为两位,则存取属性是只执行、只读和允许读/写。
2)访问字段 A:记录该段被访问的频繁程度。
3)修改位 M:表示该段在进入内存后是否已被修改过。
4)存在位 P:指示本段是否已调入内存。
5)增补位:表示本段在运行过程中是否做过动态增长。
6)外存始址:指示本段在外存中的起始地址,即起始盘块号。
2.缺段中断机构
每当发现运行进程所要访问的段尚未调入内存时,便由缺段中断机构产生一缺段中断信号,进入 OS 后由缺段中断处理程序将所需的段调入内存。缺段中断机构与缺页中断机构类似,它同样需要在一条指令的执行期间,产生和处理中断,以及在一条指令执行期间,可能产生多次缺段中断。但由于分段是信息的逻辑单位,因而不可能出现一条指令被分割在两个分段中和一组信息被分割在两个分段中的情况。由于段不是定长的,这使对缺段中断的处理要比对缺页中断的处理复杂。
3.地址变换机构
上图中的段表的的起始编号是从 1 开始的。
5.5.2 分段的共享与保护
1.共享段表
为了实现分段共享,可在系统中配置一张共享段表,所有各共享段都在共享段表中占有一表项。记录了共享段的信息和共享
此分段的某个进程的情况。
1)共享进程计数 count。非共享段仅为一个进程所需要。而共享段是为多个进程所需要的,当某进程不再需要而释放它时,系统并不立即回收该段所占内存区,而是检查 count 是否为 0,若不是 0,则表示还有进程需要它,仅当所有共享该段的进程全不再需要它使,此时 count 为 0,才由系统回收该段所占的内存区。
2)存取控制字段。对于一个共享段,应给不同的进程以不同的存取权限。
3) 段号。对于一个共享段,在不同的进程中可以具有不同的短号,每个进程可用自己进程的段号去访问该共享段。
2.共享段的分配与回收
1)共享段的分配。
在为共享段分配内存时,对第一个请求使用该共享段的进程,由系统为该共享段分配一物理区,再把共享段调入该区,同时将该区的始址填入请求进程的段表的相应项中,还须在共享段表中增加一表项,填写有关数据,把 count 置为 1。之后,当
又有其它进程需要调用该共享段时,由于该共享段已被调入内存,故此时无须再为该段分配内存,而只需在调用进程的段表中增加一表项,填写该共享段的物理地址;以及在共享段的段表中,填上调用进程的进程名、存取控制等,再执行 count = count+1 操作。
2)共享段的回收。
当共享此段的某进程不再需要该段时,应将该段释放,包括撤消在该进程段表中共享
段所对应的表项,以及执行 count = count-1 操作。若结果为 0,表明此时已没有进程在使用该段,则须由系统回收该共享段的物理内存,以及取消在共享段表中当前调用进程所对应的表项。否则(减 1 结果不为 0),只是取消调用者进程在共享段表中的有关记录。
3.分段保护
1)越界检查。
越界检查时利用地址变换机构来完成的。①短号和段表长度的比较。②段内地址和段长的比较。
2)存取控制检查。
存取控制检查是以段为基本单位进行的。在段表的每个表项中都设置了一个“存取控制”字段,用于规定对该段的访问方式。对于共享段而言,存取控制就显得尤为重要。
3)环保护机构。
这是一种功能较完善的保护机制。在该机制中规定:低编号的环具有高优先权。OS 核心处于 0 环内;某些重要的实用程序和操作系统服务占居中间环;而一般的应用程序则被安排在外环上。在环系统中,程序的访问和调用应遵循以下规则:
1)一个程序可以访问驻留在相同环或较低特权环中(较之编号高的环)的数据。类似于读。
2)一个程序可以调用驻留在相同环或较高特权环中(较之编号低的环)的服务。类似于执行。
————————————————