【问题标题】:Opinions and suggestions regarding my approach to first fit malloc function关于我首先拟合 malloc 函数的方法的意见和建议
【发布时间】:2012-07-06 12:48:31
【问题描述】:

我正在为大学作业编写 malloc 函数。这是我想法的基本布局:

1) 定义一个节点结构,其中包含指向前一个节点、下一个节点的指针,以及一个用于大小和空缺的字符。堆中的每个区域都将包含一个带有此信息的隐藏节点。

2)Malloc 函数。从第一个节点循环开始,通过每个节点检查空缺。如果一个节点是空的并且足够大,则将一个 ptr 返回到不包括该节点的区域的开头。如果没有可用空间,请使用 sbrk 为节点分配请求的空间 PLUS 空间。

3)免费功能。转到作为参数sizeof(结构节点)传递的指针并将空缺设置为空缺。然后从列表的开头开始,遍历列表合并相邻的空闲空间。

这种方法听起来如何?我主要关心的是实际启动链表。例如,在开始进行任何分配并将 ptr 作为全局变量存储到它之前,是否应该使用 sbrk 创建一个节点?如果是这样,在允许驱动程序调用 malloc 函数之前如何初始化第一个节点?

提前致谢。我不是要求有人编写我的代码,只是为了提供一些关于我的想法的见解和建议。

【问题讨论】:

    标签: c malloc sbrk brk


    【解决方案1】:
    1. 我会避免在分配节点时将所有簿记信息保留在节点上。我会在块的开头拥有最少的信息(通常只是块大小),但仅此而已。
    2. 我会分别跟踪空闲块和分配块,因此当您搜索空闲块时,您不会在已使用的块上浪费时间。
    3. 我会将空闲列表分成两部分,然后懒惰地合并块。换句话说,有一个你要分配的空闲列表,还有一个只是一个保留区。当用户免费调用时,只需将块链接到保持区域,仅此而已。当您用于分配的列表开始不足时,按地址对保留区域中的块进行排序,然后与分配空闲列表合并。然后遍历列表并合并相邻的块。
    4. 当您确实需要调用 sbrk(或其他)来从系统分配更多空间时,不要只分配足够的空间来满足当前的分配请求。相反,分配一个相当大的块(例如,一兆字节),然后将其拆分以满足请求,并将其余块作为块添加到空闲列表中。如果你的内存足够低以至于你必须去 sbrk 一次,那么接下来的几个调用很可能会做同样的事情,所以你还不如贪婪,并立即获取足够的内存来获得满足更多的机会请求。

    第三个的基本思想是尽可能避免合并以增加找到相邻块的机会,所以当你合并时你可能会做一些真正的好事,避免浪费时间尝试合并只有几个相邻的块空闲。

    【讨论】:

    • 您建议如何存储这些列表?我不能使用 mmap 或 malloc,由于列表随着分配而增长,我认为在每个分配上存储一个新节点似乎是个好主意
    • @rmh52:还有其他可能,但我一直使用节点/分配模型。
    猜你喜欢
    • 2011-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多