当进程终止时,Linux 如何处理内存损坏?

当进程终止时,Linux 如何处理内存损坏?

Stack Overflow 上有很多问题询问系统如何处理内存泄漏以及异常终止时会发生什么。例子:

https://stackoverflow.com/questions/6727383/dynamically-allocated-memory-after-program-termination

https://stackoverflow.com/questions/10223677/when-a-program-terminates-what-happens-to-the-memory-allocated-using-malloc-that

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 自动清除共享内存吗?

谢谢!

答案1

当进程死亡时,其内存由操作系统回收。它被标记为空闲,并且当其他进程需要内存时迟早会分配给其他进程。内存在分配给进程之前总是会被擦除。

在此过程中出现内存损坏并不重要。内存损坏的概念是在进程执行的上下文中的——这意味着内存的内容不是程序员想要的。当进程死亡时,这个概念就不再有意义。内存泄漏也是如此:进程退出时,所有内存都会被回收。

共享内存是一个例外,因为它不属于任何单个进程。当进程退出时,回收的只是该进程在共享内存上的句柄;共享内存本身会保留下来,直到被显式删除为止。将共享内存对象视为纯粹存在于内存中并且不附加到文件系统的文件。它就像一个没有名称的临时文件。

使用共享内存的进程应该在退出之前清理它。优选地,如果进程使用共享内存,则该进程应该由主管进程运行,并且主管进程应该在主进程崩溃时清理共享内存和临时文件等资源。

答案2

这是否意味着如果共享内存段以某种方式损坏,那么用户基本上就完蛋了,直到他们重新启动系统?

几乎,但不完全是。用户还可以取消链接 /dev/shm/blah 文件并终止所有使用共享内存的进程。或者,编写良好的程序可能会检测到共享内存已变得不可用并决定重新创建它。

或者在所有用户进程被杀死后,内核会在用户注销(无需重新启动)时通过 shm_unlink 自动清除共享内存吗?

用户注销是一个用户空间的概念。内核几乎不知道与用户注销相关的任何事情,因此当用户注销时它不会执行任何特殊操作。这是桌面会话管理器进程,负责在用户“注销”(无论这意味着什么)时清除用户的登录会话资源,并且它可能被配置为在用户注销时清除所有用户的 shm我不知道是否有任何会话管理器实现实际上做到了这一点,因为 POSIX shm 通常被认为是全局资源而不是会话资源。

相关内容