【操作系統】分頁系統中的局部分配策略與全局分配策略

如圖3-23a所示,三個進程A、B、C構成了可運行進程的集合。假如A發生了缺頁中斷,頁面置換算法在尋找最近最少使用的頁面時是隻考慮分配給A的6個頁面呢?還是考慮所有在內存中的頁面?如果只考慮分配給A的頁面,生存時間值最小的頁面是A5,於是將得到圖3-23b所示的狀態。

在這裏插入圖片描述

另一方面,如果淘汰內存中生存時間值最小的頁面,而不管它屬於哪個進程,則將選中頁面B3,於是將得到圖3-23c所示的情況。圖3-23b的算法被稱爲局部(local)頁面置換算法,而圖3-23c被稱爲全局(global)頁面置換算法。局部算法可以有效地爲每個進程分配固定的內存片段。全局算法在可運行進程之間動態地分配頁框,因此分配給各個進程的頁框數是隨時間變化的。

全局算法在通常情況下工作得比局部算法好,當工作集的大小隨進程運行時間發生變化時這種現象更加明顯。若使用局部算法,即使有大量的空閒頁框存在,工作集的增長也會導致顛簸。如果工作集縮小了,局部算法又會浪費內存。在使用全局算法時,系統必須不停地確定應該給每個進程分配多少頁框。一種方法是監測工作集的大小,工作集大小由“老化”位指出,但這個方法並不能防止顛簸。因爲工作集的大小可能在幾微秒內就會發生改變,而老化位卻要經歷一定的時鐘滴答數纔會發生變化。

另一種途徑是使用一個爲進程分配頁框的算法。其中一種方法是定期確定進程運行的數目併爲它們分配相等的份額。例如,在有12 416個有效(即未被操作系統使用的)頁框和10個進程時,每個進程將獲得1241個頁框,剩下的6個被放入到一個公用池中,當發生缺頁中斷時可以使用這些頁面。

這個算法看起來好像很公平,但是給一個10KB的進程和一個300KB的進程分配同樣大小的內存塊是很不合理的。可以採用按照進程大小的比例來爲它們分配相應數目的頁面的方法來取代上一種方法, 這樣300KB的進程將得到10KB進程30倍的份額。比較明智的一個可行的做法是對每個進程都規定一個最小的頁框數,這樣不論多麼小的進程都可以運行。例如,在某些機器上,一條兩個操作數的指令會需要多達6個頁面,因爲指令自身、源操作數和目的操作數可能會跨越頁面邊界,若只給一條這樣的指令分配了5個頁面,則包含這樣的指令的程序根本無法運行。

如果使用全局算法,根據進程的大小按比例爲其分配頁面也是可能的,但是該分配必須在程序運行時動態更新。管理內存動態分配的一種方法是使用PFF(Page Fault Frequency,缺頁中斷率)算法。它指出了何時增加或減少分配給一個進程的頁面,但卻完全沒有說明在發生缺頁中斷時應該替換掉哪一個頁面,它僅僅控制分配集的大小。

正如我們上面討論過的,有一大類頁面置換算法(包括LRU在內),缺頁中斷率都會隨着分配的頁面的增加而降低,這是PFF背後的假定。這一性質在以下圖中說明。

在這裏插入圖片描述
測量缺頁中斷率的方法是直截了當的:計算每秒的缺頁中斷數,可能也會將過去數秒的情況做連續平均。一個簡單的方法是將當前這一秒的值加到當前的連續平均值上然後除以2。虛線A對應於一個高得不可接受的缺頁中斷率,虛線B則對應於一個低得可以假設進程擁有過多內存的缺頁中斷率。在這種情況下,可能會從該進程的資源中剝奪部分頁框。這樣,PFF盡力讓每個進程的缺頁中斷率控制在可接受的範圍內。

值得注意的是,一些頁面置換算法既適用於局部置換算法,又適用於全局置換算法。例如,FIFO能夠將所有內存中最老的頁面置換掉(全局算法),也能將當前進程的頁面中最老的替換掉(局部算法)。相似地,LRU或是一些類似算法能夠將所有內存中最近最少訪問的頁框替換掉(全局算法),或是將當前進程中最近最少使用的頁框替換掉(局部算法)。在某些情況下,選擇局部策略還是全局策略是與頁面置換算法無關的。

另一方面,對於其他的頁面置換算法,只有採用局部策略纔有意義。特別是工作集和WSClock算法是針對某些特定進程的而且必須應用在這些進程的上下文中。實際上沒有針對整個機器的工作集,並且試圖使用所有工作集的並集作爲機器的工作集可能會丟失一些局部特性,這樣算法就不能得到好的性能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章