操作系统是否必须释放进程的堆内存?

时间:2017-03-28 08:59:11

标签: linux operating-system

当我搜索“如果发生了什么情况并且没有免费退出?”,我可以找到答案说“今天,OS将在程序退出后恢复所有分配的内存空间”。

在那个答案中,“恢复”是什么意思? 操作系统只是在进程退出时删除它的PCB和页表吗? 操作系统是否需要执行其他任务才能完全终止进程? 谢谢你提前。

抱歉我的英文。

PS。我的意思是OS Linux

2 个答案:

答案 0 :(得分:2)

当程序启动时,操作系统会为其分配一些内存。在程序执行期间,程序可以从OS请求更多的内存块,并且当它不再需要它们时它也可以释放它们。程序退出时,它使用的所有内存都将返回给操作系统。

malloc()/free()(及其兄弟姐妹和等同物)不与OS 1 交互。他们管理一个内存块(称为" heap"),该程序在启动时已经从操作系统中获得。

总而言之,从操作系统的角度来看,如果您的程序使用free(),则无关紧要。对于程序,当不需要一块内存来让进一步的分配成功时(通过重用释放的内存块),使用free()非常重要。

1 这不完全正确。 malloc()的实现可能会从操作系统获得更多的内存块,以便在堆满时扩展堆,但此过程对程序是透明的。从程序的角度来看,malloc()free()在已经属于该程序的内存块中运行。

答案 1 :(得分:2)

操作系统在进程中分配和管理内存页面。作为退出时进程清理的一部分,操作系统必须释放分配给进程的页面。这包括页表,页面文件空间和映射到逻辑页的物理页面帧。这需要很复杂,因为多个进程可能映射到需要某种形式的引用计数的相同物理页面帧。

堆只是内存。操作系统不了解任何过程堆。在malloc(和类似的函数)内部,将调用操作系统服务将页面映射到进程地址空间。操作系统会创建页面,但不关心页面的用途。

如果您使用没有相应免费的malloc,您的流程将继续从操作系统请求越来越多的页面(直到您达到系统无法分配更多页面的程度)。你所做的只是在你自己的过程中搞砸堆。

当进程退出时,操作系统将摆脱分配给堆的页面,而应用程序无法自由调用将导致系统没有任何问题。

因此,有一个两级系统在起作用。 malloc分配字节。操作系统分配页面。