2013-10-27 73 views
1

我通過的Tanenbaum的「現代操作系統」一書的學習和剛讀的書以下段落:進程啓動時分頁(虛擬內存)系統中會發生什麼?

當一個進程啓動時,其所有的頁表項被標記爲未在內存中。只要引用任何頁面,就會發生頁面錯誤。然後操作系統設置R位(在其內部表中),使用READ ONLY方式更改頁表條目以指向正確的頁面,然後重新啓動指令。如果頁面隨後被修改,則會發生另一個頁面錯誤,允許操作系統設置M位並將頁面的模式更改爲READ/WRITE。

這對我來說似乎極其不利。他建議,當一個進程啓動時,必須發生許多頁面錯誤,並且在執行指令時真正的內存正在被填滿。

對我來說,看起來更合乎邏輯的是,至少進程的文本在開始時放在內存中,而不是放在每個指令執行時(每個指令執行時都有頁錯誤)。

有人能解釋一下這本書解釋的這種方法的優點嗎?

回答

1

的Tanenbaum describese本款兩種技術:

當一個進程啓動時,其所有的頁表項被標記爲未在內存中。當任何頁面被引用時,就會發生頁面錯誤。操作系統然後設置> R位(在其內部表中),將頁表項更改爲指向正確的頁面,>使用READ ONLY模式,然後重新啓動指令。

此技術也被稱爲按需分頁(頁面從磁盤加載到內存按需,如果發生頁面錯誤)。我能想到的至少有兩個原因,爲什麼你會想這樣做:

  1. 內存消耗:只有真正需要從磁盤加載到主內存中的頁面,有可能是你的,你的程序的部分永遠不會執行或部分在你的數據部分,你永遠不會寫在執行過程中。在這種情況下,這些部分從不首先加載,這意味着您有更多的RAM可供其他進程使用。如今,如果這仍然是一個有效的論證,那麼當然,如果有大量的記憶,你當然可以辯論。

  2. 速度:從磁盤加載速度較慢,十年前速度較慢。以懶惰的方式按需設置頁表設置可以推遲從磁盤讀取塊。一次加載所有內容可能會延遲程序的執行。同樣,磁盤現在速度更快,固態硬盤使這個說法更加無效。另一方面,由於動態庫,二進制文件不是那麼大,通常只需要幾個頁面錯誤,直到它們加載到RAM中。

如果頁面隨後被修改,將出現另一個頁面錯誤,使 操作系統設置M位,改變頁面的方式來讀/寫。

此外,其原因是內存消耗。在過去,當內存稀少時,交換(如果內存變滿,將頁面移回磁盤)是爲您提供更大工作集頁面幻覺的解決方案。如果一個頁面已經被換出並且從未被修改過,你可以通過移除頁面表中的當前位來擺脫頁面,從而釋放先前被佔用的頁面以加載另一幀。修改後的位有助於檢測是否需要將新版本的頁面寫回磁盤,或者如果實際上可以保留舊版本,並且在需要時再次將其更換回來。

您提到的設置所有頁表條目預填充(也稱爲預分頁)過程的方法是完全有效的。你正在爲了速度而交易內存消耗。頁表走,並設置修改位是在硬件(在x86),這意味着它沒有那麼糟糕。但是,預先填充可以幫助您避免執行頁面錯誤處理程序,而這種處理程序通常會進行大量優化,並且是通過軟件實現的。

相關問題