某个操作系统决定清除分配给该进程的内存(数据,代码等)时,某个操作系统上的进程成功终止或异常终止;在退出时或者想要为新进程分配内存时?
这是否会在所有操作系统(winXP,Win7,linux,Mac)上消除内存分配过程相同的程度?
据我所知,页表包含该进程的虚拟地址和内存中的实际物理地址的映射。
感谢。
答案 0 :(得分:4)
操作系统如何回收进程资源可以(通常确实)因操作系统而异。在Windows方面,NT派生的操作系统表现相似,因此win XP和win7之间应该没有什么区别。请注意,在此上下文中询问“内存”是一种过度简化,因为存在不同类型的内存。例如,典型的Windows应用程序将具有堆栈内存,堆内存(有时是多个堆),指令/静态内存以及可能的共享内存。大部分内存仅由进程拥有,Windows将在进程终止时回收(甚至异常终止)。
然而,共享内存可以(并且经常)拥有多个所有者;它绑定到Windows handle(可能从多个进程引用的内核级对象)。句柄具有引用计数,并且如果引用计数变为零,则回收关联的资源。这意味着共享内存可以比引用它的进程更长。此外,过程可能会“泄漏”手柄,并且手柄永远不会被回收。程序员有责任确保这些手柄正确关闭且不泄漏;异常终止的可能性使这一责任复杂化。
另一方面,当Windows'回收'内存时,它只是意味着内存可用于将来分配给其他进程等。实际的1和0通常会坐在那里直到操作系统分配内存< em>和内存的新所有者主动覆盖它。所以'回收'并不意味着内存立即被清零或类似的东西;在这个问题上擦洗记忆是低效的,而且往往是不必要的。如果您要求安全问题,则不应该依赖操作系统;在您的进程将其释放回操作系统之前,您需要自己清理内存。
如果您想更多地了解现代Windows操作系统如何处理内存,并且不介意进行一些挖掘,MSDN上的Windows API文档有很多关于这个主题的信息,但它有点分散。好的起点可能是Windows Handles,以及加载/卸载库/进程调用。如果我没记错的话,Application Programming for Windows (Richter)可能会有一些不错的信息,但我现在手头没有副本可以检查。
希望有更多了解Linux内部人员的人可以解决问题的这一方面。这是特定于操作系统的内容,因此可能存在差异。值得注意的是,NT之前的Windows(例如Windows 95,98等)具有完全不同的进程内存模型。这些差异往往使得操作系统在异常终止的情况下更难回收内存;一些用户发现,如果他们运行不稳定的应用程序,需要经常重启操作系统,以便清理累积的内存泄漏。
答案 1 :(得分:1)
在Linux中,资源通常在流程终止时释放。您可以在此处阅读Linux如何处理流程终止:http://www.informit.com/articles/article.aspx?p=370047&seqNum=4
还有一个OOM杀手可以在极低的内存情况下启动我知道在嵌入式Android世界中的东西已经发生了很多但是我还没有真正掌握它LWN.net可能有一些覆盖