操作系統筆記--虛擬內存

段頁式管理方式

先分段再分頁
段號的位數決定了每個進程最多可以分爲幾個段,頁號的位數決定了每個段最大有多少頁,頁內偏移量決定了頁面大小,內存塊大小是多少

每個段對應一個段表項,每個段表項由段號,頁表長度,頁表存放塊號(頁表起始地址)組成,每個段表項長度相等,段號是隱藏的
每一個頁面對應一個頁表項,每個頁表項由頁號,頁面存放的內存塊號組成,每個頁表項長度相等,頁號是隱含的

虛擬內存

傳統存儲管理方式的缺點:
1.一次性:作業必須一次性全部裝入內存後才能開始運行,這會造成兩個問題1.作業很大時,不能全部裝入內存,導致大作業無法運行2.當大量作業要求運行時,由於內存無法容納所有作業,因此只有少量作業能運行,導致多道程序併發度下降
2.駐留性,一旦作業被裝入內存,就會一直駐留在內存中,直至作業運行結束,事實上,在一個時間段內,只需要訪問作業的一小部分數據即可正常運行,這就導致了內存中會駐留大量的暫時用不到的數據,浪費了內存

參考前面的時間局部性和空間局部性
基於局部性原理,在程序裝入時,可以將程序中很快會用到的部分裝入內存,暫時用不到的部分留在外存,就可以讓程序開始執行
在程序執行過程中,當訪問的信息不在內存時,由操作系統負責將所需信息從外存調入內存中然後繼續執行程序
若內存空間不夠時,由操作系統負責將內存中暫時用不到的信息交換到外存
在操作系統的管理下,在用戶看來似乎有一個比實際內存大的多的內存,這就是虛擬內存(邏輯上補充)
易混淆知識點:
虛擬內存的最大容量是由計算機的地址結構(CPU尋址範圍)確定的
虛擬內存的實際容量=min(內存和外存容量之和,CPU尋址範圍)

虛擬內存的三個主要特徵:
1.多次性:無需再作業運行時一次性全部裝入內存,而是允許被分成多次調入內存
2.對換性:在作業運行時無需一直常駐內存,而是允許在作業運行過程中,將作業換入換出
3.虛擬性:從邏輯上擴衝了內存的容量,使用戶看到的內存容量,遠大於實際的容量

虛擬內存的時限需要建立在離散分配的內存管理方式基礎之上(分頁,分段,段頁)
主要區別:在程序執行過程中,當所訪問的信息不在內存時,由操作系統將所需信息從外存調入內存,然後繼續執行程序(請求調頁,或調段)
若內存空間不夠,由操作系統負責將內存中暫時用不到的信息換出到外存(頁面置換,段置換)

請求分頁管理方式

在請求分頁系統中,每當要訪問的頁面不在內存時,便產生一個缺頁中斷,然後由操作系統的缺頁中斷處理程序處理中斷
此時缺頁的進程阻塞,放入阻塞隊列,調頁完成後再將其喚醒,放回就緒隊列,

如果內存中有空閒塊,則爲進程分配一個空閒塊,將所缺頁面裝入該塊,並修改頁表中對應的頁表項
如果內存中沒有空閒塊,則由頁面置換算法選擇一個頁面淘汰,若該頁面在內存期間被修改過,則要將其寫回外存,未修改過的頁面不用寫回外存

缺頁中斷是因爲當前執行的指令想要訪問的目標頁面未調入內存而產生的,因此屬於內中斷

補充細節
1.只有寫指令才需要修改,修改位並且,一班來說只需修改快表中的數據,只有要將快表項刪除時才需要寫回內存中的慢表,這樣可以減少訪存次數
2.和普通的中斷處理一樣,缺頁中斷處理仍然需要保留CPU現場
3.需要某種頁面置換算法來決定一個換出頁面
4.換入換出頁面都需要啓動慢速的I/O操作,如果換入換出太頻繁,會有很大的開銷
5.頁面調入內存後,需要修改慢表,同時也需要將表項複製到快表中

頁面置換算法

最佳置換算法(OPT,optimal):每次選擇淘汰的頁面將是以後永不使用,或者在最長時間內不在被訪問的頁面,這樣可以保證最低的缺頁率.

最佳置換算法可以保證最低的缺頁率,但實際上,只有在進程執行的過程中才能知道接下來會訪問到的是哪個頁面,操作系統無法提前預判頁面訪問序列,因此,最佳置換算法是無法實現的

先進先出置換算法(FIFO):每次選擇淘汰的頁面是最早進入內存的頁面
實現方法:把調入內存的頁面根據調入的先後順序拍成一個隊列,需要換出頁面時選擇隊頭頁面即可。隊列的最大長度取決於系統爲進程分配了多少個內存塊
當系統爲某進程分配四個內存塊時,缺頁次數10次,分配三個內存塊時,缺頁次數9次

Belady異常:當爲進程分配的物理塊數增大時,缺頁次數不減反增的異常現象
只有FIFO算法會產生Belady異常,另外,FIFO算法雖然實現簡單,但是該算法與進程實際運行時的規律不適應,因爲先進入的頁面也有可能最經常被訪問,因此算法性能差

最近最久未使用算法(LRU,least recently used):每次淘汰的頁面是最近最久未使用的頁面
實現方法:賦予每個頁面對應的頁表項中,用訪問字段記錄該頁面自上次被訪問以來所經歷的時間T.
當需要淘汰一個頁面時,選擇現有頁面中T值最大的,即最近最久未使用更多頁面
頁號 內存塊號 狀態位 訪問字段 修改位 外存地址

該算法的實現需要專門的硬件支持,雖然算法性能好,但是實現困難,開銷大.

時鐘置換算法(CLOCK)
最佳置換算法性能最好,但無法實現,先進先出置換算法實現簡單名單算法性能差,最近最久未使用置換算法性能好,是最接近OPT算法性能的,但是實現起來需要專門的硬件支持,算法開銷大

時鐘置換算法是一種性能和開銷較均衡的算法,又稱CLOCK算法,或最近未用算法(NRU)
簡單的CLOCK算法實現方法:爲每一個頁面設置一個訪問位,在將內存中的頁面都通過鏈接指針連接成一個循環隊列。當某也被訪問後,其訪問位置爲1,當需要淘汰一個頁面時,只需檢查頁的訪問位。如果是0,就選擇該頁換出,如果是1,則將他置爲0,暫不換出,繼續檢查下一個頁面,若第一輪掃描所有頁面都是1,則將這些頁面的訪問位一次置爲0後,再進行第二輪掃描(第二輪掃描中一定會有訪問頁爲0 的頁面,因此簡單的CLOCK算法選擇一個淘汰頁面最多會經過兩次掃描)
改進型的時鐘置換算法
簡單的時鐘置換算法僅考慮到一個頁面最近是否被訪問過,事實上,如果被淘汰的頁面沒有被修改過, 就不需要執行I/O操作寫回外存,只有被淘汰的頁面被修改過時,才需要寫回外存
因此,處理考慮一個頁面最近有沒有被訪問過之外,操作系統還應該考慮頁面有沒有被修改過,在其他條件都相同時,應優先淘汰沒有修改過的頁面,避免I/O操作,這就是改進型的時鐘置換算法的思想
修改位爲0表示頁面沒有被修改過,修改位爲1表示頁面被修改過
爲討論方便,用(訪問位,修改位)的定時表示個頁面狀態,如(1,1)表示一個頁面近期被訪問過,且被修改過.
算法規則:將所有可能被置換的頁面排成一個循環隊列
第一輪:從當前位置開始掃描到第一個(0,0)的幀用於替換,本輪掃描不修改任何標誌位(0,0)第一優先級:最近沒訪問且沒修改的頁面
第二輪:若第一輪掃描失敗,則重新掃描,查找第一個(0,1)的幀用於替換,本輪將所有掃描過的幀訪問位設爲0(0,1)第二優先級:最近沒訪問,但修改過的頁面
第三輪:若第二輪掃描失敗則進行第一輪的步驟(1,0)第三優先級:最近訪問過,但沒修改的頁面
第四輪:若第三輪掃描失敗則進行第二輪的步驟(1,1)第四優先級:最近訪問過且修改過的頁面
由於第二輪已將所有幀的訪問位設爲0 ,因此經過第三輪,第四輪掃描一定會有一個幀被選中,因此改進型CLOCK置換算法選擇一個淘汰頁面最多會進行四輪掃描

頁面分配策略

駐留集:指請求分頁存儲管理中給進程分配的物理塊的集合
在採用了虛擬存儲技術的系統中,駐留集大小一般小於進程的總大小
若駐留集太小,會導致卻也頻繁,系統要花大量的時間來處理缺頁,實際用於進程推進的時間很少
駐留集太大,又會導致多道程序併發度下降,資源利用率低,所以應該選擇一個合適的駐留集大小

固定分配:操作系統爲每個進程分配一組固定數目的物理塊,在進程運行期間不在改變,即駐留集大小不變
可變分配:先爲每個進程分配一定數目的物理塊,在進程運行期間,可根據情況做適當的增加或減少即:駐留集大小可變
局部置換:當發生缺頁時,只能選進程自己的物理塊進行置換
全局置換:可以將操作系統保留的空閒物理塊分配給缺頁進程,也可以將別的進程持有的物理塊置換到外存,再分配給缺頁進程。

固定分配局部置換:系統爲每個進程分配一定數量的物理塊,在整個運行期間都不改變,若進程在運行中發生缺頁,則只能從該進程在內存中的頁面中選出一頁換出,然後再調入需要的頁面,這種策略的缺點是,很難再剛開始就確定應爲每個進程分配多少個物理塊纔算合理,(採用這種策略的系統可以根據進程大小,優先級,或是根據程序員給出的參數來確定爲一個進程分配的內存塊數)

可變分配全局配置:剛開始會爲每個進程分配一定數量的物理塊,操作系統會保持一個空閒物理塊隊列,當某進程發生缺頁時,從空閒物理塊中取出一塊分配給該進程:若已無空閒物理塊,則可選擇一個未鎖定的頁面換出外存,再將該物理塊分配給缺頁的進程。採用這種策略時,只要某進程發生缺頁,都將獲得新的物理塊,僅當空閒物理塊用完時,系統才選擇一個未鎖定的頁面調出。被選擇調出的頁可能是系統中任何一個進程的頁,因此這個被選中的進程擁有的物理塊會減少,缺頁率會增加

可變分配的局部置換:剛開始會爲每個進程分配一定數量的物理塊,當進程發生缺頁時,只允許從該進程自己的物理塊中選出一個進行換出外存。如果進城在運行中頻繁的缺頁,系統會爲該進程多分配幾個物理塊,直至該進程缺頁率趨勢適當程度,反之,如果進程在運行中缺頁率特別低,則可適當減少分配給該進程的物理塊

可變分配全局配置:只要缺頁就給分配新物理塊
可變分配局部變量:只根據發生缺頁的頻率來動態的增加或減少進程的物理塊

何時調入頁面
1.預調頁策略:根據局部性原理(主要指空間局部性,即如果當前訪問了某個內存單元,在之後很有可能會接着訪問與其相鄰的那些內存單元),一次調入若干個相鄰的頁面可能比一次調入一個頁面更高效。但如果提前調入的頁面中大多數都沒被訪問過,則又是低效的,因此可以預測不久之後可能訪問到的頁面,將它們預先調入內存,但目前預測成功率只有50%左右,故這種策略主要用於進程的首次調入,由程序員指出應該先調入哪些部分(運行前調入)
2.請求調頁策略:進程在運行期間發現卻也是纔將所缺頁面調入內存,,由這種策略調入的頁面一定會被訪問到,但由於每次只能調入一頁,而每次調頁都要磁盤I/O操作,因此I/O開銷比較大(運行時調入)

何處調入頁面
1.系統擁有足夠的對換區空間:頁面的調入,調出都是在內存與對換區之間進行,這樣可以保證頁面的調入,調出速度很快。在進程運行前,需將進程相關的數據從文減去複製到對換區
2.系統缺少足夠的對換區空間:凡是不會被修改的數據都直接從文件區調入,由於這些頁面不會被修改,因此換出時不必寫回磁盤,下次需要時再從文件去帶入即可,對於可能被修改的部分,換出時需寫回磁盤對換區,下次需要式再從對換區調入
3.UNIX方式:運行之前進程有關的數據全部放在文件區,故未使用過的頁面,都可從文件區調入。若被使用過的頁面需要換出,則寫回對換區,下次需要時從對換區調入

抖動(顛簸)現象
剛剛換出的頁面馬上又要換入內存,剛剛換入的頁面馬上有藥換出外存,這種頻繁的頁面調度行爲成爲抖動,或顛簸。產生抖動的主要原因是進程頻繁訪問的頁面數目高於可用的物理塊數(分配給進程的物理塊不夠)(爲進程分配的物理塊太少,會使進程發生抖動現象,爲進程分配的物理塊太多,又會降低系統整體的併發度,降低某些資源的利用率)
爲了研究爲應該爲每個進程分配多少個物理塊,Denning提出了進程工作集的概念
駐留集:指請求分頁存儲管理中給進程分配的內存塊的集合
工作集:指在某段時間間隔裏,進程時機訪問頁面的集合

工作集大小可能小於窗口尺寸,實際應用中,操作系統可以統計進程的工作集的大小,根據工作集大小給進程分配若干內存塊。如,窗口尺寸爲5,經過一段時間的檢測發現某進程的工作集最大爲3,那麼說明該進程有很好的的局部性,可以給這個進程分配3個以上的內存塊即可滿足進程的運行需要.
一般來說,駐留集大小不能小於工作集大小,否則進程運行過程中將頻繁缺頁

拓展:基於局部性原理可知,進程在一段時間內訪問的頁面與不久之後會訪問的頁面是有相關性的。因此,可以根據進程近期訪問的頁面集合(工作集)來設計一種頁面置換算法 選擇一個不在工作集中的頁面進行淘汰。

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