使用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
的理解中存在的缺陷sbrk(2)
,扩展数据段是请求系统提供更多虚拟内存的唯一方法。较新的系统使用mmap(2)
(如果可用),因为当虚拟空间足够大时,它们允许更大的灵活性(每个mmap
ed块作为请求它的进程的新数据段进行管理)<代码>sbrk(2)扩展和收缩数据段,就像堆栈一样。。。。因此,您必须小心使用sbrk(2)
,以防将其与malloc的sbrk
实现混合使用。malloc的操作方式通常不允许您返回通过sbrk(2)
获得的任何内存,如果您混合调用。。。因此,您只能使用它来安全地增长数据段sbrk(2)
也在页面中分配内存。自从分页虚拟内存出现以来,几乎所有的o.s.分配都是以页为单位进行的。较新的系统甚至有不止一个页面大小(例如4Kb和2Mb大小),因此您可以根据应用程序从中获益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)。