Linux内存中加载二进制,linux – 程序退出后二进制文件会留在内存中吗?
我知道程序首次啟動時,由于代碼不在內存中,因此在開始時會出現大量頁面錯誤,因此需要從磁盤加載代碼.
程序退出后會發生什么?二進制文件是否留在內存中?該程序的后續調用是否會發現代碼已經在內存中,因此沒有頁面錯誤(假設兩者之間沒有任何運行,并且頁面填充到磁盤)?
在我的Linux機器上運行一些實驗似乎沒有答案.我一遍又一遍地運行一些程序,每次都觀察到相同數量的頁面錯誤.這是一個相對安靜的機器,所以我懷疑東西是在調用之間被調出來的.那么,為什么呢?為什么可執行文件不能保留在內存中?
最佳答案 這里有兩件事需要考慮:
1)可執行文件的內容可能保存在OS緩存(磁盤緩存)中.雖然該數據仍在操作系統緩存中,但該數據的每次讀取都將到達緩存,操作系統將遵循該請求,而無需從磁盤重新讀取該文件
2)當進程退出時,操作系統取消映射到文件的每個內存頁面,釋放任何內存(通常,釋放進程分配的每個資源,包括其他資源,如套接字等).嚴格來說,物理內存可能已歸零,但并不十分必需(仍然,操作系統的安全級別可能需要將不再使用的頁面歸零 – 可能是Windows NT,2K,XP等,請執行此操作 – 請參閱此Does Windows clear memory pages?).對同一個可執行文件的另一個調用將創建一個全新的進程,它將在內存中映射相同的文件,但是對這些頁面的第一次訪問仍然會觸發頁面錯誤,因為最終它是一個新進程,一個不同的內存映射.所以,是的,頁面錯誤發生,但與第一個相比,它們相同的可執行文件的第二個實例便宜得多.
當然,這僅僅是可執行文件的只讀部分(包含代碼和只讀數據的段/模塊).
可以考慮另一種情況:分叉.在這種情況下,每個頁面都標記為寫時復制.當在每個存儲器頁面上發生第一次寫入時,OS內存管理器觸發并攔截硬件異常.操作系統確定是否允許寫入相關頁面(例如:如果它是堆棧,堆或任何可寫頁面),如果是,則在允許進程修改頁面之前分配內存并復制原始內容 – 為了保留其他過程中的原始數據.是的,還有另一種情況 – 共享內存,其中確切的物理內存映射到兩個或多個進程.在這種情況下,寫時復制標志當然不在存儲頁面上設置.
希望這能澄清內存頁面的內容.
總結
以上是生活随笔為你收集整理的Linux内存中加载二进制,linux – 程序退出后二进制文件会留在内存中吗?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: qemu运行linux内核很慢,linu
- 下一篇: tiny core linux 编译,t