《現代操作系統》第3章 存儲管理

1.  存儲管理器

有效地管理內存,即記錄哪些內存正在使用,哪些內存是空閒的,在進程需要時分配爲其分配內存,在進程使用完後釋放內存。

2.  幾種存儲管理方案

1) 無存儲器抽象:每一個程序都直接訪問物理內存

2) 一種存儲器抽象:地址空間

3) 虛擬內存

3.  地址空間

是一個進程可用於尋址內存的一套地址集合,每個進程都有一個自己的地址空間,並且該空間獨立於其他進程(除了在一些特殊情況下進程需要共享它們的地址空間外)

4.  簡單的尋址解決方法:動態定位(不適用於現代CPU)

基址寄存器:起始物理地址

界限寄存器:程序長度

缺點:每次訪存需進行比較和加法運算,加法很慢。

5.  交換技術

處理內存超載的方法之一,另一種是虛擬內存。

把一個完整進程調入內存,運行一段時間後,存回磁盤,空閒進程主要在磁盤上。

內存緊縮:指小的空閒區合成一大塊(一般不進行,速度慢)

6.  空閒內存管理

1) 使用位圖的存儲管理

2) 使用鏈表的存儲管理

7.  爲創建的進程分配內存

(按地址順序在鏈表中存放進程和空閒區時)

算法:

1) 首次適配算法

2) 下次適配算法

3) 最佳適配算法

4) 最差適配算法

5) 快速適配算法

8.  虛擬內存

基本思想:每個程序擁有自己的地址空間,這個地址空間被分割成多個塊,每個塊稱爲一頁(page),每個頁有連續的地址範圍。頁被映射到物理內存。這些頁部分調入內存即可運行,當程序引用地址時,由硬件立刻執行必要的地址映射,如果引用到不在內存中的地址空間時,由操作系統負責將缺失的部分裝入物理內存並重新執行失敗的指令。

9.  內存管理單元MMU

把虛擬地址映射爲物理內存地址

虛擬地址空間按照固定大小劃分成稱爲頁面的若干單元。

在物理內存中對應的單元稱爲頁框。

會產生缺頁中斷是因爲虛擬地址空間比物理內存大

10. 頁表

用於把虛擬頁面映射爲頁框

虛擬地址空間被分爲虛擬頁號偏移量兩部分

 

高速緩存禁止位

訪問位

修改位

保護位

“在/不在”位

頁框號

11. 加速分頁過程

1) TLB

將虛擬地址直接映射到物理地址,而不必再訪問頁表的硬件設備,轉換檢測緩衝區,又稱相聯存儲器,快表。

2) 軟件TLB管理

軟失效:在內存中而不在TLB,更新TLB

硬失效:不在內存中也不在TLB,需一次磁盤存取

12. 針對大內存的頁表

1) 多級頁表

2) 倒排頁表:在實際內存中每一個頁框有一個表項,用散列提高虛擬頁面到物理地址的映射速度

13. 頁面置換算法

1) 最優頁面置換算法(不可能實現)

2) 最近未使用頁面置換算法(NRU)

3) 先進先出頁面置換算法(FIFO)

4) 第二次機會頁面置換算法(檢查最老頁面R位(R=0立刻置換,R=1清0放鏈表尾端)

5) 時鐘頁面置換算法(環形鏈表,R=0淘汰,R=1清0並錶針前移)

6) 最近最少使用頁面置換算法(LRU,鏈表,最近最多使用在表頭)

老化算法(用於模擬LRU)

R位被加進之前先將計數器右移一位

R位加到計數器最左端

7) 最不常使用算法(NFU,計數器初值0,每次中斷,將每個頁面的R位加到計數器)

8) 工作集頁面置換算法(工作集:一個進程當前正在使用的頁面的集合。預先調頁)

9) 工作集時鐘頁面置換算法(WSClock)

14. 分頁系統中的設計問題

1) 局部分配策略與全局分配策略

全局算法通常情況下工作得比局部算法好

PFF算法(缺頁中斷率算法):管理內存動態分配,盡力讓每個進程的缺頁中斷率控制在可接受的範圍內

適用於局部又適用於全局:FIFO、LRU

只適於局部:工作集、WSClock

2) 負載控制

一旦所有進程的工作集超出了內存容量,就可能發生顛簸,即使採用最優算法。

解決辦法:將一部分進程交換到磁盤,並釋放它們佔有的所有頁面。

3) 頁面大小

最優頁面大小公式 P=sqrt(2se) (進程平均大小是s字節,每個頁表項需要e字節)

4) 分離指令空間和數據空間

5) 共享頁面

寫時複製,兩個進程通過共享程序頁表,來共享同一程序。

6) 共享庫

位置無關代碼,解決重定位出錯的問題。

7) 內存映射文件

共享庫實際上是一種更爲通用的機制----內存映射文件的一個特例。

進程可以通過發起一個系統調用,將一個文件映射到其虛擬地址空間的一部分。

在多數實現中,在影射共享的頁面時不會實際讀入頁面的內容,而是在訪問頁面時纔會被每次一頁地讀入,磁盤文件則被當作後備存儲.但進程退出或顯式地解除文件映射時,所有被改動的頁面會被寫回文件中。

8) 清除策略

分頁守護進程:定期檢查內存狀態,如果空閒頁框太少,置換。如果置換的頁面被修改過,寫回磁盤。

雙指針時鐘:前指針由分頁守護進程控制,指向髒頁面時,寫回前移,否則只前移。後指針用於頁面置換。

15. 有關實現的問題

1) 分頁相關工作的時間:進程創建時,進程執行時,缺頁中斷時和程序終止時。

2) 缺頁中斷處理的時間順序

缺頁中斷髮生時的事件順序如下:

1.         硬件陷入內核,在堆棧中保存程序計數器。大多數機器將當前指令的各種狀態信息保存在特殊的CPU寄存器中。

2.         啓動一個彙編代碼例程保存通用寄存器和其他易失的信息,以免被操作系統破壞。這個例程將操作系統作爲一個函數來調用。

3.         當操作系統發現一個缺頁中斷時,嘗試發現需要哪個虛擬頁面。通常一個硬件寄存器包含了這一信息,如果沒有的話,操作系統必須檢索程序計數器,取出這條指令,用軟件分析這條指令,看看它在缺頁中斷時正在做什麼。

4.         一旦知道了發生缺頁中斷的虛擬地址,操作系統檢查這個地址是否有效,並檢查存取與保護是否一致。如果不一致,向進程發出一個信號或殺掉該進程。如果地址有效且沒有保護錯誤發生,系統則檢查是否有空閒頁框。如果沒有空閒頁框,執行頁面置換算法尋找一個頁面來淘汰。

5.         如果選擇的頁框“髒”了,安排該頁寫回磁盤,併發生一次上下文切換,掛起產生缺頁中斷的進程,讓其他進程運行直至磁盤傳輸結束。無論如何,該頁框被標記爲忙,以免因爲其他原因而被其他進程佔用。

6.         一旦頁框“乾淨”後(無論是立刻還是在寫回磁盤後),操作系統查找所需頁面在磁盤上的地址,通過磁盤操作將其裝入。該頁面被裝入後,產生缺頁中斷的進程仍然被掛起,並且如果有其他可運行的用戶進程,則選擇另一個用戶進程運行。

7.         當磁盤中斷髮生時,表明該頁已經被裝入,頁表已經更新可以反映它的位置,頁框也被標記爲正常狀態。

8.         恢復發生缺頁中斷指令以前的狀態,程序計數器重新指向這條指令。

9.         調度引發缺頁中斷的進程,操作系統返回調用它的彙編語言例程。

10.      該例程恢復寄存器和其他狀態信息

3) 指令備份:當程序訪問不在內存中的頁面時,將引起頁面失效的指令停止併產生OS的陷阱。

解決方案:使用隱藏的內部寄存器複製程序計數器的內容

4) 鎖定內存中的頁面

5) 後備存儲:靜態、動態、交換分區

16. 分段:用於各種表的擴張、收縮管理

在機器上提供多個互相獨立的稱爲段的地址空間。

段是一個邏輯實體,段的長度可以是0到某個允許的最大值。

分段有助於在幾個進程之間共享過程和數據。

頁面時定長的而段不是。

17. 分段和分頁結合:MULTICS

一個地址分爲:段和段內地址。

段內地址:頁號和頁內的字(頁內偏移量)

MULTICS包含16個字的高速TLB

18. 分段和分頁的結合:Pentium

LDT局部描述符表:每個程序的段,代碼、數據、堆棧等

GDT全局描述符表:系統段,包括操作系統本身

 

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