关于我的首次拟合malloc函数方法的意见和建议

关于我的首次拟合malloc函数方法的意见和建议,c,malloc,sbrk,brk,C,Malloc,Sbrk,Brk,我正在为大学作业写一个malloc函数。以下是我想法的基本布局: 1) 定义一个节点结构,其中包含指向上一个节点、下一个节点的指针,以及大小和空缺的字符。堆中的每个区域将包含一个包含此信息的隐藏节点 2) Malloc函数。从第一个节点循环开始,通过每个节点检查空缺。如果节点空闲且足够大,则将ptr返回到不包括该节点的区域的开头。如果没有可用空间,请使用sbrk为节点分配请求的空间和空间 3) 自由功能。转到作为参数sizeof(结构节点)传递的指针,并将空缺设置为空缺。然后从列表的开头开始,遍

我正在为大学作业写一个malloc函数。以下是我想法的基本布局:

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

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

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

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

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

  • 我会避免在分配节点时将所有簿记信息保留在节点上。在块的开头,我会有最基本的信息(通常只是块大小),但仅此而已
  • 我会分别跟踪空闲块和分配的块,这样当您搜索空闲块时,就不会在已经在使用的块上浪费时间
  • 我会将空闲列表分成两部分,然后懒洋洋地合并块。换句话说,有一个你分配的自由列表,另一个只是等待区。当用户呼叫空闲时,只需将区块链接到等待区域,就可以了。当用于分配的列表开始变低时,按地址对保留区中的块进行排序,然后与无分配列表合并。然后遍历列表并合并相邻的块
  • 当您确实需要调用sbrk(或其他)来从系统分配更多空间时,不要只分配足够的空间来满足当前的分配请求。相反,分配一个相当大的块(例如,一兆字节),然后拆分该块以满足请求,并将剩余的块作为块添加到空闲列表中。如果您的内存不足,必须去sbrk一次,那么接下来的几个调用可能也会这样做,因此您最好贪婪一点,立即获取足够的内存,以便有足够的机会满足更多的请求

  • 第三种方法的基本思想是尽量避免合并,以增加找到相邻块的机会,因此当您合并时,您可能会做一些真正的好事,并避免在只有几个相邻块可用时浪费时间尝试合并。

    您建议如何存储列表?我不能使用mmap或malloc,因为列表随着分配的增加而增加,所以我认为在每个节点上存储一个新节点似乎是个好主意allocation@rmh52:还有其他可能性,但我一直使用节点/分配模型。