Jef*_*eff 18 windows memory-management macos
所以我正在和我的老板讨论内存管理。
有人告诉我,杀死进程不允许它释放内存。现在还是这样,还是几年前?
我们在这里谈论的是 Windows 和 OS X。
根据我的经验,没问题,杀掉。
例如,如果您有 4 GB 的 RAM,其中 3 GB 正在被游戏使用并且您终止了游戏进程,则您可以毫无问题地重新启动游戏,并且该进程将再次拥有 3 GB 的 RAM。
问题标签中列出的操作系统(Windows 和 OS X)实现了虚拟内存,其中每个进程都有自己的地址空间,然后由操作系统映射到物理内存。这些映射表用于在进程终止时清理内存分配,从而完全释放内存。物理页面可以在多个进程之间共享,在这种情况下,当没有更多用户时,它们会被释放。
通常,其他资源(例如文件句柄)以功能的形式提供给进程,其中进程接收资源的句柄并通过定义良好的访问函数对其进行操作。操作系统保持一个从句柄值到提供函数的内核对象的表映射;同样,该表可用于在进程终止时进行清理。
有一些特殊的资源在创建它们的进程中幸存下来,例如,可以创建可用于进程间通信的持久命名共享内存分配。这些很少使用,正是因为操作系统无法确定它们是否仍然需要。
在其他操作系统中,有时没有明确的进程分离;这将清理的负担放在了单个应用程序上。
强行关闭进程将终止进程,不给它任何清理机会;如果操作系统具有所有资源的完整列表,则不会产生不利影响。
我已经很长时间没有学习这些东西了,但这里是。
当操作系统启动一个进程时,它会从虚拟内存表中为它分配页面。操作系统负责维护从虚拟内存表到实际内存或磁盘交换空间的映射。当一个进程被杀死时,操作系统不会停止给它 CPU 周期。它执行一些清理项目,其中之一是将其所有内存页标记为空闲。这允许它们被其他应用程序重用。操作系统可能还会清理进程拥有的任何资源句柄,自动关闭文件、网络连接、进程到进程管道等。这个过程完全在操作系统的控制之下,无论进程如何死亡,这些步骤都将被执行。
请记住,所有这些都适用于操作系统进程。如果您有某种虚拟机,并且它同时运行多个虚拟进程,那么 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 使得可以将进程彼此隔离并防止它们占用彼此的内存)。拥有虚拟内存使得在操作系统级别的进程之后清理变得微不足道;您只需将所有页面从进程池移动到空闲池。
归档时间: |
|
查看次数: |
3270 次 |
最近记录: |