杀死进程仍然被认为对内存管理有害吗?


18

所以我和我的老板就内存管理进行了一些讨论。

我被告知杀死一个进程不允许它释放内存。情况仍然如此,还是那几年前?

我们在这里谈论Windows和OS X.


4
有效问题; 投票重新开放。OP要求提供有关操作系统(本案例中为2个操作系统)行为的具体信息,而不是猜测或争论。
JRobert

哇,从来没有想过这个问题会得到那么快的注意...... :)但是,是的,它基本上是一个“是/否,因为......”的问题。
杰夫

Answers:


7

我学习这些东西已经有很长一段时间了,但是这里有。

当操作系统启动进程时,它会从虚拟内存表中分配页面。操作系统负责维护从虚拟内存表到实际内存或磁盘上交换空间的映射。当进程被终止时,操作系统不会停止给它CPU周期。它做了一些清理项目,其中一项是将所有内存页面标记为空闲。这允许其他应用程序重用它们。操作系统可能还会清理进程拥有的任何资源句柄,自动关闭文件,网络连接,进程到进程管道等。这个过程完全在操作系统的控制之下,无论过程如何死亡,都将采取这些步骤。

请记住,所有这些都适用于操作系统进程。如果您有某种方式的虚拟机,并且它一次运行多个虚拟进程,则VM负责决定如何分配和释放它们。但是,从操作系统看,它仍然看起来像一个过程。因此,在这种情况下,如果您有一个运行多个进程的VM,并且您在VM中杀死其中一个进程,那么您可能不会立即在主机操作系统中获取内存。但是你会在VM中找回它。但是,如果您在操作系统中杀死了VM,那么操作系统将杀死VM(间接杀死VM的进程)并回收所有内存(不需要通过垃圾收集器,free()) ,删除或其他任何东西)。

高度投机:

如果.NET在同一个VM上作为一个具有多个.NET应用程序的虚拟机运行,那么.NET可以保留到尚未GCd的内存,直到它运行GC,而Windows会认为.NET是使用比实际更多。(如果MS非常流畅,那么Windows可以在严格的内存情况下告诉.NET到GC,但几乎没有任何意义,因为这就是磁盘交换空间的用途。)

如果.NET确实以这种方式工作,那么操作系统仍然会将其视为一个用于操作系统目的的过程,它负责决定要保留什么以及丢弃什么,并且通常不会告诉Windows需要它来解决它的问题。开始释放内存。在这一点上,可以想象MS将为.NET构建一个特殊的API,以便.NET进程看起来像Windows进程,除非它们不是,这就是人们可能认为进程内存没有被释放的原因。确实如此; 只是你正在看错了过程。

我不太了解.NET,说它确实以这种方式工作; Java VM当然不会。

猜测结束了。

编辑:就杀死一个对内存管理不利的进程而言,这需要多个进程分配出同一个池(即它们更像是线程而不是实际进程),并且在进程之后内存不会被释放杀害。这几乎需要一个协作式多任务系统,因为据我所知,虚拟内存和先发制人的多任务处理通常是一起实现的(VM可以将进程彼此隔离并防止它们互相踩踏内存)。拥有虚拟内存使得在OS级别的进程之后进行清理变得微不足道; 您只需将进程池中的所有页面移动到空闲池。


优秀答案; 因为你只有几秒钟,我仍然发布了我的。:)
Simon Richter

8

我的经历没问题,杀了。

例如,如果你有4 GB的RAM,其中3 GB正在被游戏使用并且你终止了游戏过程,你可以重新启动游戏而不会出现问题,并且它将再次拥有3 GB的RAM。


同意,这听起来是正确的,它不能“清理”,但我没有看到这是一个问题,因为Sirex说。在NT中,这些过程应该是分开的,但即使回到win98,它似乎也不是问题。如果你可以杀死它,大部分都会消失。从逻辑上讲,人们会尝试让系统关闭它,或者先将它关闭,然后强制它实际上被杀死,作为给予它的最后机会。
Psycogeek 2011年

8

问号标签(Windows和OS X)中列出的操作系统实现了虚拟内存,其中每个进程都有自己的地址空间,然后由操作系统映射到物理内存。这些映射表用于在进程终止时清理内存分配,因此内存完全释放。物理页面可以在多个进程之间共享,在这种情况下,当没有更多用户时它们被释放。

通常,其他资源(如文件句柄)以功能的形式提供给进程,其中进程接收资源上的句柄并通过明确定义的访问函数对其进行操作。操作系统保持从句柄值到提供函数的内核对象的表映射; 同样,该表可以在进程终止时用于清理。

有一些特殊资源可以在创建它们的过程中继续存在,例如,可以创建可用于进程间通信的持久命名共享内存分配。这些很少使用,正是因为OS无法确定它们是否仍然是必需的。

在其他操作系统中,有时没有明确的过程分离; 这将清理负担放在个别应用程序上。

强行关闭流程将终止流程而不给予任何清理机会; 如果操作系统具有所有资源的完整列表,则不会产生任何不利影响。


5

那是在内存管理得到广泛实施的前一天。如今,你可能错过的唯一内存是驱动程序和内核模块使用的内存,这些内存仍然是非熟练或僵尸,但那真的是花生。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.