gpt4 book ai didi

c - 堆内存和板坯分配

转载 作者:IT王子 更新时间:2023-10-29 00:26:22 26 4
gpt4 key购买 nike

我对 heap 感到困惑和 free list .我有几个问题,我对 malloc 在 C 中的工作原理有自己的理解。如果我错了,请纠正我。

  • 堆内存是否组织为数据的链表(自由表) block ?
  • 堆内存和空闲列表有区别吗?

我对存储分配的理解(有待改进):-当我们调用 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 ”。

  • 当它在空闲列表中时,它是如何分配的?
  • 将一 block 内存返回到空闲列表__与释放该 block 有什么区别?
  • slab 分配与存储分配有何不同

最佳答案

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com