虛擬記憶體與需求分頁

頁輸出(page-out)

想像在你擁擠的桌上清出一個位置,好放新文件。如果你拿走的那張紙上有別處都沒有的新筆跡,你必須先把它安全歸檔;如果它只是隨時可以重印的列印稿,你大可直接丟掉。頁輸出就是作業系統在 RAM 滿了時做的這件事:它把一個頁從頁框裡移走以釋放那個頁框,而且當且僅當有必要保存時才先把該頁存起來。

具體來說,頁輸出是把一個頁趕出實體記憶體的動作。當作業系統需要一個空閒頁框、而一個都沒有時,分頁置換會選出一個犧牲頁,把那個犧牲者換出便釋放了它的頁框。這次頁輸出是否牽涉磁碟寫入,取決於該頁。若犧牲者的修改位元被設定(該頁自載入以來被修改過),它唯一最新的副本就在 RAM 裡,所以作業系統必須在重用該頁框之前把它寫到後備儲存。若該頁是乾淨(未修改)且檔案支撐的,磁碟上已經有一份好的副本,所以作業系統可以立即釋放頁框、完全不必寫入。頁輸出之後,作業系統把對應的分頁表項目標記為無效、記錄該頁現在住在哪裡(如果它被寫出了),而被釋放的頁框就準備好給正在被分頁進來的那個頁。

為什麼重要:頁輸出是分頁進入的對應動作,正是它讓需求分頁得以持續——RAM 始終裝滿有用的頁,因為陳舊或閒置的頁被推出去騰出了空間。這裡最大的效能槓桿是修改位元:把一個髒頁寫出要花一次緩慢的磁碟傳輸,所以一次必須先把髒犧牲者換出的錯誤,可能比一次找到乾淨犧牲者或空閒頁框的錯誤貴上一倍。這就是為什麼置換策略偏好趕走乾淨頁,也是為什麼系統有時會提前在背景把髒頁寫出,好讓需要的那一刻一到、就有一個乾淨且能立即重用的頁框。

作業系統需要一個頁框,挑了頁 A 當犧牲者。A 是乾淨的(檔案支撐的程式碼),於是它被立即丟棄、頁框被重用——零次磁碟寫入。下一次它挑了頁 B,B 是髒的,所以 B 必須先被寫到置換空間,然後它的頁框才被重用。

髒的犧牲者要付出一次寫出;乾淨的犧牲者可以免費趕走。

頁輸出不等於分頁置換。置換是決定要趕走哪一頁的策略;頁輸出是把它趕走(並在髒時寫回)的機械動作。只有在犧牲者是髒的時候,一次頁輸出才會造成磁碟寫入。

又称
page evictionwriting back a page頁換出頁寫出