簡體   English   中英

malloc 使用什么系統調用?

[英]What syscall does malloc use?

我正在研究 memory 管理並對 malloc 的工作原理有疑問。 malloc 手冊頁指出:

通常, malloc()從堆中分配 memory ,並根據需要調整堆的大小,使用sbrk(2) 當分配大於MMAP_THRESHOLD字節的 memory 塊時,glibc malloc()實現使用mmap(2)將 memory 分配為私有匿名映射。 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跟蹤了這個程序,看看使用了什么系統調用。 結果如下:

跟蹤結果

為什么在這個例子中 malloc 調用 mmap 而不是 brk?

所有這些mmap()調用都是程序在加載共享庫時啟動的一部分。 這是您在對大多數程序進行strace時會看到的標准內容。

真正的動作在最后幾行:

  • 來自malloc()的兩次對brk()的調用。
  • 來自printf()fstat()write()調用。

您可以在main()的頂部添加打印輸出,以查看您的代碼何時真正開始運行。

(重要的是直接調用write()系統調用,而不是使用printf()puts()打印。stdio 函數在內部調用malloc() ,這混淆了我們正在嘗試測試的內容。)

#include <unistd.h>

int main()
{
    write(1, "start\n", 6);

    ...
}

當我這樣做時,我在brk(NULL)之前看到write()調用,我在下面用空行標記:

...
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 +++

大多數libc實現都是開源的。 研究glibcmusl-libc的源代碼。 兩者都實現mallocfree 也可以使用strace(1)

通常,他們使用mmap(2)或有時使用sbrk(2)

當然,他們盡量減少系統調用的數量,至少對於較小的 memory 大小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM