💡整理不易,先赞后看,养成习惯💡
5.1 虚拟存储器概述
虚拟存储器引入
第四章所介绍的各种存储管理方式有一个共同的特点,即它们都要求将一个作业全部装入内存后方能运行。
于是,可能出现以下两种情况:
- 有的作业很大,其所要求的内存空间超过了内存总容量,作业不能全部被装入内存,致使该作业无法运行;
- 有大量作业要求运行,但由于内存容量不足以容纳所有这些作业,只能将少数作业装入内存让它们先运行,而将其它大量作业留在外存上等待。
简单来说,会出现作业大小超出内存容量的问题。
好比一个用于打包快递的工作台有2m2,一批快递需要的占用工作台的总面积是3m2。 按照传统的管理方式,如果需要打包这批快递就需要把这占用面积3m2的快递全部搬到工作台上,再打包。
解决内存容量的办法有以下两种:
物理上增加内存容量:但这往往受到机器自身的限制,而且无疑增加了系统成本,因此这种方法是受到一定限制的。
也就是扩大工作台的面积。
逻辑上扩充内存容量:这正是虚拟存储技术所要解决的问题。
可以理解为分批次打包快递,第一次可以先打包
2m2
的快递,然后再打包1m2
的快递,对于工作台来说,可以用面积不变,但是对于快递来说,可用面积就是3,这个面积可以算作虚拟面积,对应内存就是虚拟内存。
常规存储管理方式的特征和局部性原理
常规存储管理的特征
一次性(指全部装入)
快递需要一次性装上工作台
驻留性(指驻留在内存不换出)
每次上台之后,只能等到所有的快递处理完,才可以一起下工作台,中途不会换下来。
局部性原理
- 时间局部性:一条指令的一次执行和下次执行,一个数据的一次访问和下次访问都集中在一个较短时期内;
- 空间局部性:当前指令和邻近的几条指令,当前访问的数据和邻近的数据都集中在一个较小区域内。
造成局部性的原因在于:程序在执行时,大部分是顺序执行的指令,少部分是转移和过程调用指令。
虚拟存储器的基本工作情况
应用程序仅将当前要运行的少数页面或段调入内存便可运行,其余部分暂留在外存上,运行时如果出现所需访问的页/段尚未调入内存,则发出缺页/段请求,此时,OS利用请求调入功能将它们调入内存,如果此时内存已满,OS利用置换功能,将内存中不用的页/段调至外存。
先把一部分快递搬上工作台,有需要就从发出请求,把需要打包的快递再装上来,此时把已经打包好的或者暂时不需要打包的换下去。
虚拟存储器的定义和特征
定义
所谓的虚拟存储器,是指具有请求调入功能和置换功能,能从逻辑上对内存容量加以扩充的一种存储器系统。这样,可使一个大程序在小内存中运行。该系统具有的内存容量,将比实际大的多,这只是一种感觉,是虚的,故把这样的存储器称作虚拟存储器。
其实质:以时间换空间,但时间牺牲不大。
特征
- 多次性:指一个作业被分成多次调入内存运行,即在作业运行时没有必要将其全部装入,只须将当前要运行的那部分程序和数据装入内存即可。
- 对换性:指允许在作业的运行过程中在内存和外存的对换区之间换进、换出。
- 虚拟性:指能够从逻辑上扩充内存容量,使用户所看到的内存容量远大于实际内存容量。它是虚拟存储器最重要的特征。
- 离散性:部分装入,支持大作业小内存运行,若连续则不可能提供虚存
虚拟存储器的实现方法
请求分页系统
分页请求系统是在分页系统的基础上增加了请求调页功能和页面置换功能所形成的页式虚拟存储系统。
具体包括用于实现请求调页的软件和实现页面置换的软件。它们在硬件的支持下,将程序正在运行时所需的页面 (尚未在内存中的)调入内存,再将内存中暂时不用的页面从内存置换到磁盘上。
请求分段系统
请求分段系统是在分段系统的基础上增加了请求调段功能和分段置换功能所形成的段式虚拟存储系统。
具体包括用于实现请求调段的软件和实现分段置换的软件。它们在硬件的支持下,将程序正在运行时所需的分段 (尚未在内存中的)调入内存。相对于请求分段系统,因为请求分页系统换进和换出的进本单位是固定大小的页面,所以实现要容易些。
请求分页系统是通过固定大小的页来进行内存管理的,而请求分段系统则是将进程划分为几个不同大小的逻辑段来进行虚拟内存管理。二者的主要区别就在于内存分配的粒度和方式上不同。
5.2 请求分页存储管理方式
需要解决的问题
页号 | 物理块号 | 状态位P | 访问字段A | 修改位M | 外存地址 |
---|---|---|---|---|---|
- 页号:页面的唯一标识,用于指示进程所需页面的位置和大小。
- 物理块号:用来表示该页面实际存放在物理内存中的哪一个块中,即物理内存地址。
- 状态位P:用于表示这个页面是否在物理内存中已经准备好了,P=0时,表示尚未调入物理内存;P=1时,表示已在物理内存中。
- 访问字段A:记录页面最近被访问的时间戳或计数器等信息,用于辅助页替换算法,按照一定规则向外选择需要置换的页。
- 修改位M:表示该页面是否已经被修改过了。当M=0时,表示没有被修改过;M=1时,表示已经被修改过。
- 外存地址:将页面放置在磁盘上的相应虚拟页框的地址,当需要缺页处理时,再将外存地址读取到内存中。
这些字段共同组成了一页的数据结构,在于内存管理时,操作系统会根据硬件的许可值生成页表,记录与每个进程相关联的虚拟内存空间和物理内存空间之间的映射关系。操作系统会检查页表,并通过页表查找每个逻辑地址所对应的物理地址,并将其转换为实际的物理页框。通过这种方式,请求分页系统能够实现虚拟内存管理和进程间保护。
缺页中断机构
在请求分页系统中,每当所要访问的页面不在内存时,便要产生一缺页中断,请求OS将所缺页调入内存。缺页中断是一种特殊的中断,与一般中断的主要区别在于:
- 缺页中断在指令执行期间产生和处理中断信号,而一般中断在一条指令执行完后检查和处理中断信号。所缺的页面调入之后,重新执行被中断的指令。
- 一条指令在执行期间,可能产生多次缺页中断。
举个例子:
上面是一个完整的作业,总共分了6页
,这里作业的指令从字面上看就知道:把数据A
的值复制给B
。
假设此时需要向内存中载入这一条复制
指令,就需要执行2次
缺页中断,因为这一条指令占用了两个页面,所以内存对第1页
发出一个缺页中断,对第2页
发出一个缺页中断。
此时由于需要数据A
和B
,由于A
和B
又同时占据了两页,所以两个数据又触发了4次
缺页中断。
所以加载这一条指令,总共需要触发6次
缺页中断。
地址变换机构
请求分页中的内存分配
需要解决的问题
为保证进程能正常运行,所需要的最小物理块数的确定;
若系统为某进程所分配的物理块数少于此值时,进程将无法运行,这取决于指令的格式、功能和寻址方式。
在为每个进程分配物理块时,应采取什么样的分配策略,即所分配的物理块数是固定的还是可变的;
- 为不同进程所分配的物理块数,是采取平均分配算法,还是根据进程的大小按比例分配。
在请求分页系统中,可采取两种分配策略,固定和可变分配策略。
- 固定分配:固定分配是将内存分成若干个大小相同的区域,每一个进程都只能占用某个单位数量的连续内存空间。
- 可变分配:允许内存以更小的单元分配,在一个进程占用内存请求结束之后,它可以返回相应的空闲内存单元。
固定分配就是每一个作业分配到的内存块固定不变 可变分配对每个作业分配到的内存块可变
在进行置换时,也可采取两种策略,全局置换和局部置换。
- 全局置换:对于一个作业在内存中分配的内存块,一次性全部置换
- 局部置换:对于一个作业在内存中分配的内存块,部分进行置换
于是可组合成以下三种策略。
- 固定分配局部置换
- 可变分配全局置换
- 可变分配局部置换
固定分配局部置换
采用该策略的困难在于:应为每个进程分配多少个物理块难以确定。若太少,会频繁地出现缺页中断,降低系统吞吐量。若是太多,又必然是内存驻留进程数目较少,可能会造成CPU的空闲。物理块数目难以确定
- 太少:缺页中断频繁,吞吐量降低
- 太多:进程数目少,资源利用率低;进程对换耗时
可变分配全局置换
采用这种策略时,凡产生缺页中断的进程,都将获得新的物理块,仅当空闲物理块用完时,OS才从内存中选择一页调出,被选择调出的页可能是系统中任何一个进程中的页,因此,这个被选中的进程拥有的物理块会减少,导致缺页率增加。
可变分配局部置换
当某进程发现缺页时,只允许从该进程在内存的页面中选择一页换出,保证不影响其他进程的运行。如果频繁的发生缺页,系统再为该进程分配若干附加的物理块,直至缺页率减少到适当程度为止。
物理块分配算法
对于内存给每一个进程分配物理块个数,做如下约定:
n
:内存中的进程数m
:内存中的总的物理块数bi
:为进程i分配的最小物理块数Si
:为进程i的总的页面数
- 平均分配算法:
- 按进程大小比例分配算法:
- 请求调页策略:指当进程需要访问一个尚未调入物理内存的页面时,操作系统先检查该页面是否存在于内存中。如果页面已经在内存中,则操作系统将其映射到相应的虚拟地址上;如果不在内存中,则发出缺页中断,并将该页面从磁盘读入到内存中,然后更新页表,并重新开始执行进程代码。在这个过程中,只有当缺页中断发生时才会进行页面置换。
- 预调页策略:指当进程需要访问一个尚未调入物理内存的页面时,操作系统先检查该页面是否存在于内存中。如果页面已经在内存中,则操作系统将其映射到相应的虚拟地址上;如果不在内存中,则发出缺页中断,并将该页面从磁盘读入到内存中,然后更新页表,并重新开始执行进程代码。在这个过程中,只有当缺页中断发生时才会进行页面置换。
总结:请求调页就是需要了再调用页面,预调页就是一次调入可能需要的多个页。
何处调入页面
- 有足够大的对换区空间:全部从对换区调入所需页面,以提高调页速度。
- 缺少足够的对换空间:这时凡是不会被修改的文件,都直接从文件区调入;而当换出这些页面时,由于它们未被修改,不必重写入磁盘,以后再调入时,仍从文件区直接调入。
- UNIX方式: 在UNIX系统中,对于从未运行过的页面,都应从硬盘文件区调入;对于曾经运行过而又被换出的页面,可以从对换区调入;对于共享页面,该页面可能已由其它进程调入内存,此时就无须再从对换区调入。
页面调入过程
- 程序缺页时,发出一缺页中断请求,转入中断处理程序。
- 该程序查找页表,得到缺页在外存的物理块号;若内存有空间,则调入所缺页,并修改页表。
- 若内存已满,则按照某种置换算法从内存中选出一页换出,并调入所缺页,修改页表。
- 更新快表,利用修改后的页表,形成所访问的物理地址,再去访问内存数据。
💡缺页率
假设一个进程的逻辑空间为**n页**
,系统为其分配的物理块数为m(m<=n).如果在进程的运行中,访问页面成功的次数为**S**
,访问页面失败的次数为**F**
,则该进程总的页面访问次数为A=S+F,那么进程运行过程中的缺页率为:
f=F/A举个例子: 假设进程A总共有100页,其中访问成功页面次数是80次,访问失败次数是80次,那么缺页率就是
1/2
影响因素:
- 页面大小。页面划分较大,则缺页率较低;反之,缺页率较高。
- 进程所分配的物理块数。所分配的物理块数目越多,则缺页率越低;反之,缺页率越高。
- 页面置换算法。算法的优劣决定了进程执行过程中缺页中断的次数,因此缺页率是衡量页面置换算法的一个重要指标。
- 程序固有特性。程序本身的编制方法对缺页中断的次数有影响,根据程序执行的局部性原理,程序的局部化程度越高,相应执行时的缺页程度越低。
进程中的一页如果在内存中,就可以直接调用,如果不在内存中,就需要发送一个缺页请求,再从外存中调入,并且置换相应的物理块。假设:
- 被置换页面被修改的概率为
β
- 缺页中断处理时间为
ta
, 被置换页面未被修改的中断处理时间为
tb
那么缺页中断处理时间为:
t = βta + (1- β)tb
举个例子:现有一个请求调页系统,页表保存在寄存器中,访问页表的时间可忽略不计。处理一个缺页中断需要
**8ms**
,内存存取时间为**1μs**
,设定缺页率为**p**
,则系统的有效存储时间是多少?
这里分两种情况:缺页和不缺页
- 不缺页:
说明此时页面可以直接从内存中获得,所以直接花费1μs
从内存取页即可。由于查询页表的时间近似为0
,所以整体的时间就是:
(1-p)*(0 + 1μs)
- 缺页:
此时的页面不在内存中,所以需要触发缺页中断处理,但注意,缺页中断只把外存中的页面置换内存中的物理块,而不是直接调用外存中的页面,所以此时还需要从内存中再调用已经被置换过的物理块,那么整体时间为:
p*(0+8ms+0+1μs)
查表有两次,第一次查表没有查到,第二次是在页面置换结束之后再次查表,此时从内存调用。
总的时间就是缺页时间 + 不缺页时间。
再看一道题:
考虑一个请求调页系统,它采用全局置换策略和平均分配内存块的算法(若有m个内存块和n个进程,则每个进程分得m/n个内存块)。如果在该系统中测得如下的cpu和对换盘利用率,请问是否用增加多道程序的进程个数来增加cpu的利用率?为什么?
- CPU利用率为13%,物理块利用率为97%
- CPU利用率为13 %,物理块利用率为3%
- CPU利用率为87 %,物理块利用率为3%
在第一个案例中,CPU利用率为13%,物理块利用率为97%,这表示:
- CPU大部分时间处于空闲状态,利用率很低,只有13%的时间用于运行程序指令。
- 物理内存块利用率很高,达到97%,内存资源几乎被完全利用。
在这种情况下,增加多道程序进程的个数,只会导致更高的内存争用和页面置换,CPU利用率不会显著提高。因为CPU空闲时间很高,但可用内存资源很少,添加更多进程只会增加内存管理开销,无法有效占用CPU。
在第二个案例中,CPU利用率为13%,物理块利用率为3%,这表示:
- CPU大部分时间处于空闲状态,利用率很低,只有13%的时间用于运行程序指令。
- 物理内存块利用率很低,只有3%,内存资源利用效率不高。
在这种情况下,增加多道程序进程的个数,可以提高CPU利用率。因为CPU空闲时间很高,可用内存资源也充足,添加更多进程可以占用更多CPU执行时间,提高CPU利用效率。但如果增加过多,也会导致内存资源紧张,出现较高缺页率,所以进程数目增加需要适当控制。
第三个案例中,CPU利用率为87%,物理块利用率为3%,这表示:
- CPU大部分时间处于活动状态,利用率较高,有87%的时间用于运行程序指令。
- 物理内存块利用率很低,只有3%,内存资源利用效率不高。
在这种情况下,可以增加多道程序进程的个数。 由于内存充足,可以加载新的进程进入内存,提高并发度,并发度越高,系统资源利用率是越高
5.3 页面置换算法
页面置换算法是操作系统内存管理的一种算法,用于决定在内存空间不足的情况下,选择哪些内存页面置换出内存,以便为新的页面腾出空间。
如上图所示,假设内存中物理块只有三个,外存实际需要的页面有6页,一开始只能存入1-3
的页面,后面如果需要4页面
,就需要和内存中的物理块进行置换。
对于置换内存中的哪一个物理块就是由置换算法决定。不适当的算法可能会导致进程发生“抖动”:即刚被换出的页很快又被访问,需重新调入,导致系统频繁地更换页面。
最佳置换算法(Opt)
选择那些永不使用的,或者是在最长时间内不再被访问的页面置换出去。
举个例子:
假定系统为进程分配了三个物理块, 页面号引用序列为: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 | 0 | 1 |
---|---|---|
此时序列为:7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1。
下面就需要引入页面2
,此时在物理块中的三个页面分别是**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
置换出去,此时的物理块分配情况如下:
2 | 0 | 1 |
---|---|---|
这个时候引用序列:7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1。
需要引入0
,此时0
又在物理块中,所以无需置换,继续。
此时引用序列:7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1。
引入3
,同理查找并置换,这里就是需要置换1
:
2 | 0 | 3 |
---|---|---|
后续同理,不再赘述。
它是一种理想化的算法,性能最好,但难以实现。
因为需要确定哪一个页面是未来最长时间内不再被访问的,目前来说是很难估计的,所以该算法通常用来评价其它算法。
先进先出置换算法(FIFO)
该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。
还是用上述例子,引用序列:7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1。
最终的置换结果如下:
前三步还是正常按序引入即可,从第四步开始,每次替换当前物理块中最先被引入的页,比如第四步中替换最先被引入的7
。后续同理。
最近最久未使用置换算法(LRU)
算法描述
LRU算法是根据页面调入内存后的使用情况作出决策的。
该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间t。当需要淘汰一个页面时,选择现有页面中t值最大的,即最近最久未使用的页面淘汰。
同样的例子,引用序列: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
页面 | 访问字段 t |
---|---|
7 | 2 |
0 | 1 |
1 | 0 |
7
最大,所以替换7
,引用序列:7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1
页面 | 访问字段 t |
---|---|
2 | 0 |
0 | 2 |
1 | 1 |
0
在内存中,无需置换,引用序列:7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1
页面 | 访问字段 t |
---|---|
2 | 1 |
0 | 0 |
1 | 2 |
1
最大,页面3
和1
进行置换:
页面 | 访问字段 t |
---|---|
2 | 2 |
0 | 1 |
3 | 0 |
硬件支持
为了记录某进程在内存中各页的使用情况,须为每个在内存中的每个页面配置一个移位寄存器,可表示为:
当进程访问某物理块时,要将相应寄存器的**R****n-1**
位置为1。此时,定时信号每隔一定时间将寄存器右移一位。
举个例子,一开始进程需要访问页面7
,那么对于页面7
的寄存器中的R7
就会被置为1。
R**7** | R**6** | R**5** | R**4** | R**3** | R**2** | R**1** | R**0** | |
---|---|---|---|---|---|---|---|---|
7 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
接下来引入0
,那么对于页面0
的寄存器中的R7
置为1,于此同时7
的寄存器右移一位:
R**7** | R**6** | R**5** | R**4** | R**3** | R**2** | R**1** | R**0** | |
---|---|---|---|---|---|---|---|---|
7 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
接着就是1
:
R**7** | R**6** | R**5** | R**4** | R**3** | R**2** | R**1** | R**0** | |
---|---|---|---|---|---|---|---|---|
7 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
如果把寄存器的数看做是一个整数,那么具有最小数值的寄存器所对应的页面,就是最近最久未使用的页面。
那么接下来进程要访问页面2
的时候,就需要替换上表中最小的页面,也就是7
。
栈
除了可以使用硬件支持来记录最近最久未使用的页面,还可以使用软件的方式记录。
利用一个特殊的栈保存当前使用的各个页面的页面号。每当进程访问页面时,便将该页的页面号从栈中移出,将它压入栈顶。因此,栈顶始终是最新被访问页面的编号,而栈底则是最近最久未使用页面的页号。
最少使用置换算法(LFU)
为在内存的每个页面设置一个移位寄存器,用来记录该页面被访问的频率。该算法选择在最近时间使用最少的页面作为淘汰页。
具体而言,每次访问某页时,将该页移位寄存器的最高位置为1,每隔一定时间右移一次,这样,∑Ri
最小的页即为最近一段时间最少使用的页面。
Clock置换算法
基础算法
Clock算法就是一种LRU的近似算法。
LRU算法实现成本较高。
只需为每一页设置一位访问位,再将内存中所有页面通过链接指针链成一个循环队列。当某页被访问时,其访问位置为**1**
.算法在选择一页淘汰时,只需检查访问位:
- 如果为
**0**
,则选择该页换出 - 若为
**1**
,则重新将它置为0。继续检查下一页。
当最后一页访问位仍为1时,返回队首检查。
举个例子:
上面一圈都是处于内存中的物理块,此时指针指向Page 45
。(空白处省略了,实际上这个内存已经铺满页面)
如果此时想要引用Page 727
:
- 先访问
Page 45
,此时它的标志位use = 1
,所以不置换,令use = 0
,指针后移 - 再访问
Page 191
,此时它的标志位use = 1
,所以不置换,令use = 0
,指针后移 - 最后访问
Page 556
,此时它的标志位use = 0
,置换,指针后移,得到如下:
注意新引入的
Page 727
的use = 1
。
进阶算法
该算法除考虑页面的使用情况外,还增加了一个因素即置换代价。这样,选择页面换出时,既要是未使用过的页面,又要是未被修改过的页面。把同时满足两个条件的页面作为首选淘汰的页面。
由访问位**A**
和修改位**M**
可以组合成下面四种类型的页面。
- 1类(A=0, M=0):表示该页最近既未被访问, 又未被修改, 是最佳淘汰页。
- 2类(A=0, M=1):表示该页最近未被访问, 但已被修改, 并不是很好的淘汰页。
- 3类(A=1, M=0) :最近已被访问, 但未被修改, 该页有可能再被访问。
- 4类(A=1, M=1):最近已被访问且被修改, 该页可能再被访问。
整个算反执行有以下三步:
- 从指针所指示的当前位置开始,扫描循环队列,寻找A=0且M=0的第一类页面,将所遇到的一个页面选为淘汰页。在此期间不改变访问位A。
- 如果第一步失败,则开始第二轮扫描,寻找A=0且M=1的页面,把所遇到的一个页面选为淘汰页。在此期间将所有扫描过的页面访问位设置为0。
如果第二步也失败,则重复第一步。如果仍然失败,重复第二步,必能找到淘汰页。
页面缓冲算法(PBA)
影响页面换进换出的若干因素
页面置换算法
- 写回磁盘的频率
-
页面缓冲算法PBA
特点:
显著的降低了页面换进换出的频率,进而减少了系统开销。
- 可以采用简单的置换策略,不需特殊硬件支持,实现简单。
它是对FIFO算法的发展,通过被置换页面的缓冲,有机会找回刚被置换的页面;
5.4 抖动与工作集
多道程序度与“抖动”
多道程序度与处理机的利用率
在虚拟存储系统中,由于进程只需装入部分程序和数据即可运行,故人们希望在系统中运行更多的进程,即增加多道程序度,以提高处理机的利用率。
CPU的利用率与进程数目之间存在以下关系:
- 当进程数较少时,CPU利用率较低。因为CPU处于空闲状态的时间较长,等待进程使用CPU。
- 随着进程数目的增加,CPU利用率逐渐提高,因为CPU需要处理更多进程,空闲时间减少。
- 当进程数继续增加至一定数量后,CPU利用率会达到最大值。因为CPU的处理能力有限,无法同时处理过多进程,会导致部分进程等待,利用率不再提高。
产生抖动的原因
根本原因:同时在系统中运行的进程太多,由此分配给每个进程的物理块数太少,不能满足进程正常运行的需求,致使每个进程在运行时,频繁的发生缺页,必须请求系统将所缺之页调入内存。
还有一个原因是:页面淘汰算法不合理。工作集
工作集的基本概念
由图可以看出,进程分配的物理块数,应取在该曲线的拐点左右。
工作集的理论是在1968年由Denning提出来的。他认为,程序在运行时对页面的访问是不均匀的,即往往在某段时间内的访问仅局限于较少的若干个页面,如果能够预知程序在某段时间间隔内要访问哪些页面,并能将它们提前调入内存,将会大大地降低缺页率,从而减少置换工作,提高 CPU的利用率。工作集的定义
所谓工作集是指,在某段时间间隔
Δ
里,进程实际要访问的页面的集合。
把某进程在时间t的工作集记为w(t,Δ)
,把变量Δ
称为工作集“窗口尺寸”。
正确选择工作集窗口(Δ)的大小,对存储器的有效利用和系统吞吐量的提高,都将产生重要的影响。
抖动的预防方法
- 采取局部置换策略
当需要置换页面时,不必从全部内存页面中选择,而是只在进程当前工作集附近的页面中选择,这可以最大限度保留工作集,减少工作集变化,减轻抖动。
- 把工作集算法融入到处理机调度中
如果发现处理机的利用率不高,则在调度程序从外存调入作业之前,必须先检查每个进程在内存的驻留页面是否足够多。
- 利用“L=S”准则调节缺页率
L是缺页之间的平均时间,S是平均缺页服务时间,即用于置换一个页面所需的时间。利用“L=S”准则,对于调节缺页率是十分有效的。
- 选择暂停的进程
当多道程序度偏高时,已影响到处理机的利用率,为了防止发生“抖动”,系统必须减少多道程序的数目。