天天看點

讀書筆記-現代作業系統-3儲存管理-3.6有關實作的問題

3.6 有關實作問題

3.6.1 與分頁有關的工作

  • 建立程序時
    • 作業系統确定程式和資料在初始時有多大,并為它們建立一個頁表。為頁表配置設定空間并對其初始化。
    • 作業系統需要在磁盤交換區中配置設定空間,以便在一個程序換出時在磁盤上有放置此程序的空間
    • 用程式正文和資料對交換區進行初始化,這樣當新程序發生缺頁中斷時,可以調用需要的頁面。
    • 作業系統必須把有關頁表和磁盤交換區的資訊儲存在程序中
  • 程序執行時
    • 為新程序設充值MMU,重新整理TLB,以清除以前程序遺留下的痕迹,程序的頁表必須稱為目前的頁表
    • 把程序的一部分或全部頁面裝入記憶體已減少缺頁中斷。
  • 缺頁中斷時
    • 通過讀硬體寄存器來确定是哪個虛拟位址造成了缺頁中斷,并計算出頁面在硬碟的位置
    • 必須找到合适的頁框來存放新頁面,必要時還要置換老的頁面,
    • 把所需要的頁面讀入頁框。
    • 備份程式計數器,使程式計數器指向引起缺頁中斷的指令,并重新執行該指令
  • 程序終止時
    • 作業系統釋放程序的頁表、頁面和頁面在硬碟上占用的空間。如果這些頁面是與其他程序共享的,當最後一個使用他們的程序終止的時候,才可以釋放記憶體和磁盤上的頁面。

3.6.2 缺頁中斷處理

順序:

1. 硬體陷入核心,在堆棧中儲存程式計數器,大多數機器将目前指令的各種狀态資訊儲存在特殊的CPU寄存器中

2. 啟動一個彙編代碼例程來儲存通用寄存和其他易失的資訊。以免被作業系統破壞

3. 嘗試發現需要哪個虛拟頁面。通常根據硬體寄存器确定。

4. 作業系統檢測位址是否正确,檢測存取與保護是否有效且一緻。如果不一緻則殺死程序或發出一個信号,如果一緻且有效,則檢測是否有空閑頁框。如果沒有空閑頁框,則執行頁面置換算法尋找一個頁面來淘汰。

5. 如果選擇的頁框“髒了”,安排磁盤寫回磁盤,并發生一次上下文切換,,挂起産生缺頁中斷的程序,讓他程序運作直至磁盤傳輸結束。該頁框需要被标記為忙

6. 一旦頁框幹淨後(立刻還是寫回後)作業系統查找需要頁面在磁盤上的位址,通過磁盤操作将其裝入。注意此時該程序還保持在中斷挂起狀态,CPU可以運作其他程序

7. 當磁盤中斷發生時,表明該頁已經被裝入,頁表已經更新可以反映它的位置。頁框也處于正常狀态。

8. 恢複發生缺頁中斷前的狀态。

9. 排程引發中斷的程式,傳回彙編語言例程

10. 恢複寄存器和其他狀态資訊,傳回使用者空間執行。

3.6.3 指令備份

對于作業系統來說準确的判斷指令是從哪裡開始通常是不可能的。

通常,CPU的設計者們提供了一種解決方案,就是通過使用一個隐藏的内部寄存器。在每條指令執行之前,把程式計數器的内容複制到該寄存器。

有些計算機還有第二個寄存器,用來提供哪些寄存器已經自動增加或者減少已經增減的資訊數量。

3.6.4 鎖定記憶體中的頁面

雖然有虛拟記憶體,但是并不意味着IO就沒用了。IO用于讀取檔案或讀取裝置資訊。

有時候IO緩沖區和缺頁調用有沖突,IO緩沖區很小的幾率被選出調出緩沖區。通常這樣的情況的解決辦法是鎖住正在做IO操作的記憶體中的頁面以保證它不會被移出記憶體。鎖住一個頁面通常稱為在記憶體中釘住(pinning)

3.6.5 後備存儲

本節讨論當頁面被從記憶體換出的時候應該放到硬碟的哪個位置上?

通常的簡單算法都是在磁盤上設定一個特殊的交換分區,甚至從檔案系統劃分一塊獨立的磁盤(以平衡IO負載)。這個分區裡沒有普通的系統檔案這樣就消除了将檔案偏移轉換成塊位址的開銷,而始終使用響應的起始塊号。

  • 對靜态交換區分頁

    系統啟動的時,交換分區為空。程序啟動的時候,留出與這個程序一樣大的交換區塊。交換分區的空閑塊以清單形式給出。

    每個程序對應的其交換區的磁盤位址,即程序映像所儲存的地方。這一資訊是記錄在程序表裡面。

    當寫回頁面的時候,将虛拟位址空間中的頁面偏移量加到交換區的開始位址處。

    但是在程序啟動前必須初始化交換區,可以将整個程序放進交換區,也可以全放進記憶體。

    這一模式的問題是當程序啟動後可能會增大,資料和堆棧可能會增長,這樣最好為正文、資料和堆棧分别保留交換區,并且允許這些交換塊多于一塊。

  • 動态備份頁面

    事先不做任何配置設定,在頁面換出時為其配置設定頁面,在換入時回收磁盤。這樣做記憶體中程序不必固定于任何交換空間。缺點是記憶體中的每個頁面都要記錄相應的磁盤位址。

不論何種方法都不能保證總是實作固定的交換分區。

如果沒有磁盤分區可用的時候,可用利用正常檔案系統中的一個或多個較大的,事先定位的檔案。如Windows。

初次之外我們還注意到,通常程式的正文部分是不變的,而且每個程式正文都來自某個可執行的程式,這樣如果堆棧和資料段過量,可以丢棄部分程式段内容, 因為程式段的内容即使丢棄了也可以從執行檔案讀取回來。

3.6.6政策和機制的分離

儲存管理系統可以分為三個部分:

1. 一個底層MMU處理程式

2. 一個作為核心一部分的缺頁中斷處理程式

3. 一個運作在使用者空間中的外部頁面調用程式。

讀書筆記-現代作業系統-3儲存管理-3.6有關實作的問題

繼續閱讀