在linux中,如果malloc无法从预分配的页面分配数据块。它使用mmap()或brk()来分配新页面。我想澄清一些事情:
libc分配器管理每个页面:将它们分成较小的块,将它们分配给进程,释放它们,等等。例如,如果您的程序总共使用4097个字节,则需要使用两个页面,即使实际上分配器为您提供4105到4109个字节之间的空间
答案 0 :(得分:2)
系统级内存分配(通过mmap
和brk
)都是页面对齐和页面大小的。这意味着如果您使用malloc
(或其他分配内存的libc API)少量内存(比如10个字节),可以保证该内存页上的所有其他字节都可读,而不会触发页面错误
Malloc和家人在操作系统返回的页面中进行自己的簿记,因此libc使用的mmap页面除了你分配的任何空间外还包含一堆malloc元数据。
libc分配器知道所有内容的位置,因为它调用brk()
和mmap()
调用。如果它调用mmap()
,则传入一个大小,内核返回一个起始地址。然后libc分配器只将这些值存储在其元数据中。
Doug Lea的malloc实现是一个非常详细记录的内存分配器实现,它的评论将大大阐明分配器如何工作: http://g.oswego.edu/dl/html/malloc.html