在為進程分配內存時,將涉及到三個問題:第一,為保證進程能正常運行,所需要的最小物理快數的確定;第二,在為每個進程分配物理塊時,應采取什么樣的分配策略,即所分配的物理塊是固定的,還是可變的;第三,為不同進程所分配的物理塊數是采取平均分配算法,還是根據進程的大小按比例分配。
先來介紹幾個概念:
所謂固定分配,是指為每個進程分配一組固定數目的物理塊,在進程運行期間不再改變。
所謂局部置換,是指如果進程在運行中發現缺頁,則只能從分配給該進程的n個頁面中選出一頁換出,然后再調入下一頁,以保證分配給該進程的內存空間不變。
所謂可變分配,是指先為每個進程分配一定數目的物理塊,在進程運行期間,可根據情況做適當的增加或減少。
所謂全局置換,是指如果進程在運行中發現缺頁,則 將OS所保留的空閑物理塊(一般組織為一個空閑物理塊隊列)取出一塊分配給該進程,或者以所有進程的全部物理塊為標的,選擇一塊換出,然后將所缺之頁調 入。這樣,分配給該進程的內存空間就隨之增加。
在這里,我撇開第一和第三這兩個問題不談,我們來重點說說第二個內存分配策略的問題。
在請求分頁系統中,可采取兩種內存分配策略,即固定和可變分配策略。在進行置換時,也可以采取兩種策略,即全局置換和局部置換。於是,可組合出以下三種適用的策咯(其實這也是我為什么要寫這篇文章的原因)。
1)固定分配局部置換(Fixed Allocation,Local Replacement)
采用該策略時,為每個進程分配多少物理塊是根據進程類型(交互型或批處理型等)或者根據程序員、程序管理員的建議來確定的。
實現這種策略的困難在於:應為每個進程分配多少個物理塊難以確定。若太少,會頻繁地出現缺頁中段,降低系統吞吐量。若太多,又必然會使內存中駐留的進程數目減少,進而可能造成CPU空閑或者其他資源空閑的情況,而且在實現進程對換時,會花費更多的時間。
2)可變分配全局置換(Variable Allocation,Global Replacement)
可變分配全局置換這可能是最易於實現的一種物理塊分配和置換策略,已用於若干個OS中。在采用這種策略時,凡產生缺頁(中斷)的進程,都將獲得新的物理塊,僅當空閑物理塊隊列中的物理塊用完時,OS才能從內存中選擇一頁調出。被選擇調出的頁可能是系統中任何一個進程中的頁,因此這個被選中的進程擁有的物理塊會減少,這將導致其缺頁率增加。
3)可變分配局部置換(Variable Allocation,Local Replacement)
該策略同樣是基於進程的類型或者是根據程序員的要求,為每個進程分配一定數目的物理塊,但當某進程發現缺頁時,只允許從該進程在內存的頁面中選擇一頁換出,這樣就不會影響其它進程的運行。如果進程在運行中頻繁地發生缺頁中斷,則系統再為該進程分配若干附加物理塊,直至該進程的缺頁率減少到適當程度為止。反之,若一個進程在運行過程中缺頁率特別低,則此時可適當減少分配給該進程的物理塊數,但不應引起其缺頁率的明顯增加。
看到這里,你可能會發現,以上只有三種分配置換策略,按理應該有四種,是不是還差固定分配全局置換(Fixed Allocation,Global Replacement)?
同樣,看到這里我也想了一下,為什么沒有第四種搭配。我也在尋找答案,期待我找到答案吧!
