操作系统理论知识:虚拟存储管理的软件方法

一、调页策略

调页策略用于决定何时将页面载入内存

两种常用的策略:

  • 请求调页(demand paging):只通过响应缺页中断调入需要的页面,也只调入发生缺页时所需要的页面。这种策略下进程开始运行时会有比较多的缺页,对外存I/O交换次数多,开销比较大。(一次I/O操作包括旋转等待时间(磁头到达目的块的第一个扇区所需的时间)和读写时间(CPU等待数据从存储器读出或写入的时间))
  • 预先调页(prepaging):在发生缺页需要调入某页时顺便调入该页相邻的几个页。但该策略无法保证效率提高,因为额外装入的页面可能没有用。

二、放置策略

放置策略用于决定进程各部分要驻留在内存的哪个位置

该策略对于纯段式系统比较有影响,对纯页式系统或段页式系统没有影响,因为地址转换硬件和内存访问硬件可以以相同的效率为任何页框组合执行它们的功能。

  • 首次适配(first fit)算法:从前端开始扫描内存,直到找到一个足够大的空闲区;(最好、最快)
  • 下次适配(next fit)算法:从上次分配结束的地方开始扫描内存,直到找到一个足够大的空闲区;
  • 最佳适配(best fit)算法:扫描整个内存,找出一个足够大的最小空闲区;(性能通常是最差的);

三、替换策略

当需要调入页面但内存已满时,替换策略决定要置换内存中的哪个页面

置换策略的一个约束是:内存中的某些页框是被锁定的,若页框被锁定则当前保存在该页框中的页不能被置换。大部分操作系统内核和重要的控制结构就保存在锁定的页框中。(通过给每个页框关联一个lock位实现)

基本的替换算法

  • 最优算法(OTP):置换内存中未来不再使用或者还要最长时间才会使用的那个页。这是效果最佳的算法,但显然是不可能实现的,只能作为衡量其他算法性能的标准。
  • 最近最少使用算法(LRU):淘汰内存中最长时间未使用的页面。根据局部性原理(指CPU访问存储器时,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小的连续区域中),这是最近最不可能访问到的页。性能最接近OTP。一种实现方法是给每一页添加一个最后一次访问的时间戳,并在每次访问内存时更新这个时间戳。(以下面所讲的链表形式去实现会比较好理解)
  • 先进先出算法(FIFO):淘汰内存中最早建立的页面(置换驻留在内存中时间最长的页)。可以以队列的形式表示,那么队首的页就是将会被淘汰的页。但这种算法性能较差,因为较早调入的页往往是经常要被访问的,这些页在FIFO算法下被反复调入调出会造成较大的开销。而且可能会造成抖动现象(进程运行过程中频繁产生缺页中断)。
  • 时钟算法(Clock):采用环形链表实现,需要一个移动指针。每一页关联一个使用位,在页装入内存和被访问时使用位置1。用于置换的候选页框集合被视为一个循环缓冲区,并且用一个指针与之关联。当一页被置换(或者仅仅是被换入到一个空页框)时,该指针被设置成指向缓冲区的下一个页框。在选取置换的页框时,操作系统扫描缓冲区(移动指针),每遇到一个使用位为1的页框就将该位置0,直到遇到一个使用位为0的页框则选择该页框置换。(移动指针的两种情况:第一是在操作系统在扫描使用位为0的页时移动,第二是页面置换后指针移到下一个页框;如果当前指针指向的页被访问则不需要移动(即没有缺页中断就不需要移动))

LRU算法的其他实现方式

  • 链表形式每次内存访问后在链表中找到对应的页面,把该页面移到表头,因此表尾的就是最久未使用的页
  • 硬件形式:采用移位计数器,每个页关联一个计数器,每执行一条指令计数器的高位置1,每隔时间T计数器右移一位。每次内存访问后将当前计数器的值写到相应的页表表项里,计数器的值最小的那一页就是最久未使用的页。

Belady现象

FIFO算法可能造成Belady现象:在分页式虚拟存储器管理中,缺页置换算法采用FIFO算法时,如果对一个进程未分配它所要求的全部页面,有时就会出现分配的页面数增多但缺页率反而提高的异常现象

各算法应用的简单例子

一个进程有5个页,OS规定每个进程最多占有3个页面。(其中“*”表示使用位为1)

各算法比较:

四、驻留集管理

驻留集(resident set)

指虚拟页式存储管理中给进程分配的物理页面(页框)的集合,驻留集大小即是这个集合的页框数。

驻留集大小与系统效率

  • 每个进程的驻留集越小,则同时驻留内存的进程就越多,CPU利用率越高。
  • 进程的驻留集太小的话则缺页率高,使调页的开销增大。
  • 给特定进程分配的内存空间超过一定大小后,由于局部性原理,该进程的缺页率没有明显变化。

管理策略

固定分配:在执行过程中进程的驻留集大小固定。

  • 各个进程的驻留集大小在进程创建时决定。(可以根据进程类型,或者由程序员、系统管理员决定)
  • 替换页面时从各自的驻留集中选择

可变分配:在执行过程中进程的驻留集大小可变。

  • 若一个进程的缺页率一直比较高,表明在该进程中局部性原理表现得比较弱,应该给它多分配一些页框以减小缺页率;
  • 若一个进程的缺页率特别低,则可以在不会明显增加缺页率的前提下减少分配给它的页框。
  • 要求操作系统评估活动进程的行为(评估缺页率),增加了操作系统的软件开销。

替换范围

  • 全局替换:内存中任意非锁定的页面均可以被替换;
  • 局部替换:被替换的页面局限在缺页进程的驻留集(固定分配方式的替换范围)

五、工作集

工作集是一个进程执行过程中某段时间内所访问的页的集合。引入工作集的目的是依据进程在过去的一段时间内访问的页来调整驻留集大小

工作集可以用一个二元函数W(t,▲)表示,t是执行时刻,▲是一个虚拟时间段(进程实际执行时间,不包括阻塞时间),称为窗口大小。工作集就是在[t-▲,t]这一虚拟时间段内所访问的页的集合,|W(t,▲)|指工作集大小,即页数目。

工作集策略

利用工作集来进行驻留集调整的策略:

  • 记录一个进程的工作集变化;
  • 定期删除驻留集中不在工作集中的页面
  • 驻留集总是包含工作集(无法包含时则需要增大驻留集);

六、清除策略

决定何时将已经修改的页面调出到外存上。

两种常用的策略:

  • 请求清除(demand cleaning):页面在被置换时才写入外存,即写回一个被修改的页和读入一个新页是成对出现的,并且写回在读入之前,这要求缺页中断发生时必须等待两次页传送,可能会降低处理器的利用率。
  • 预先清除(precleaning):页面在被置换之前就已经被调出到外存。即一个被写回到外存的页可能仍然留在内存中直到它被移出。

七、负载控制

决定内存中同时驻留的进程数目。进程数目太少则通常所有进程可能都处于阻塞状态,导致CPU空闲时间过多;太多则每个进程的驻留集太小,因此缺页频繁发生,导致“抖动”现象——页面置换频率非常高的现象。

 

 

 

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值