簡體   English   中英

malloc/free 是系統調用還是 libc 提供的庫例程?

[英]Is malloc/free a syscall or a library routine provided by libc?

如果 malloc/free 在 libc 中作為庫例程實現,那么它是在sbrk系統調用或mmap系統調用之上實現的,還是其他什么?

一般而言,在sys/syscall.h中聲明的函數是否包含目標機器中的所有系統調用?

很多時候, mallocfree使用較低級別的虛擬內存分配服務並一次分配多個頁面(甚至兆字節),使用系統調用,mmapmunmap (可能還有sbrk )。 malloc通常更喜歡在相關時重用以前free內存空間。 大多數malloc實現使用各種不同的策略來進行“大”和“小”分配等......

請注意,可以限制虛擬地址空間,例如使用setrlimit(2) 在 Linux 上使用pmap(1)proc(5)以了解有關某個進程的虛擬地址空間的更多信息(例如/proc/self/maps用於您自己的進程或/proc/1234/maps - 也是pmap 1234命令 - 對於pid 1234 的進程)。

您可以查看您的 GNU libc源代碼,查看其他 C 標准庫(例如musl-libc )的源代碼,閱讀malloc實現,選擇其他一些或實現您自己的,或者使用strace進行實驗找出。

閱讀系統調用手冊頁(即syscalls(2) )和文件<asm/unistd.h>以獲取系統調用列表。


一個非常快的malloc

(我相信這可能是malloc最快的實現;但是它不是很有用;它符合標准,例如n1570或更好)

我堅信 C 標准對mallocfree非常模糊。 我很確定以下功能尊重標准的文字(但不是精神):

 /* politically incorrect, but very probably standard conforming */
 void *malloc (size_t sz) { if (sz>0) errno = ENOMEM; return NULL; }
 void free(void*ptr) { }

當然,您將相應地對callocrealloc進行編碼。

(順便說一句,每個使用malloc代碼都應該針對它的失敗進行測試,但有些 - 錯誤地 - 不要; malloc可以在失敗時返回NULL並且人們應該針對這種情況進行測試)


GNU libc 為你自己的malloc函數提供了鈎子(你甚至可以通過它們透明地使用Boehm 的垃圾收集器)。 這些鈎子可能會被棄用並且是非標准的。

如果使用 GNU libc,還要查看mallinfo(3)malloc_stat(3)以及相關函數。

mallocfree是標准的 C 庫函數,它們將由每個 C 實現實現。

C 標准僅定義了這些函數的行為方式以及對它們的預期行為。 如何在每個實現中實現它們。

簡而言之,它們是您使用的實現的實現細節。

(“實現”由編譯器、鏈接器、運行時庫和其他一些東西組成。)

如果您使用不同的內存分配器,您還可以使用mallocfree的替代實現。 例如,囤積內存分配器有時用於提高多線程應用程序的性能。

暫無
暫無

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

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