首页 文章

关于我的第一个适合malloc功能的方法的意见和建议

提问于
浏览
1

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

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

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

3)自由功能 . 转到作为parameter-sizeof(struct node)传递的指针,并将空缺设置为空 . 然后从列表的开头开始,遍历合并相邻空闲空间的列表 .

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

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

1 回答

  • 2
    • 我会避免将所有簿记信息保存在节点上,而它们在块的开头只有最小的信息(通常只是块大小),但仅此而已 .

    • 我'd track free blocks and allocated blocks separately, so when you'正在寻找一个空闲区块,你不要在已经使用的区块上浪费时间 .
      重新分配,并且's just a holding area. When the user calls free, just link the block into the holding area, nothing more. When the list you'用于分配的第二个开始运行低,按地址对保留区域中的块进行排序,然后与分配空闲列表合并 . 然后遍历列表并合并相邻的块 .

    • 当你需要调用sbrk(或其他)来从系统分配更多空间时,不要只分配足够的空间来满足当前的分配请求 . 相反,分配一个相当大的块(例如,兆字节),然后将其拆分以满足请求,并将其余块作为块添加到空闲列表中 . 如果你在内存上运行得足够低,你必须去sbrk一次,那么接下来几次调用也可能会做同样的事情,所以你可能也会贪婪,并立即获得足够的记忆以获得满足更多要求也是如此 .

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

相关问题