這裏要考慮兩件事情:
1)的可執行文件的內容有可能被保存在操作系統的緩存(磁盤高速緩存)。雖然該數據仍在OS緩存中,但該數據的每次讀取都會觸發緩存,操作系統將遵守請求,而無需從磁盤重新讀取文件。
2)當進程退出時,操作系統取消映射映射到文件的每個內存頁面,釋放任何內存(通常釋放進程分配的每個資源,包括其他資源(如套接字等))。嚴格地說,物理內存可能被調零,但並不是非常必要的(但是,操作系統的安全級別可能需要將不再使用的頁面歸零 - 可能是Windows NT,2K,XP等),請參閱此Does Windows clear memory pages?)。對同一個可執行文件的另一個調用將創建一個全新的進程,它將映射內存中的相同文件,但對這些頁面的第一次訪問仍然會觸發頁面錯誤,因爲最終它是一個新進程,一個不同的內存映射。所以是的,頁面出現錯誤,但與第一個相比,它們對於同一個可執行文件的第二個實例要便宜很多。
當然,這只是關於可執行文件(包含代碼和只讀數據的段/模塊)的只讀部分。
可以考慮另一種情況:分叉。在這種情況下,每個頁面都被標記爲寫時拷貝。當每個內存頁面發生第一次寫入時,硬件異常會被OS內存管理器觸發並截獲。操作系統確定是否允許寫入所討論的頁面(例如:如果是堆棧,堆或任何一般的可寫頁面),如果是,則分配內存並複製原始內容,然後允許進程修改該頁面 - 爲了保留其他進程中的原始數據。是的,還有另一種情況 - 共享內存,其中確切的物理內存映射到兩個或更多進程。在這種情況下,寫時複製標誌當然不會在內存頁面上設置。
希望能夠澄清內存頁面正在發生什麼。
您需要檢查系統的「緩存」功能。我高度懷疑你說的是不正確的!也許系統設置有變化。 –