?我们根据前面知道,进程在运行的时候没有必要将其所有页面调入内存,因此操作系统必须决定要把进程的多少页调入到内存中。于是考虑以下因素:

1. 分配进程给进程的存储块数越少,驻留在内存中的进程数就越多

2. 进程在内存中所分得的存储块数越少,缺页率也就越高。

3. 进程在内存中块数达到一定数量后,根据局部性原理,即使给再多的存储块,那么进程的缺页率也不会有明显的改善。

所以怎么给进程分配合理的存储块数是一个难题。目前有两种方式:

(1)固定分配方式:在内存中为进程分配固定存储块数,在进程创建的时候就已经确定,其数量由操作员的经验确定。在进程运行后,只要缺页了就进行换出。但是进程在内存中的存储块数是不变的

(2)可变分区方式:指分配给进程的存储块数在进程的生命周期内不断发生变化,如果某个进程缺页率较高,那么就额外再为其分配一些存储块,反之减少其分配的存储块。但是这对进程的行为随时进行评估,势必会造成系统的额外开销

除此之外,怎样对存储块内的页面进行换入换出,又是一个要考虑的问题。(这里分清楚,页面置换演算法是怎么置换的过程,而换入换出策略,考虑的是何时,何处换出

常见的方式有:

1. 固定分配,局部置换。局部置换,是指在缺页所在的进程当中(也就是所分配给进程的内存块范围内)中选择一页置换出去,但是其难点依旧是给进程分配多少块存储块的问题,太少了,缺页率太高,太多了,并发程度会降低。

2. 可变分区,全局置换。这是最容易实现的一种方式。操作系统维护著一个空闲存储块队列,进程如果发生缺页,就从空闲的存储块中存选一块分配给进程(即凡是缺页的进程,都获得新的存储块)。只有当队列用完的是,才进行换出操作,而该页有可能任意进程中的任意一页。 但是这种做法也存在弊端,如果盲目的给进程分配空间,那将会导致并发能力下降。同时会导致其他后面的进程在内存中的存储块数降低,缺页率上升。

3. 可变分区,局部置换。这种做法,只允许从本进程的内存块中取出,这样一个进程的行为并不会影响其他的进程。但是这种方式的关键在于:如何确定驻留集的大小,以及确定驻留的变化。

驻留集

驻留集,又称工作集合,是指在某段时间内,进程要访问的页面的集合。把某个进程在时间t的驻留集记为W(t,△)。其中,△代表的是驻留集的窗口大小。 正确选择△,对存储器的有效利用和提高操作系统的吞吐量有重要的影响作用,若△太大,进程虽然不会缺页,但是如果大到把整个进程都装进去了,也就失去了虚拟存储的意义,内存也得不到充分的利用。如果太小,那么进程所需要的驻留集也不能装入内存,频繁产生缺页中断。

如上图所示,所以我们一般取△为曲线的拐点处。

抖动

多道程序环境中,应该尽量提高系统的吞吐量,即提高道数。但是如果盲目的提高道数,反而会使得操作系统吐吞量降低,因为内存中进程过多,将出现抖动现象。下图为CPU利用率随程序道数的增加而变换的曲线图:

所谓抖动,是指进程大多数时间都用于页面的换入换出,而几乎不能完成任何有效的工作。(即T缺页 >T执行)。因为一旦调度程序发现CPU利用率降低,就会提高多道程序的道数,以提高CPU的利用率。为此引入更多进程进入内存,但是这样其他进程在内存的存储块数又会下降,从而加剧缺页情况,造成恶性膨胀,频繁换入换出。

那么如何预防抖动的发生?

1. 只有驻留集足够大的进程,才允许被执行。因此在确定每个进程驻留集大小时,便确定了进程数目。

2. 产生缺页的平均时间L = 系统处理缺页的平均时间S,此时毫无疑问,CPU利用率最高。

3. 操作系统采用可变策略时,尽可能采取局部置换,这样抖动的范围就局限在较小的地方了。

4. 道数偏高的时候,挂起一些进程。

页面的调入时机

  1. 何时调入? 请调:当进程在运行的过程中产生缺页的时候,调入主存。这种做法实现简单,但是容易出现抖动,因为容易产生缺页中断。 预调:预计进程要访问的页面。由局部性原理,每次调入时,也将相邻的若干页调入 (通常,将两者配合使用,缺页的时候,不仅调入所缺的页面,还调入其相邻的若干页)
  2. 何处调入? 从调换区调入 只将修改过的页放在对换区 首次从文件区调入,以后再次调入时,从对换区调入。

推荐阅读:

相关文章