作業系統學習筆記9 | 記憶體的換入和換出

2022-09-09 18:00:17

分段和分頁是記憶體管理的最重要的兩個機制,而虛擬記憶體是實現分段和分頁結合的重要方法。為了實現虛擬記憶體,就必須要有換入和換出機制。


參考資料:


1. 為什麼要引入 換入和換出

虛擬記憶體機制,讓使用者的視角中形成了每個程序都可以操作完整 4GB 記憶體的假象。比如從一個使用者程式碼的角度,它可以隨意使用計算機的全部記憶體地址,就像單獨擁有記憶體(4G)一樣。而後續虛擬記憶體向實體記憶體的對映,是對使用者不可見的。

在實際系統中,定時清除歷史標記位的分針程式,可以放在時鐘中斷中,而負責缺頁淘汰的時針程式,則放在缺頁中斷的 get_free_page() 中。兩部分配合,就完成了頁面選擇換出。

3.6 程序的頁框分配問題

整個換出機制還有一點漏洞,即:我們應當為一個程序分配多少頁框呢?

  • 分多了,那麼根據記憶體的換入換出實現的記憶體高效利用就沒啥用了

    因為單個程序使用的頁框數 n 太大,則記憶體中能夠駐留的程序數量少,系統並行率低

  • 分得太少,則缺頁頻繁,CPU等待換頁時間變長,系統吞吐量太低;

    參考資料:作業系統-程序記憶體分配 - Jeff的技術棧,這部分對應該博文的 3.7 節頁框分配策略。

  • 程序個數與CPU利用率的關係如下圖的影象所示:

    • 這個影象的起伏背後的本質原因就是 缺頁。
    • 只需要加入一條:記憶體一定,程序多則頁框少。
    • 下圖的現象就是 」顛簸 thrashing「。有的地方也叫 抖動。
image.png

如何合理地分配頁框數量進而避免上述」顛簸「呢?這個問題有很多演演算法,下面提出一種:

  • 區域性性原理;
  • 一個程式在某一段時間內,用到的資料具有空間區域性性。我們經常使用一個區域性空間內的資料,如果我們分配的頁框的數量可以覆蓋這個區域性空間的大小,那就是足夠的;
  • 可想而知,求解區域性空間並不容易,但也有許多演演算法;比如求工作集:這裡課程不再細說,詳見作業系統-程序記憶體分配 - Jeff的技術棧
  • 當然,顛簸 這個現象在程序過多的時候是無法用演演算法避免的,所以OS應當限制同時進行的程序的最大數目。

當頁框分配完成,再根據 3.5 中的 Clock 演演算法組成迴圈連結串列/環形陣列(錶盤),通過快慢兩個指標進行換出。

4. 總結

換入換出的整體機制其實很好理解。

程式執行,某邏輯地址要求存取記憶體,MMU 硬體管理單元發現 這個邏輯地址在記憶體中找不到對應位置,啟用缺頁中斷,從磁碟中讀頁進來。如果記憶體沒有空閒位置可供磁碟讀入,則需要 Clock演演算法 選擇頁進行換出;換出後,有空閒位置,則可繼續讀入需要的頁。

如果安裝過Ubuntu(博主反覆安裝過很多次),需要在磁碟上分配一個 swap 分割區,這就是 Linux 的虛擬記憶體分割區。當實體記憶體不夠用的時候,作業系統會從記憶體中取出一部分暫時不用的資料,放在交換分割區swap 中,相當於將這部分磁碟虛擬化成記憶體使用,從而為當前執行的程式騰出足夠的記憶體空間。

  • 好處:實現了類似於 Windows 虛擬記憶體概念的超大記憶體;與Windows 不一樣的地方在於,Win 可以自動調大,也可以通過設定關閉(關閉就可能發現記憶體不夠用)。
  • 缺點:與 Windows 一樣,實際上還是磁碟與記憶體之間的通訊,速度還是較慢。
image.png

回到最開始,換入換出的機制實現後,虛擬記憶體就可以投入使用,進而實現了 段頁式記憶體管理

至此,作業系統的核心——記憶體管理和CPU管理都已瞭解完畢,後面繼續瞭解裝置驅動、檔案系統、系統介面以及系統引導初始化,就是完整的 作業系統。