挑戰408——操作系統(24)——存儲系統的性能分析

我們根據前面知道,進程在運行的時候沒有必要將其所有頁面調入內存,因此操作系統必須決定要把進程的多少頁調入到內存中。於是考慮以下因素:

  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. 何處調入?
    從調換區調入
    只將修改過的頁放在對換區
    首次從文件區調入,以後再次調入時,從對換區調入。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章