Linux 操作系统是否必须取消分配进程';什么是堆内存?

Linux 操作系统是否必须取消分配进程';什么是堆内存?,linux,operating-system,Linux,Operating System,当我搜索“如果malloc和exit没有空闲会发生什么?”时,我可以找到这样的答案:“今天,操作系统将在程序退出后恢复所有分配的内存空间” 在这个答案中,“恢复”是什么意思?。 当进程退出时,操作系统只是删除它的PCB和页表,不是吗? 操作系统是否需要执行其他任务才能完全终止流程? 提前谢谢 对不起我的英语 我的意思是操作系统Linux当一个程序启动时,操作系统会给它分配一些内存。在程序执行期间,程序可以从操作系统请求更多的内存块,并且在不再需要它们时也可以释放它们。当程序退出时,它使用的所有内

当我搜索“如果malloc和exit没有空闲会发生什么?”时,我可以找到这样的答案:“今天,操作系统将在程序退出后恢复所有分配的内存空间”

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

对不起我的英语


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

这对
malloc()/free()
(及其同级和等效项)不与OS1交互。他们管理程序启动时已经从操作系统获得的内存块(称为“堆”)

总之,从操作系统的角度来看,程序是否使用
free()
并不重要。对于程序来说,当不需要一段内存时(通过重用释放的内存块),使用
free()
非常重要



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

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

堆就是内存。操作系统对进程堆一无所知。在malloc(和类似的函数)内部,将调用操作系统服务来将页面映射到进程地址空间。操作系统创建页面,但不关心页面的用途

如果您执行malloc而没有相应的free,那么您的进程将不断从操作系统请求越来越多的页面(直到您达到系统无法分配更多页面的程度)。你所做的只是在你自己的进程中把堆搞砸

当进程退出时,操作系统只需删除分配给堆的页面,应用程序无法释放调用就不会对系统造成任何问题


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

好吧,它需要首先停止属于进程的所有线程(可能除了一个用于在内核模式下运行进程清理的线程)。那些没有在内核上运行的线程可以被标记为“不再运行”,那些正在运行的线程需要中断其内核,以强制这些线程最后一次进入内核。一旦所有用户模式线程/执行停止,就可以开始资源清理,例如内存清理。