相关代码:
write(-1, "test", sizeof("test"));
void * p = malloc(1024);
void * p2 = malloc(510);
write(-1, "hi", sizeof("hi"));
相关strace输出:
write(4294967295, "test ", 5) = -1 EBADF (Bad file descriptor)
brk(0) = 0x601000
brk(0x622000) = 0x622000
write(4294967295, "hi ", 3) = -1 EBADF (Bad file descriptor)
我很惊讶这么低级别的操作不涉及系统调用?
不是每个对malloc的调用都会调用系统调用。在我的linux桌面上,malloc以128KB的块分配一个空间,然后分配空间。因此,我将看到每100-200个malloc调用一次系统调用。在freebsd上,malloc按2MB块进行分配。在您的机器上,数字可能会有所不同。
如果您想在每个malloc上看到系统调用,请分配大量内存(malloc(10*1024*1024*1024))
你认为brk是什么?malloc绝对是在调用系统调用,在这个例子中,系统调用不是"malloc"。
malloc()调用系统brk()函数(在Linux/Unix中),但它只在本地堆耗尽时调用它。也就是说,大多数malloc实现都管理通过brk()获得的内存堆,如果它太小或太碎片化,他们会通过brk()要求更多。