我对heap
and感到困惑free list
。我有几个问题,我对 malloc 在 C 中的工作方式有自己的理解。如果我错了,请纠正我。
- 堆内存是否组织为数据块的链表(空闲列表)?
- 堆内存和空闲列表有区别吗?
我对存储分配的理解(有待改进):- 当我们调用 malloc 时,它会在堆中分配内存,它是通过从中选择合适大小的数据块来实现的free list
,对吧?
当 malloc 返回某个内存块时,它会从空闲列表中删除,并且该内存块的物理地址会在页表中更新。
当内存被释放free()
时,数据块被插入到空闲列表中,并且可能为了减少碎片,与相邻块结合,并且present
页表条目中的位被清除。
所以整个堆是一个空闲列表(空闲块的链表)+分配的数据块。
这是存储分配的全面情况吗?
编辑:来自 Linux Kernel Development (Robert Love) Chapter on memory Management , Slab allocation
“一个空闲列表包含一个可用的、已分配的数据结构块。当代码需要一个数据结构的新实例时,它可以从空闲列表中抓取其中一个结构,而不是分配足够的内存并设置它用于数据结构。后来,当不再需要数据结构时,将其返回到空闲列表而不是释放。从这个意义上说,空闲列表充当对象缓存,缓存经常使用的对象类型。
空闲列表被称为“可用的、已分配的数据结构块”。
- 当它在空闲列表中时,它是如何分配的?
- 以及如何将一块内存返回到空闲列表_不_与释放该块相同?
- 平板分配与存储分配有何不同