分段和分頁是記憶體管理的最重要的兩個機制,而虛擬記憶體是實現分段和分頁結合的重要方法。為了實現虛擬記憶體,就必須要有換入和換出機制。
參考資料:
課程:哈工大作業系統(本部分對應 L24 && L25)
虛擬記憶體機制,讓使用者的視角中形成了每個程序都可以操作完整 4GB 記憶體的假象。比如從一個使用者程式碼的角度,它可以隨意使用計算機的全部記憶體地址,就像單獨擁有記憶體(4G)一樣。而後續虛擬記憶體向實體記憶體的對映,是對使用者不可見的。
在實際系統中,定時清除歷史標記位的分針程式,可以放在時鐘中斷中,而負責缺頁淘汰的時針程式,則放在缺頁中斷的 get_free_page()
中。兩部分配合,就完成了頁面選擇換出。
整個換出機制還有一點漏洞,即:我們應當為一個程序分配多少頁框呢?
分多了,那麼根據記憶體的換入換出實現的記憶體高效利用就沒啥用了
因為單個程序使用的頁框數 n 太大,則記憶體中能夠駐留的程序數量少,系統並行率低。
分得太少,則缺頁頻繁,CPU等待換頁時間變長,系統吞吐量太低;
參考資料:作業系統-程序記憶體分配 - Jeff的技術棧,這部分對應該博文的 3.7 節頁框分配策略。
程序個數與CPU利用率的關係如下圖的影象所示:
如何合理地分配頁框數量進而避免上述」顛簸「呢?這個問題有很多演演算法,下面提出一種:
當頁框分配完成,再根據 3.5 中的 Clock 演演算法組成迴圈連結串列/環形陣列(錶盤),通過快慢兩個指標進行換出。
換入換出的整體機制其實很好理解。
程式執行,某邏輯地址要求存取記憶體,MMU 硬體管理單元發現 這個邏輯地址在記憶體中找不到對應位置,啟用缺頁中斷,從磁碟中讀頁進來。如果記憶體沒有空閒位置可供磁碟讀入,則需要 Clock演演算法 選擇頁進行換出;換出後,有空閒位置,則可繼續讀入需要的頁。
如果安裝過Ubuntu(博主反覆安裝過很多次),需要在磁碟上分配一個 swap 分割區,這就是 Linux 的虛擬記憶體分割區。當實體記憶體不夠用的時候,作業系統會從記憶體中取出一部分暫時不用的資料,放在交換分割區swap 中,相當於將這部分磁碟虛擬化成記憶體使用,從而為當前執行的程式騰出足夠的記憶體空間。
回到最開始,換入換出的機制實現後,虛擬記憶體就可以投入使用,進而實現了 段頁式記憶體管理 。
至此,作業系統的核心——記憶體管理和CPU管理都已瞭解完畢,後面繼續瞭解裝置驅動、檔案系統、系統介面以及系統引導初始化,就是完整的 作業系統。