Malloc 从称为堆的进程的虚拟内存区域之一分配内存。
堆的初始大小是多少(在执行开始之后和任何 malloc 调用之前)?说,如果堆从 X 虚拟地址开始并在 Y 虚拟地址结束,我想知道 X 和 Y 之间的区别。
我已经阅读了之前提出的重复问题的答案。
写的答案都是在虚拟地址的上下文中,但我想知道物理页面是如何分配的。
我不确定,但我认为这个初始大小(X-Y)在操作系统中不会有相应的页表条目。如果我错了,请纠正我。
现在,假设有一个分配(和使用)10 字节内存的请求,将分配一个新页面。那么,所有进一步的内存请求将从这个页面得到满足,还是每次分配一个新页面时?谁来决定这个?
当内存被释放时(使用 free()),那么这个分配的物理页面将在什么时候被释放并标记为可用?我知道虚拟地址和物理页面不会立即释放,因为释放的内存量可能非常少。那么物理地址和虚拟地址的对应关联会在什么时候终止呢?
如果我的问题听起来很奇怪,我很抱歉。我只是一个新手,试图了解内部结构。
最佳答案
通常,您可以将物理页面视为临时分配的。如果您的程序正在使用的内存交换到磁盘,那么您的虚拟地址和物理 RAM 之间的关联随时都可能被删除,而该物理 RAM 将用于其他用途。
如果程序稍后访问该内存,操作系统将为该虚拟页面分配一个新的物理页面,将数据从页面文件复制回物理内存,并完成内存访问。
因此,为了回答您的问题,当您的程序不再使用其中或之前放置的分配时,可能会将物理页面标记为可用。或者之后,因为 malloc 并不总是费心将内存释放回操作系统。你真的无法预测这些东西。
这一切都发生在内核中,从 C 的角度来看它是不可见的,就像 CPU 缓存的内存在 C 中是不可见的一样。好吧,直到你的程序由于交换而大幅减慢之前是不可见的。显然,如果您禁用交换文件,那么事情会发生一些变化:不是您的程序因交换而变慢,而是某个地方的某个程序将无法分配内存,或者某些东西将被 OOM 杀手杀死。
关于c - 在 malloc 和 free 调用期间如何分配和释放物理页?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4069245/