据我所知,函数brk(),sbrk()用于重新分配内存,但是它们与realloc()函数有何不同?

最佳答案

brksbrk是系统调用(在内核中实现),而mallocfreerealloc是用户空间中的库函数。因此,malloc等函数在内部使用brksbrk但提供了其他功能(有关brk的更多详细信息,请参见man(2);有关malloc的更多详细信息,请参见man(3)。)
brk通过向内核提供指向程序可能使用的最大虚拟内存位置的指针,仅告诉内核程序要使用多少内存。但是,您只有一整块内存。
malloc可帮助您将巨大的内存块 segmentation 为较小的部分。

示例代码在这里没有多大意义,因为brkmalloc在不同的级别上工作。但是您可能会想到如何实现mallocfree的非常简单(且不是线程安全的)版本,以及在那里使用brk的位置:

  • 我们的原始malloc的基本数据结构是一个链表。
  • 列表中的每个列表元素都包含:
  • 的大小
  • 指向下一个元素的指针
  • 如果该块正在使用中,则为标志
  • 一个标志,如果它是最后一个元素
  • 具有给定大小的字节数组
  • 在每个调用中,malloc遍历列表并检查每个块
  • 如果该块被标记为“未使用”,则
  • 如果列表元素的大小字段最大为所需大小,则为
  • 如果malloc找到了这样的块,它将:
  • 将列表元素标记为已使用
  • 调整列表元素
  • 中的大小字段
  • 如果有足够的空间,则在该元素之后添加一个list元素,指向列表中的下一个元素(如果适用)
  • 返回指向找到的列表元素的字节数组的指针
  • 如果malloc找不到这样的列表元素,它将
  • 调用brk以增加我们从内核
  • 获得的可用内存
  • 在列表末尾添加一个新元素,将大小设置为所需的大小
  • 将此元素标记为正在使用AND作为最后一个元素
  • 返回指向新创建的列表条目
  • 的字节数组的指针

    正如@BasileStarynkevitch在他的评论中所述,作为brk的替代品,您还可以使用mmap(带有fd=-1flags=MAP_PRIVATE|MAP_ANONYMOUS)来保留由交换文件支持的单个内存块。有关mmap的详细信息,请参见man(2)

    10-06 15:22