2015-04-18 52 views
4

我知道一個程序第一次啓動時,由於代碼不在內存中,所以在開始時它有大量的頁面錯誤,因此需要從磁盤加載代碼。程序退出後,二進制文件是否保留在內存中?

程序退出時會發生什麼?二進制文件是否保留在內存中?後續的程序調用是否會發現代碼已經在內存中,因此沒有頁面錯誤(假設沒有任何內容在頁面間運行,頁面填充到磁盤)?

看起來好像沒有在我的Linux機器上運行一些實驗的答案。我一遍又一遍地運行一些程序,每次都觀察到相同數量的頁面錯誤。這是一個相對安靜的機器,所以我懷疑東西在調用之間被調出。那麼,爲什麼呢?爲什麼不可執行文件留在內存中?

+0

您需要檢查系統的「緩存」功能。我高度懷疑你說的是不正確的!也許系統設置有變化。 –

回答

0

我非常懷疑的是,除非實際運行的代碼有更多的內存請求,否則不會立即從內存中刪除部分信息blob。對於那個部分,可能發生的是OS在下一次執行時重用來自RAM的取決於操作系統的位。我認爲這對於操作系統啓動的資源來說是真實的(可能不是所有的資源,但有些資源)。

-1

其中一個原因是人們通常希望清除後續調用中的所有內容,以防上一次調用時出現問題。

另外,可寫數據必須移出。

也就是說,有些系統確實有將可執行文件和靜態數據保存在內存中的機制(可能不是linux)。例如,VMS操作系統允許系統管理員安裝可執行文件和共享庫,以便它們保留在內存中(允許分頁)。可以使用相同的系統來創建允許進程間通信和修改內存以保留在內存中的可寫共享內存(可能已分頁)。

3

這裏要考慮兩件事情:

1)的可執行文件的內容有可能被保存在操作系統的緩存(磁盤高速緩存)。雖然該數據仍在OS緩存中,但該數據的每次讀取都會觸發緩存,操作系統將遵守請求,而無需從磁盤重新讀取文件。

2)當進程退出時,操作系統取消映射映射到文件的每個內存頁面,釋放任何內存(通常釋放進程分配的每個資源,包括其他資源(如套接字等))。嚴格地說,物理內存可能被調零,但並不是非常必要的(但是,操作系統的安全級別可能需要將不再使用的頁面歸零 - 可能是Windows NT,2K,XP等),請參閱此Does Windows clear memory pages?)。對同一個可執行文件的另一個調用將創建一個全新的進程,它將映射內存中的相同文件,但對這些頁面的第一次訪問仍然會觸發頁面錯誤,因爲最終它是一個新進程,一個不同的內存映射。所以是的,頁面出現錯誤,但與第一個相比,它們對於同一個可執行文件的第二個實例要便宜很多。

當然,這只是關於可執行文件(包含代碼和只讀數據的段/模塊)的只讀部分。

可以考慮另一種情況:分叉。在這種情況下,每個頁面都被標記爲寫時拷貝。當每個內存頁面發生第一次寫入時,硬件異常會被OS內存管理器觸發並截獲。操作系統確定是否允許寫入所討論的頁面(例如:如果是堆棧,堆或任何一般的可寫頁面),如果是,則分配內存並複製原始內容,然後允許進程修改該頁面 - 爲了保留其他進程中的原始數據。是的,還有另一種情況 - 共享內存,其中確切的物理內存映射到兩個或更多進程。在這種情況下,寫時複製標誌當然不會在內存頁面上設置。

希望能夠澄清內存頁面正在發生什麼。

+1

「可能是Windows NT,2K,XP等,這樣做」不,他們沒有。你爲什麼期望Windows能夠做到這一點,而不是其他操作系統? – m0skit0

+1

也許會添加一些關於主要與次要頁面錯誤的信息。 –

+0

@ m0skit0:是的,Windows在將它們分配給不同的進程之前,它會執行零頁。但是,這與磁盤緩存並不特別相關。 –

0

其實大部分問題都是高度依賴於實施的。但對於大多數使用的操作系統:

程序退出時會發生什麼?二進制文件是否保留在內存中?

是,存儲器塊被標記爲未使用(並因此可以被分配給其它進程)。

會程序的後續調用發現該代碼是 已經在內存中,因此不會有缺頁故障(假設沒有運行 之間和頁面的東西出到磁盤)?

不,這些塊被認爲是空的。一些/所有塊可能已被覆蓋。

爲什麼不可執行文件留在內存中?

爲什麼會留下來?當一個進程完成時,所有分配的資源都被釋放。

相關問題