使用mmap和malloc在同一程序中分配内存安全吗?

使用mmap和malloc在同一程序中分配内存安全吗?,c,malloc,mmap,C,Malloc,Mmap,到目前为止,我的理解如下: malloc内部使用sbrk和brk通过增加堆顶来分配内存 mmap以页的形式分配内存 现在,让我们假设sbrk/malloc的当前顶部是0x001000。我使用mmap分配一个4KB的页面,该页面分配在0x002000处。后来,如果我多次使用malloc,因此必须增加sbrktop。那么,如果top达到0x002000 因此,如果有人能澄清以下几点,那就太好了 上述情况可能吗 如果没有,请指出我对malloc和mmap的理解中存在的缺陷 如果是,我认为以这种方式使用

到目前为止,我的理解如下:

  • malloc
    内部使用
    sbrk
    brk
    通过增加堆顶来分配内存
  • mmap
    以页的形式分配内存
  • 现在,让我们假设
    sbrk/malloc
    的当前顶部是
    0x001000
    。我使用
    mmap
    分配一个4KB的页面,该页面分配在
    0x002000
    处。后来,如果我多次使用
    malloc
    ,因此必须增加
    sbrk
    top。那么,如果top达到
    0x002000

    因此,如果有人能澄清以下几点,那就太好了

  • 上述情况可能吗
  • 如果没有,请指出我对
    malloc
    mmap
    的理解中存在的缺陷
  • 如果是,我认为以这种方式使用它是不安全的。那么,有没有其他方法可以安全地使用这两种设备呢
  • 多谢各位

  • malloc今天通常不会以这种方式实现。。。malloc在旧的实现中使用了
    sbrk(2)
    ,扩展数据段是请求系统提供更多虚拟内存的唯一方法。较新的系统使用
    mmap(2)
    (如果可用),因为当虚拟空间足够大时,它们允许更大的灵活性(每个
    mmap
    ed块作为请求它的进程的新数据段进行管理)<代码>sbrk(2)扩展和收缩数据段,就像堆栈一样。。。。因此,您必须小心使用
    sbrk(2)
    ,以防将其与malloc的
    sbrk
    实现混合使用。malloc的操作方式通常不允许您返回通过
    sbrk(2)
    获得的任何内存,如果您混合调用。。。因此,您只能使用它来安全地增长数据段

  • sbrk(2)
    也在页面中分配内存。自从分页虚拟内存出现以来,几乎所有的o.s.分配都是以页为单位进行的。较新的系统甚至有不止一个页面大小(例如4Kb和2Mb大小),因此您可以根据应用程序从中获益

  • 随着64位系统得到越来越多的使用,分配足够大的地址空间以允许两个机器共存是没有问题的。对于多堆malloc实现来说,这是一个优势,因为内存是独立分配和释放的,并且从不以后进先出的顺序分配

  • Malloc使用不同的方法分配内存,但实现通常不会干扰用户
    sbrk(2)
    的使用。在
    sbrk(2)
    malloc系统中,如果将
    malloc(3)
    调用与
    sbrk(2)
    混合,则必须小心。然后,您将面临
    sbrk(2)
    覆盖malloc调整后的数据段并破坏malloc内部数据结构的风险。如果您正在使用malloc的
    sbrk(2)
    实现,最好不要自己使用
    sbrk(2)


    最后,为了回答您的问题,
    mmap(2)
    malloc(3)
    那样分配内存,因此malloc没有,也不必知道您为自己使用
    mmap(2)

    而分配的内存,您可以在单个程序中同时使用
    malloc()
    mmap()
    ;事实上,这很难避免。实现(库和内核)将跟踪内存分配并避免出现问题。现代的
    malloc()
    不一定使用
    sbrk()
    (它可以使用
    mmap()
    本身),而且它有很多方法来跟踪以前使用过的东西,等等。另外,由于有64位地址空间,东西分配的距离通常不会太近,从而导致麻烦,除非您试图指定数据为
    mmap
    'd的地址。谢谢@JonathanLeffler帮我澄清疑问。通常
    sbrk
    会失败(返回错误),如果它会影响mmap'ed内存。因此,如果您已将某个内容添加到接近sbrk堆的位置,这可能会导致基于sbrk的malloc过早失败(从malloc返回NULL)。