前言
本文是内存的最后一篇内容,主要介绍页面的分配策略。
本文内容
1 页面分配、置换策略
1.1 驻留集
驻留集:指请求分页存储管理中给进程分配的物理内存块的集合。
在采用了虚拟存储技术的系统中,驻留集大小一般小于进程的总大小。
考虑以下两种极端情况,若某进程共有100个页面,则该进程的驻留集为100时,进程可以全部放入内存,运行期间不可能再发生缺页。若驻留集的大小为1,则进程在运行期间必定会极频繁的缺页。
所以,如果驻留集太小,会导致缺页频繁,系统要花大量的时间来处理缺页,实际用于进程推进的时间很少。若驻留集太大,又会导致多道程序并发度下降,资源利用率降低。所以应该选择一个合适的驻留集大小。
1.2 两种分配方式
根据操作系统为进程分配的内存块是否固定可以分为:固定分配和可变分配两种。
(1) 固定分配:操作系统为每个进程分配一组固定数组的物理块,在进程运行期间不再改变。即驻留集大小不变。
(2) 可变分配:先为每个进程分配一定数目的物理块,在进程运行期间,可根据情况做适当的增加或减少。即驻留集大小可变。
1.3 两种置换方式
根据缺页置换时是否只从自己的页面中选择页面置换可以将置换分为:局部置换和全局置换。
(1) 局部置换:发生缺页时只能选进程自己的物理块进行置换。
(2) 全局置换:可以将操作系统保留的空闲物理块分配给缺页的进程,也可以将别的进程保持有的物理块置换到外存,再分配给缺页进程。
1.4 分配置换策略
所以,组合以上两种策略,可以得到以下三种策略:固定分配局部置换、可变分配局部置换、可变分配全局置换。
注:没有固定分配全局置换这种策略,因为全局置换就意味着一个进程拥有的物理块数必然可以改变,因此不可能是固定分配。
1.4.1 固定分配局部置换
固定分配局部置换:系统为每个进程分配一定数量的物理块,在整个运行期间都不改变。若进程在运行过程中发生缺页,则只能从该进程在内存中的页面中选出一页换出,然后再调入需要的页面。
这种策略的缺点:很难在刚开始就确定应该为每个进程分配多少个物理块才算合理。(采用这种策略的系统可以根据进程大小、优先级、或是根据程序员给出的参数确定为一个进程分配的内存块数)
1.4.2 可变分配全局置换
可变分配全局置换:刚开始会为每个进程分配一定数量的物理块。操作系统会保持一个空闲物理块队列。当某个进程发生缺页时,从空闲的物理块中取出一块分配给该进程;若已无空闲物理块,则可选择一个未锁定(系统会锁定一些页面,这些页面中的内容不能置换出外存,如重要的内核数据)的页面换出外存,再将该物理块分配给缺页的进程。采用这种策略时,只要某进程发生缺页,都将获得新的物理块,仅当空闲块用完时,系统才选择一个未锁定的页面调出。被选择调出的页可能是系统中任何一个进程中的页,因此这个被选中的进程拥有的物理块会减少,缺页率会增加。
1.4.3 可变分配局部置换
可变分配局部置换:刚开始会为每个进程分配一定数量的物理块。当某进程发生缺页时,只允许从该进程自己的物理块中选出一个进行换出外存。如果进程中运行中频繁缺页,系统会为该进程多分配几个物理块,直至该进程缺页率趋势适当程度;反之,如果进程在运行中缺页率特别低,则可适当减少分配给该进程的物理块。
可变分配局部置换 vs 可变分配全局置换
可变分配全局置换:只要缺页就给分配新的物理块。
可变分配局部置换:要根据缺页的频率来动态地增加或减少进程物理块。
2 何时调入页面
根据页面调入的时机可以分为:预调页策略和请求调页策略。
预调页策略:根据局部性原理,一次调入若干个相邻的页面可能比一次调入一个页面更高效。但如果提前调入的页面中大多数都没有被访问过,则又是低效的。因此可以预测不久之后可能访问到的页面,将他们预先调入内存,但目前预测的成功率只有50&左右。
故这种策略主要用于进程的首次调入,由程序员指出应该先调入哪些部分。
请求调页策略:进程在运行期间缺页时才将所缺页面调入内存。由这种策略调入的页面一定会被访问到,但是由于每次只能调入一个页,而每次调页都要磁盘I/O操作,因此I/O开销大。
3 从何处调入页面
之前在内存管理一文中的交换技术中提到磁盘被分为文件区和对换区两种。
3.1 对换区空间充足
当系统拥足够的对换区空间:在进程运行前,需将进程相关的数据从文件区复制到对换区。页面的调入、调出都是在内存与对换区之间进行,这样可以保证页面的调入、调出的速度很快。
3.2 对换区空间不足
当系统缺少足够的对换区空间:凡是不会被修改的数据都直接从文件区调入,由于这些页面不会被修改,因此换出时不必写回磁盘,下次需要时再从文件区调入即可。对于可能被修改的部分,换出时需要写回磁盘对换区,下次需要时再从对换区调入。
3.3 UNIX的调入方式
运行前将进程有关的数据全部放在文件区,故未使用的过的页面都可以从文件区调入。若被使用过的页面需要换出,则写回对换区,下次需要时从对换区调入。
4 抖动现象
抖动(颠簸):指刚刚换出的页面马上又要被换入内存,刚刚换入的页面马上又要换出外存,这种频繁的页面调度行为。
原因:进程频繁访问的页面数大于可用的物理块数,即分配给进程物理块不够。
5 工作集(了解)
为进程分配的物理块太少,会使进程发生抖动现象。为进程分配物理块太多,又会降低系统整体的并发度,降低某些资源的利用。
为了研究为每个进程分配多少个物理块,提出了工作集的概念。
驻留集:指请求分页存储管理中给进程分配的内存块的集合。
工作集:指在某段时间间隔里,进程实际访问页面的集合。
操作系统会根据“窗口尺寸”来计算工作集。例如,某进程的页面访问序列如下,窗口尺寸为4,下面两个时刻的工作集如下图所示
如上图中,如果某时刻访问的是23号页,那么此时刻的页面和23号页再向前3个页面共4个页面(窗口尺寸大小)这4个页面不重复的页面数就是工作集。同理,当访问到的是17号页时,工作集18,24,17三个页面。
工作集大小可能小于窗口尺寸,实际应用中,操作系统可以统计进程的工作集大小,根据工作集大小给进程分配若干个内存块。如,窗口尺寸为5,经过一段时间监测发现某进程的工作集最大为3,那么说明该进程有很好的局部性,可以这个继承分配3个以上的内存块即可以满足进程的运行需要。
一般来说,驻留集的大小不能小于工作集的大小,否则进程运行过程中将频繁缺页。
6 小结
至此内存管理的全部内容已经结束,下面放一张内存管理的结构图。