首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当进程终止时,Linux如何处理内存损坏?

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

Unix & Linux用户
提问于 2017-06-10 09:17:10
回答 2查看 4K关注 0票数 2

堆栈溢出有很多问题,询问系统如何处理内存泄漏,以及异常终止时会发生什么。示例:

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共享内存吗?

谢谢!

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2017-06-10 23:54:28

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

在这个过程中是否有内存损坏并不重要。内存损坏的概念是在流程- it的执行上下文中定义的,这意味着内存的内容不是程序员想要的。当这个过程结束时,这个概念就不再有意义了。对于内存泄漏也是如此:当进程退出时,进程的所有内存都会被回收。

共享内存是一个例外,因为它不属于任何单个进程。当进程退出时,回收的全部内容是共享内存上的进程句柄;共享内存本身一直保持到显式删除为止。将共享内存对象看作是一个纯粹存在于内存中且不附加到文件系统的文件。这就像一个没有名字的临时文件。

使用共享内存的进程应该在退出之前清理它。最好是,如果进程使用共享内存,则它应该由监控程序运行,如果主进程崩溃,监控器应该清理共享内存和临时文件等资源。

票数 3
EN

Unix & Linux用户

发布于 2017-06-11 12:24:09

这是否意味着,如果共享内存段以某种方式损坏,那么用户在重新启动系统之前基本上就会崩溃吗?

差不多,但不完全是。用户还可以解除/dev/shm/blah文件的链接,并关闭所有使用共享内存的进程。或者,编写良好的程序可以检测到共享内存已变得不可用,并决定重新创建它。

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

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

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/370338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档