繁体   English   中英

操作系统何时清除进程的内存

[英]when does an operating system wipes out memory of a process

当某个操作系统决定擦除分配给该进程的内存(数据,代码等)时,该进程在某些OS上成功终止或异常终止; 在出口还是想要将内存分配给新进程?

在所有操作系统(winXP,Win7,linux,Mac)上,这种清除内存分配过程是否相同?

我了解,页表具有该进程的虚拟地址与内存中实际物理地址的映射。

谢谢。

操作系统如何回收进程资源(通常)会因操作系统而异。 在Windows方面,NT派生的OS的行为类似,因此win XP和win7之间应该没有什么区别。 请注意,在这种情况下询问“内存”是一种过分的简化,因为存在不同类型的内存。 例如,典型的Windows应用程序将具有堆栈内存,堆内存(有时为多个堆),指令/静态内存,以及共享内存。 此内存的大部分由进程完全拥有,Windows将在进程终止(甚至异常终止)时回收它。

但是,共享内存可以(并且经常)具有多个所有者; 它与Windows句柄 (一个可以从多个进程引用的内核级对象)绑定在一起。 句柄具有参考计数,如果参考计数变为零,则回收关联的资源。 这意味着共享内存可以超过引用它的进程。 同样,进程可能会“泄漏”一个句柄,并且永不回收该句柄。 程序员有责任确保正确关闭这些手柄并且不会泄漏。 异常终止的可能性使这一责任复杂化。

附带说明一下,当Windows“回收”内存时,它仅表示内存可用于将来分配给其他进程等。在操作系统分配内存新所有者之前,实际的1和0通常会放在那儿。的内存会主动覆盖它。 因此,“回收”并不意味着内存立即被清零或类似的东西。 在这种情况下,清理内存效率很低并且通常是不必要的。 如果出于安全方面的考虑而提出要求,则不应该依赖操作系统。 您需要先清理内存,然后将进程释放回操作系统。

如果您想了解有关现代Windows操作系统如何处理内存的更多信息,并且不介意进行任何挖掘,则MSDN上的Windows API文档中有很多有关此主题的信息,但有点分散。 Windows Handles和加载/卸载库/进程调用可能是一个不错的起点。 如果我没记错的话,Windows应用程序编程(Richter)可能对此有一些不错的信息,但是我现在没有手头可以检查。

希望有人对Linux内部有更深入的了解可以解决这个问题。 这是特定于操作系统的内容,因此可能会有差异。 可能值得注意的是,NT之前的Windows(例如Windows 95、98等)具有完全不同的进程内存模型。 这些差异往往会导致OS在异常终止的情况下更难回收内存。 一些用户发现如果他们运行的是不稳定的应用程序,则需要经常重新启动OS,以清除累积的内存泄漏。

在Linux中,通常在进程终止时释放资源。 您可以在此处阅读有关Linux如何处理进程终止的信息: http : //www.informit.com/articles/article.aspx? p=370047& seqNum=4

还有一个OOM杀手,它可以在极端的低内存情况下启动,我知道在嵌入式Android世界中,这种情况一直在发生,但是我还没有真正掌握到它,LWN.net可能涵盖了一些内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM