我很困惑就heap
和free list
。 我有几个问题,我有我自己的如何C. malloc的作品,请纠正我,如果我错了理解。
- 被组织成一个链表数据块(空闲列表)堆内存?
- 有堆内存和空闲列表之间的区别吗?
我的存储分配(开放的改进)的理解: -当我们调用malloc,它在堆中分配内存,并从挑选合适大小的数据块这样做free list
,对不对?
当特定内存块由malloc返回,它是从自由列表中删除,该内存块的物理地址的页表进行更新。
当存储器被用free'd free()
数据块被插回到在自由列表,以及可能的,以减少碎片,联体与相邻块,并且present
在页表条目的位被清除。
所以整个堆是一个免费的列表(空闲块的链表)+分配的数据块。
是存储分配的全貌?
编辑:从内存管理Linux内核开发(罗伯特·拉姆)章, 板坯分配
“A空闲列表包含可用的块,已经被分配,数据结构,当代码要求的数据结构的一个新实例,它可以抓住结构中的一个关闭空闲列表,而不是分配的存储器足够量并对其进行设置对于数据结构。后来,不再需要的数据结构时,它返回到空闲列表,而不是释放。在这个意义上,自由列表作为一个对象缓存,缓存经常使用的类型的对象。”
自由列表被提及为“可用,分配的数据结构的块。”
- 它是如何分配的 ,当它在一个自由列表?
- 而如何将返回的内存块空闲列表_ _ 不一样解除分配块?
- 如何从存储分配板分配不同
malloc()
是不是真的关系到页表; 它分配的虚拟地址,内核负责跟踪的页被实际存储在物理内存或磁盘上。
malloc()
经由所述内核交互brk()
系统调用,它要求内核分配更多的页面的过程中,或释放的网页回内核。 因此,有真正的内存分配两个层次:
- 内核分配页面的进程,使这些页面的其他进程无法使用。 从内核的角度来看,该页面可以位于任何地方和他们的位置由页表跟踪,但是从过程的角度来看,这是一个连续的虚拟地址空间。 该“计划中断”是
brk()
操纵的是会造成分段错误,如果你试图访问这些地址,内核可以让你访问(因为它们对应于分配页)和地址之间的边界。 -
malloc()
分配用于由所述程序使用该程序的数据段的可变大小的部分。 当有没有数据段的当前大小中足够的自由空间,它使用brk()
来从内核更多的页面,使数据段更大。 当它发现在数据段的末尾一些空间是未使用的,它使用brk()
给未使用的页面回内核,使得数据段较小。
需要注意的是网页即使在这一过程中运行的程序实际上并未使用任何网页被分配给进程(内核)。 如果free()
多数民众赞成设在你的数据段的中间的内存块,实行free()
不能使用brk()
因为还有更高的地址以外的分配块缩小数据段。 因此,网页仍然分配给从内核的角度来看你的程序,即使他们是“自由空间”,从malloc()
的角度来看。
你的空闲列表是如何工作的描述听起来我的权利,虽然我在内存分配是如何实现的不是专家。 但是你从罗伯特·爱张贴的报价听起来就像是在谈论在Linux内核中的内存分配,这是无关的内存分配malloc()
一个用户空间的过程中。 那种自由列表可能工作方式不同。
你要做的第一件事是内核和程序分配区分。 就像@Wyzard说,malloc的使用BRK(SBRK有时MMAP),以获得从内核更多的网页。 我的malloc的理解是扎成非常好,但它跟踪可以称之为一个舞台。 它介导对内存的访问,并会作出适当的系统调用来分配内存是必要的。
空闲列表是管理内存的一种方式。 调用MMAP或BRK每次需要更多的内存从内核是缓慢和低效时间。 这两种都需要上下文切换到内核模式,将分配的数据结构来跟踪进程拥有的内存。 在用户级的免费名单是一个优化不经常询问并返回内存的内核。 用户程序的目标是做它的工作,而不是等待内核做其工作。
现在回答你的其他问题:
想自由列表的另一种方式是作为高速缓存。 程序会发出请求和内核会尽量满足他们的点播,而不是一下子。 然而,当一个程序与一块内存中完成,快速路径不是这回内核,但把它放在安全的地方,需要重新分配。 特别是,自由列表可跟踪分配器可以拉,但以这样的方式做到这一点(与内存保护)的内存区域,用户代码不能只是增选,并开始写了这一切。
如果我们假设,真正重新分配一个块需要返回这个内核并让它更新其内部页表,然后区别真的出在什么地方拥有底层物理页面(或帧)的控制。 其实并重新分配内存返回给内核现在意味着内核可以从这些页面拉,而使其返回到用户级别的自由列表意味着该计划的某些部分仍控制着该内存。
这是开始得到一些不同的区域(我不是非常熟悉)。 slab分配器是内核管理内存分配的一种方式。 从我所看到的,板坯试图组分配到不同的大小,并且为满足这些请求的页面池。 相信共同x86体系结构将允许连续的,物理存储器分配在两个从16字节到4 MB功率(虽然我在64位机器上)。 我相信,在这个级别的自由列表的一些概念,以及如何高效的升级或降级分配大小,允许不同的系统需求。
在另一方面,存储分配听起来像是确保有对你的硬盘空间。 我居然还没有听说过这个词,所以我只能猜测。
在这里,你指的是两个不同的分配器,
- 伙伴系统分配器,用于分配的页面区域,采用free_list存储空白页,对其进行分配,释放后,如果可能的话将它们合并回高阶一个更大的连续页面大小。
- slab分配器这像keme_cache,kmalloc的呼叫已经分配,数据结构的工作原理。
参阅堆内存在C程序设计为堆。
对于在用户空间C程序,我们在其中的malloc发生在CALL_STACK堆内存。 这是通过由SBRK()时需要更多的存储器先进_break标记。
在Linux内核中每个进程都有它的task_struct都有自己的堆栈和指针,通过它使用的页面列表。