當程序終止時,Linux 如何處理記憶體損壞?
Stack Overflow 上有很多問題,詢問系統如何處理記憶體洩漏以及異常終止時會發生什麼。例子:
https://stackoverflow.com/questions/6727383/dynamically-allocated-memory-after-program-termination
https://stackoverflow.com/questions/2975831/is-leaked-memory-freed-up-when-the-program-exits
但是,我找不到任何關於記憶體損壞的文章。Linux核心對記憶體洩漏和記憶體損壞的處理是否相同?當程序退出時,損壞的記憶體段是否被釋放和回收,其他程序是否可以安全使用它們?
另外,使用 POSIX 共享記憶體 (/dev/shm) 的程序呢?據我了解,共享記憶體似乎不會被系統回收,除非它被 shm_unlink 刪除。(http://man7.org/linux/man-pages/man7/shm_overview.7.html)這是否意味著如果共享記憶體段以某種方式損壞,那麼使用者基本上會被搞砸,直到他們重新啟動系統?或者在所有使用者程序被殺死後,核心會在使用者註銷(無需重新啟動)時自動通過 shm_unlink 清除共享記憶體嗎?
謝謝!
當一個程序死亡時,它的記憶體被作業系統回收。它被標記為空閒,並且遲早會在其他程序需要記憶體時分配給其他程序。記憶體在分配給程序之前總是被擦除。
過程中是否存在記憶體損壞並不重要。記憶體損壞的概念是在程序執行的上下文中——這意味著記憶體的內容不是程序員想要的。當程序死了,這個概念就沒有意義了。記憶體洩漏也是如此:程序的所有記憶體在退出時都會被回收。
共享記憶體是一個例外,因為它不屬於任何單個程序。當一個程序退出時,所有被回收的只是程序在共享記憶體上的句柄;共享記憶體本身會一直保留,直到它被明確刪除。將共享記憶體對象視為純粹存在於記憶體中且不附加到文件系統的文件。它就像一個沒有名字的臨時文件。
使用共享記憶體的程序應該在退出之前清理它。優選地,如果一個程序使用共享記憶體,它應該由一個主管程序執行,如果主程序崩潰,主管應該清理共享記憶體和臨時文件等資源。