傳統存儲管理方式的不足
- 一次性:作業必須一次性全部裝入內存后才能開始運行。這會造成:當作也很大時不能全部裝入內存;當大量作業要求運行時,由于內存無法容納所有作業,因此只有少量作業能夠運行,導致多道程序并發度下降
- 駐留性:一旦作業被裝入內存,就會一直留駐在內存中,直至作業運行結束。導致內存中駐留大量的、暫時用不到的數據,浪費了寶貴的內存資源。
局部性原理
- 時間局部性:如果執行了程序中的某條指令,那么不久后這條指令很可能再次執行;如果某個數據被訪問過,那么這個數據很可能再次被訪問
- 空間局部性:一旦程序訪問了某個存儲單元,在不久之后,其附近的存儲單元也很有可能被訪問。
高速緩沖技術的思想:將近期會頻繁訪問到的數據放到更告訴的存儲器中,暫時用不到的數據放在更低速存儲器中。
快表機構就是將近期長訪問的頁表項副本放到更高速的聯想寄存器中。
虛擬內存
由于局部性原理,在程序裝入時,可以將程序中很快用到的部分裝入內存,暫時用不到的部分留在外存,就可以讓程序開始執行。在程序執行過程中,當訪問的信息不在內存時,由操作系統負責將所需信息從外存調入內存,然后繼續執行程序。若內存空間不夠,由操作系統負責將內存中暫時用不到的信息換出外存。
在操作系統的管理下,在用戶看來似乎有一個比實際內存大得多的內存,這就是虛擬內存。(操作系統虛擬性的體現)
虛擬內存的最大容量是由計算機的地址結構(CPU尋址范圍)確定的
虛擬內存的實際容量=min(內存和外存容量之和,CPU尋址范圍)
主要特征:
- 多次性:允許多次裝入
- 對換性:允許作業運行過程中將作業換入換出
- 虛擬性:使得用戶看到的內存容量大于實際容量
主要區別:如果訪問的信息不再內存時,有操作系統將所需信息從外存調入內存(請求調頁/段)
如果內存空間不夠,由操作系統負責將內存中暫時用不到的信息換到外存(頁面/段置換)
請求分頁管理方式
請求調頁:操作系統需要知道每個頁面是否已經調入內存;如果沒有調入,需要知道該頁面在外存存放的位置
頁面置換:根據某些指標來決定換出哪些頁面,有的頁面沒有被修改過,就不用再浪費時間寫回外存。有的頁面修改過,就需要將外存中就數據覆蓋,因此操作系統需要記錄各個頁面是否被修改的信息。
缺頁中斷機構
在請求分頁系統中,每當要訪問的頁面不再內存時,便產生一個缺頁中斷,然后由操作系統的缺頁中斷處理程序處理中斷。此時缺頁的進程阻塞,放入阻塞隊列,調頁完成后再將其喚醒,放回就緒隊列。
如果內存中有空閑塊,則為進程分配一個空閑塊,將所缺頁面裝入該塊,并修改頁表中相應的頁表項。
如果內存中沒有空閑塊,則由頁面置換算法選擇一個頁面淘汰,若該頁面在內存期間被修改過,則要將其寫回外存。未修改過的頁面不用寫回外存。
缺頁中斷是因為當前執行的指令想要訪問的目標頁面未調入內存而產生的,因此屬于內中斷。
一條指令在執行期間可能產生多次缺頁中斷
地址變換
請求分頁存儲管理與基本分頁存儲管理的區別:
新增步驟1:請求調頁(查到頁表項時進行判斷)
新增步驟2:頁面置換(需要調入頁面,但沒有空閑內存塊時)
新增步驟3:需要修改請求頁表中新增的表項
- 只有寫指令才需要修改修改位。并且,一般來說只需要修改快表中的數據,只有要將快表想刪除時才需要寫回內存中的慢表,這樣就可以減少訪存次數。
- 和普通的中斷處理一樣,卻也中斷處理依然需要保留CPU現場
- 頁面換入/換出都要啟動慢速的I/O操作
- 頁面調入內存后,需要修改慢表,同時也需要將表項復制到快表中
頁面置換算法
最佳置換算法(OPT)
每次選擇淘汰的頁面將時以后永不使用或者在最長時間內不再被訪問的頁面,這樣可以保證最低的缺頁率。
注意:缺頁時未必發生頁面置換,若還有可用的空閑內存塊,就不用進行頁面置換
缺頁率=缺頁中斷次數/頁面訪問次數
只有沒有空閑內存塊的缺頁中斷才需要頁面置換
理想化算法,實際無法實現
先進先出置換算法(FIFO)
每次選擇淘汰的頁面是最早進入內存的頁面
把調入內存的頁面根據調入的先后順序排成一個隊列,需要換出頁面時選擇隊頭,將新頁面放入隊尾
Belady異常:當為進程分配的物理塊數增大時,缺頁次數不減反增的異常現象。
只有FIFO算法會產生Belady異常。
最近最久未使用置換算法(LRU)
每次淘汰的頁面是最近最久未使用的頁面
實現方法:在每個頁面對應的頁表項中,用訪問字段記錄該頁面自從上次被訪問以來經歷的時間t,當需要 淘汰一個頁面時,選擇現有頁面中t中最大的,即最近最久未使用的頁面
算法性能好,實現困難,開銷大
性能最接近OPT
時鐘置換算法(CLOCK)
是一種性能和開銷較均衡的算法,又稱作CLOCK算法,或最近未使用算法(NRU not recently used)
簡單CLOCK算法實現:為每個頁面設置一個訪問位(1,表示最近訪問,0,表示最近沒有訪問),再講內存中的頁面都通過鏈接指針鏈接成一個循環隊列。當某頁被訪問時,其訪問位置為1。當需要淘汰一個頁面時,只需要檢查頁的訪問位,如果時0,就將該頁換出;如果是1,則將它置為0,暫不換出,繼續檢查下一個頁面。若第一輪掃面中所有頁面都是1,則將這些頁面的訪問位依次置為0后再進行第二次掃描。
簡單CLOCK算法選擇一個淘汰頁面最多會經過兩次掃描。
改進型的時鐘置換算法:簡單時鐘置換算法僅僅考慮一個頁面最近是否被訪問,事實上,如果被淘汰的頁面沒有被修改過,就不需要執行I/O操作寫回外存。只有被淘汰的頁面被修改過時才需要寫回外存。
因此考慮一個頁面最近有沒有被訪問過之外,操作系統還應該考慮頁面有沒有被修改過。在其他條件都相同時,應優先淘汰沒有修改過的頁面,避免I/O操作。
實現:設置修改位,0表示沒有被修改,1表示被修改。
(訪問位,修改位)
算法規則:
將所有可能被置換的頁面排成一個循環隊列
- 從當前位置開始掃描第一個(0,0)的幀用于替換,不修改任何標志位
- 如果第一輪掃描失敗,則重新掃描。查找第一個(0,1)的幀用于替換,本輪將所有掃描過的幀訪問位設為0
- 如果第二輪掃描失敗,則重新掃描,查找第一個(0,0)的幀用于替換,本輪掃描不修改任何標志位
- 若第三輪掃描失敗,則重新掃描,找到第一個(0,1)的幀用于替換。
由于第二輪已經將所有幀的訪問位設置為0,因此經過第三輪第四輪掃描一定會有一個幀被選中,因此改進型CLOCK置換算法選擇一個淘汰頁面最多會進行四次掃描
頁面分配置換策略
駐留集:請求分頁管理中給進程分配的物理塊的集合
在采用了虛擬存儲的系統中,駐留集大小一般小于進程的總大小
如果駐留集太小,則會頻繁缺頁,系統要花大量的時間處理缺頁,實際用于進程推進的時間很少
駐留集太大,會導致多道程序并發度下降,資源利用率降低。
-
固定分配:操作系統為每個進程分配一組固定數目的物理塊,在進程運行期間不再改變。
-
可變分配:纖維每個進程分配一定數目的物理塊,在進程運行期間可根據情況做適當的增加或者減少,即,駐留集大小可變
-
局部置換:發生缺頁時只能選進程自己的物理塊進行置換
-
全局置換:可以將操作系統保留的空閑物理塊分配給卻也進程,也可以將別的進程持有的物理塊置換到外存,再分缺頁進程。
-
固定分配局部置換:缺點:很難在剛開始就確定為每個進程分配多少個物理塊才算合適。采用這種策略的系統一般會根據一定的參數確定內存塊
-
可變分配全局置換:只要某進程發生缺頁,都能獲得新的物理塊,僅當空閑物理塊用完時,系統才選擇一個未鎖定的頁面調出。被選擇調出的頁面可能是系統中任何一個進程中的頁,因此這個被選中的進程擁有的物理塊會減少,缺頁率會增加。
系統會鎖定一些頁面,這些頁面中的內容不能置換出去。 -
可變分配局部置換:如果進程在運行中頻繁地換頁,系統回味該進程多分配幾個物理塊,直至該進程缺頁率趨勢適當程度。反之,如果進程在運行時缺頁率特別低,可適當減少分配給該進程的內存塊。
可變分配全局置換:只要就分配新物理塊
可變分配局部置換:根據缺頁率動態增加或者減少物理塊
調入頁面
時間
- 預調頁策略:根據局部性原理,一次調入若干個相鄰的頁面可能比一次調入一個頁面更加高效。預測不久之后可能要訪問的頁面,將他們預先調入內存。預測成功率只有50%。這種策略主要用于進程的首次進入。
- 請求調頁策略:進程在運行期間發現缺頁才將所缺頁面調入內存。這種策略調入的頁面一定會被訪問到。但是每次都只能調入一頁,而每次調頁都要磁盤I/O操作,因此I/O開銷較大
地點
- 如果系統擁有足夠的調換去空間,頁面的調入調出都是內存與對換區之間進行的,這樣可以保證頁面的調入調出速度很快。在進程運行前,需要講進程相關的數據從內存區復制到對換區。
- 如果系統缺少足夠的對換區空間:凡是不會被修改的數據都直接從文件區調入,由于這些頁面不會被修改,因此換出時不需要寫回磁盤,下次需要時再從文件區調入即可。對于可能被修改的部分,換出時需要寫回磁盤對換區,下次需要時再從對換區調入。
- UNIX:運行之前進程有關的數據全部放在文件區,故未使用過的頁面都可以從文件區調入。若被使用過的頁面需要換出,則寫回對換區,下次需要時再從對換區調入。
抖動(顛簸)現象
抖動現象是指在更換頁面時,如果被更換的頁面是一個很快再次訪問的頁面,則會頻繁地發生頁面調度,以至于調度頁面所需時間過長,系統效率急劇下降的現象。
解決策略:
- 有針對性地選擇更優秀的頁面置換算法以減少頁面替換策略失誤
- 掛起低優先級的進程,減少多道程序數量使得能夠增大駐留集,讓進程擁有更多的內存塊
- 給進程分配合適大小的內存塊。為了解決給進程分配多少個內存塊比較合適,可以使用Denning提出的 “工作集”的概念進行解決。首先操作系統根據窗口尺寸統計工作集的大小,然后讓駐留集的大小大于等于工作集的大小即可。與之相關的我們可以每次選擇一個不再工作集中的頁面進行淘汰。
- 使用L=S準則調節缺頁率,讓程序最大可能地并發處理,提高磁盤和處理機的利用率。
工作集
工作集:在某段時間間隔內,進程實際訪問頁面的集合
駐留集:請求分頁存儲管理中給進程分配的內存塊的集合
一般來說駐留集的大小不能小于工作集的大小,否則進程運行過程中將會頻繁缺頁
拓展:基于局部性原理可知,進程在一段時間內訪問的頁面與不久之后訪問的頁面是有相關性的。因此可以根據近期訪問的頁面集合來設計頁面置換算法:選擇一個不再工作集中的頁面進行淘汰