【问题标题】:How OS handles memory leaks操作系统如何处理内存泄漏
【发布时间】:2018-09-09 20:09:45
【问题描述】:

我为这个问题搜索了很多,但无法找到我的确切查询,尽管它看起来很笼统,可能已经在某个地方被问过并得到了回答。

我想知道进程导致内存泄漏并终止后会发生什么。在我看来,由于虚拟内存,这没什么大不了的。在所有物理页面仍然可以分配给其他/新进程之后,即使它更早导致内存泄漏(在旧进程导致内存泄漏之后)

但我也在某处读到,由于内存泄漏,您需要重新启动系统,我似乎不明白为什么???

【问题讨论】:

  • 您需要询问特定的操作系统以获得更好的答案,但在大多数现代操作系统中,进程自己的内存在关闭时停止存在,因此那里的泄漏消失了。根据操作系统,共享内存和文件句柄或图形对象等其他资源可能无法自动恢复。
  • 哦,有道理,所以对于大多数流行的操作系统(比如 ubuntu 发行版/windows),它们会恢复内存并且内存泄漏并不危险 ??

标签: memory memory-leaks virtual-memory


【解决方案1】:

推荐阅读:Operating Systems: Three Easy Pieces

在常见的操作系统(例如 Linux、Windows、MacOSX、Android)上,每个 process 都有自己的 virtual address space(而堆内存,例如用于 malloc 或 mmap,位于该虚拟地址空间内) ,当进程终止时,它的整个虚拟地址空间被破坏。

所以内存泄漏不会在进程本身中存活。

可能存在微妙的极端情况(例如,使用 shm_overview(7) 或 shmget(2) 时发生泄漏)。

阅读(适用于 Linux)proc(5),尝试使用 cat /proc/self/maps,另请参阅 this。学习使用valgrind 和Address Sanitizer。

另请参阅Garbage Collection。很相关。

【讨论】:

  • 谢谢。简单的三首曲子也是我们的课程教材! (虽然我不记得它谈论内存泄漏)。再次感谢:D
  • 但它确实解释了虚拟地址空间。
  • 确实是一本非常可爱的书!
【解决方案2】:

在现代操作系统中,地址空间分为用户空间和系统空间。所有进程的系统空间都是相同的。

当您杀死一个进程时,会破坏该进程的用户空间。如果应用程序发生内存泄漏,终止进程可以弥补泄漏。

不过,操作系统也可以在系统空间中分配内存。当操作系统分配系统空间内存出现内存泄漏时,杀死进程并不会释放它。

这就是迫使您重新启动系统的内存泄漏类型。

【讨论】:

  • 为什么不释放系统空间(我假设是内核空间)地址空间?你能多解释一下,或者给我指点好书吗?
  • 因为它是所有进程共享的。整个系统只有一个系统空间。
  • 但是,如果只有该进程使用该系统空间地址,为什么不设计更智能的协议来删除类似于我们对用户空间地址所做的物理映射。
  • 操作系统在中断和异常中执行。过程 !可能会分配缓冲区空间(在系统空间中)并排队和 I/O 请求以读取该缓冲区。进程 2 可能会在 I/O 完成时处理中断,因此它需要访问缓冲区。系统空间中的内存与进程无关。
猜你喜欢
  • 2013-09-01
  • 1970-01-01
  • 2020-03-11
  • 1970-01-01
  • 2015-06-14
  • 2014-05-01
  • 1970-01-01
  • 2018-12-02
  • 1970-01-01
相关资源
最近更新 更多