- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我对 heap
感到困惑和 free list
.我有几个问题,我对 malloc 在 C 中的工作原理有自己的理解。如果我错了,请纠正我。
我对存储分配的理解(有待改进):-当我们调用 malloc 时,它会在堆中分配内存,并通过从 free list
中选择一个合适大小的数据 block 来实现。 , 正确的 ?
当 malloc 返回某个内存块时,它会从空闲列表中删除,并在页表中更新该内存块的物理地址。
当使用 free()
释放内存时,数据 block 被插入到空闲列表中,并且可能 ,以减少碎片,与相邻 block 连接,并且 present
页表条目中的位被清除。
所以整个堆是一个free-list(空闲 block 的链表)+分配的数据 block 。
这是存储分配的综合图吗?
编辑:来自 Linux 内核开发 (Robert Love) 关于内存管理的章节,Slab 分配
"A free list contains a block of available, already allocated, data structures. When code requires a new instance of a data structure, it can grab one of the structures off the free list rather than allocate the sufficient amount of memory and set it up for the data structure. Later, when the data structure is no longer needed, it is returned to the free list instead of deallocated. In this sense, the free list acts as an object cache, caching a frequently used type of object."
空闲列表被称为“可用的、分配的数据结构 block ”。
最佳答案
malloc()
与页表没有真正的关系;它分配虚拟地址,内核负责跟踪页面实际存储在物理 RAM 或磁盘中的位置。
malloc()
通过brk()
系统调用与内核交互,它要求内核为进程分配更多的页面,或者将页面释放回核心。所以实际上有两个级别的内存分配:
brk()
操作的“程序中断”是内核允许您访问的地址(因为它们对应于已分配的页面)和您尝试访问时将导致段错误的地址之间的边界他们。malloc()
分配程序数据段的可变大小部分供程序使用。当数据段的当前大小内没有足够的可用空间时,它使用 brk()
从内核获取更多页面,使数据段更大。当它发现数据段末尾的一些空间未被使用时,它使用 brk()
将未使用的页面还给内核,从而使数据段变小。请注意,页面可以分配给一个进程(由内核),即使在该进程中运行的程序实际上并未使用这些页面做任何事情。如果您 free()
位于数据段中间的内存块,则 free()
的实现不能使用 brk()
缩小数据段,因为在更高的地址上还有其他分配的 block 。因此,从内核的角度来看,页面仍然分配给您的程序,即使从 malloc()
的角度来看它们是“空闲空间”。
您对空闲列表如何工作的描述对我来说听起来很正确,尽管我不是如何实现内存分配器的专家。但是您从 Robert Love 发表的引述听起来像是在谈论 Linux 内核中的内存分配,这与用户空间进程中 malloc()
的内存分配无关。那种空闲列表的工作方式可能不同。
关于c - 堆内存和板坯分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10116033/
我是一名优秀的程序员,十分优秀!