在使用malloc()
和时,sbrk()
我发现该malloc()
函数总是分配最小值,135168 bytes
即使1 byte
有请求也是如此。为什么malloc()
分配这么多内存?我可以分配4 kB
内存大小。假设页块大小为4 kB
。
它不应该分配128 * 1024 = 131072 bytes
而不是135168 bytes
因为阈值是128 kB
在它使用之后mmap()
吗?
我很困扰。我对 的内部工作没有很深入的了解malloc()
。
感谢您的帮助。
答案1
这纯粹是一种优化。猜测是,如果您使用 malloc() 一次,您将多次使用它。因此,有一个初始系统调用来扩展进程空间(这会影响虚拟地址映射并且相对昂贵)。
您请求的金额是从该区域获取的,其地址是从您的 malloc() 调用中返回的。剩余的被添加到空闲列表(最初是空的)。
如果您使用任何 stdio(例如打印 sbrk() 的初始值),那么 stdio 将已经为标准输出的 FILE* 使用的缓冲区创建了第一个 malloc() :您自己的 malloc(1) 从空闲列表。
mmap() 仅用于大型单一分配。小分配使用可以轻松细分的空闲列表区域。