malloc和free调用期间物理页如何分配和释放?

Ash*_*ish 5 c malloc operating-system linux-kernel

Malloc 从进程的称为堆的虚拟内存区域之一分配内存。堆的初始大小是多少(在执行开始之后和任何 malloc 调用之前)?比如说,如果堆从 X 虚拟地址开始并以 Y 虚拟地址结束,我想知道 X 和 Y 之间的区别。

我已阅读之前提出的重复问题的答案。

malloc() 和 free() 如何工作?

写的答案都是在虚拟地址的上下文中,但我想知道物理页是如何分配的。我不确定,但我认为这个初始大小(XY)在操作系统中不会有相应的页表条目。如果我错了,请纠正我。

现在,假设有一个分配(和使用)10 字节内存的请求,将分配一个新页面。那么,所有进一步的内存请求都会从此页面得到满足,还是每次分配新页面时都会得到满足?谁来决定这个?

当内存被释放(使用 free())时,那么什么时候这个分配的物理页将被释放并标记为可用?据我所知,虚拟地址和物理页不会立即释放,因为释放的内存量可能会非常少。那么什么时候物理地址和虚拟地址对应的关联会终止呢?

如果我的问题听起来很奇怪,我很抱歉。我只是一个新手,试图了解内部原理。

Ste*_*sop 4

通常,您可以将物理页视为临时分配的。如果您的程序正在使用的内存被交换到磁盘,那么随时可以删除虚拟地址和物理 RAM 之间的关联,并将该物理 RAM 用于其他用途。

如果程序稍后访问该内存,操作系统将为该虚拟页分配一个新的物理页,将数据从页面文件复制回物理内存,并完成内存访问。

因此,为了回答您的问题,当您的程序不再使用放入其中的分配时或之前,物理页可能会被标记为可用。或者之后,因为 malloc 并不总是费心将内存释放回操作系统。你真的无法预测这些东西。

这一切都发生在内核中,从 C 的角度来看它是不可见的,就像 CPU 的内存缓存从 C 中是不可见的一样。好吧,直到你的程序由于交换而大幅减慢之前是不可见的。显然,如果禁用交换文件,情况就会发生一些变化:程序不会因交换而减慢速度,而是某个地方的某些程序将无法分配内存,或者某些程序将被 OOM 杀手杀死。