进程在某些操作系统上成功或异常终止,操作系统何时决定擦除分配给该进程的内存(数据、代码等);在退出时或当它想为新进程分配内存时?
这个清除内存分配过程在所有操作系统(winXP、Win7、linux、Mac)上都相同吗?
据我了解,页表具有该进程的虚拟地址和内存中实际物理地址的映射。
Thanks.
操作系统回收进程资源的方式可能(通常)因操作系统而异。在 Windows 方面,NT 派生的操作系统的行为类似,因此 win XP 和 win7 之间应该没有什么区别。请注意,在这种情况下询问“内存”过于简单化,因为内存有不同类型。例如,典型的 Windows 应用程序将具有堆栈内存、堆内存(有时是多个堆)、指令/静态内存,或许还有共享内存。大部分内存由进程单独拥有,Windows 将在进程终止(甚至异常终止)时回收它。
然而,共享内存可以(并且经常)有多个所有者;它与一个窗户把手 https://stackoverflow.com/questions/902967/what-is-a-windows-handle(可以从多个进程引用的内核级对象)。句柄具有引用计数,如果引用计数变为零,则回收相关资源。这意味着共享内存的寿命可以比引用它的进程的寿命长。此外,进程也可能“泄漏”句柄,并且该句柄永远不会被回收。程序员有责任确保此类句柄正确关闭并且不会泄漏;非正常终止的可能性使这一责任变得复杂。
顺便说一句,当 Windows“回收”内存时,它仅仅意味着内存可用于将来分配给其他进程等。实际的 1 和 0 通常会保留在那里,直到操作系统分配内存and内存的新所有者主动覆盖它。因此,“回收”并不意味着内存立即清零或类似的意思;在这种情况下清理内存效率很低,而且通常是不必要的。如果您出于安全考虑而提出要求,则不应依赖操作系统;在进程将内存释放回操作系统之前,您需要自己清理内存。
如果您想了解更多关于现代 Windows 操作系统如何处理内存的信息,并且不介意进行一些挖掘,MSDN 上的 Windows API 文档有很多关于该主题的信息,但有点分散。好的起点可能是 Windows 句柄和加载/卸载库/进程调用。Windows 应用程序编程 (Richter) https://rads.stackoverflow.com/amzn/click/com/1572319968如果我没记错的话,可能有一些关于这方面的不错的信息,但我现在手头没有副本可供检查。
希望对 Linux 内部结构有更了解的人能够解决这一方面的问题。这是特定于操作系统的内容,因此可能存在差异。值得注意的是,NT 之前的 Windows(例如 Windows 95,98 等)具有完全不同的进程内存模型。这些差异往往会使操作系统在异常终止的情况下更难回收内存;一些用户发现,如果运行不稳定的应用程序,需要经常重新启动操作系统,以清理累积的内存泄漏。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)