malloc使用什么系统调用?

问题描述 投票:2回答:2

我正在研究内存管理,并对malloc的工作方式有疑问。malloc man page指出:

通常,malloc()从堆中分配内存,并调整根据需要使用sbrk(2)作为堆的大小。分配块时大于MMAP_THRESHOLD个字节的内存,glibcmalloc()实现将内存分配为私有匿名映射使用mmap(2)MMAP_THRESHOLD默认为128 kB,但使用mallopt(3)可调。

为了验证,我用一段代码做了一个实验:

#include<stdlib.h>
#include<stdio.h>

int main()
{
    int size = 10;
    int *p = malloc(size);

    if(p)
    {
        printf("allocated %d bytes at addr: %p \n", size, p);
        free(p);
    }
    else
    {
        free(p);
    }

    return 0;
}

我使用strace跟踪了该程序,以查看使用了什么系统调用。结果如下:

strace result

为什么在此示例中,malloc调用mmap而不是brk?

c linux memory-management malloc
2个回答
0
投票
通常,他们使用mmap(2)或有时使用sbrk(2)

当然,至少在内存较小的情况下,他们会尽量减少系统调用的次数。


0
投票
实际动作在最后几行:

brk()发出的对malloc()的两次呼叫。

    fstat()和来自write()printf()呼叫。
  • 您可以在main()的顶部添加打印输出,以查看代码何时真正开始运行。当我这样做时,我在write()之前看到了brk(NULL)调用,我在下面用空白行将其标记:
  • ... mmap(0x7f1b34802000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1e7000) = 0x7f1b34802000 mmap(0x7f1b34808000, 15072, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f1b34808000 close(3) = 0 arch_prctl(ARCH_SET_FS, 0x7f1b34a124c0) = 0 mprotect(0x7f1b34802000, 16384, PROT_READ) = 0 mprotect(0x558c3cd9a000, 4096, PROT_READ) = 0 mprotect(0x7f1b34a33000, 4096, PROT_READ) = 0 munmap(0x7f1b34a13000, 128122) = 0 write(1, "start\n", 6) = 6 brk(NULL) = 0x558c3dc58000 brk(0x558c3dc79000) = 0x558c3dc79000 fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 4), ...}) = 0 write(1, "allocated 10 bytes at addr: 0x55"..., 44) = 44 exit_group(0) = ? +++ exited with 0 +++
  • © www.soinside.com 2019 - 2024. All rights reserved.