什么操作系统不会在程序退出时释放内存?

时间:2010-06-27 02:13:58

标签: memory-management operating-system

This question让我很好奇。像这样的问题总能得到答案,“它通常是安全的,但你不应该假设操作系统会为你做这个”,这听起来对我很好,但我想知道:有没有积极开发(发布)那些不这样做的操作系统?

这件事是在恐龙时代(80年代)修复过来的吗?

3 个答案:

答案 0 :(得分:10)

简短回答是“无”。甚至几年前在DOS上的程序也会在程序终止时释放内存(简单地说,当程序停止时没有任何东西可以管理内存)。我敢肯定有人可能会看到内核模式代码不一定在app退出时释放它的内存,或者他们可能会引用一些模糊的嵌入式操作系统....但你可以假设app-exit返回你的用户模式代码所获得的所有内存。 (Windows 3.x可能遇到此问题,具体取决于使用的分配器...)

你应该“释放记忆”的原因在于,对于大规模的软件工程,你应该努力开发灵活使用的组件,因为你永远不知道其他人如何改变其使用你的代码离开团队很久很久。

这样想。假设您设计了一些设计为单例的类(仅在应用程序生命周期内实例化一次)。因此,当组件破坏或最终确定时,您决定不打扰内存清理。对那一刻来说,这是一个非常好的决定。多年以后,在你离开绿色牧场后,其他人可能会出现并决定他们需要在多个地方使用你的课程,这样很多实例会在应用程序生命周期中来来往往。你的内存泄漏将成为他们的问题。

在我的团队中,我们经常谈到让用户启动“关闭”应用程序只是exit()而不进行任何清理。如果我们这样做,我仍然会强制团队开发适当清理的类和组件。

答案 1 :(得分:3)

在CP / M中,这不是一个释放内存的问题,因为你的程序有一个静态的RAM区域,而且每个程序都在相同的空间中运行。因此,当程序A退出,程序B运行时,B只是简单地加载到A之上。

现在有一些机制可以从操作系统中保留内存,但这通常不是堆内存(在我们今天考虑的典型情况下),它是为各种任务设计的特殊保留区域。

例如,DOS有一个名为“Terminate and Stay Resident”的退出例程。这个“退出”程序,但在程序退出后没有释放空间。通常,这些程序加载中断向量(例如键盘中断)以触发例程。 Borland Sidekick是当天非常受欢迎的“TSR”,并提供计算器和联系人名单等内容。

最后,由于这些不是受保护的内存系统,您的程序可能会以各种方式滥用系统来执行您想要的操作,但这是一个不同的讨论。

答案 2 :(得分:1)

当进程退出时,最近没有类似unix的操作系统无法释放所有进程内存,最近可能意味着“自1970年以来”。我很确定很老的PC操作系统,如DOS和CP / M都有这个问题,还有一些旧版本的Windows。我对目前最近的Windows不太了解,但如果任何Windows XP,Vista或Windows 7在释放进程内存方面存在问题,我会感到非常惊讶。

根据经验,我建议任何不使用虚拟内存为进程提供单独地址空间的操作系统在进程以主要方式失败时可能容易泄漏内存。一旦操作系统实现了每个进程的虚拟地址空间,它就必须跟踪分配给进程的所有物理内存,因此可靠地释放它是非常简单的。

所有这一切,无论如何,编写程序来清理自己通常是一个好主意。它往往会导致设计更好的子组件,并且还可以更容易地应用寻找内存泄漏等的工具。