2015-12-13 60 views
4

我試過在我的機器上使用sbrk(1),然後故意寫出綁定來測試頁面大小,這是4096字節。但是當我調用malloc(1)時,在訪問135152個字節後,我得到了SEGV,這是多頁面大小的方式。我知道malloc是庫函數,它依賴於實現,但考慮到它最終會調用sbrk,它爲什麼會給出多個頁面大小。任何人都可以告訴我關於它的內部工作?爲什麼malloc(1)給出多個頁面大小?

我的操作系統是Ubuntu的14.04和我的建築是86

更新:現在我想知道是否是因爲malloc的地址返回到空閒列表塊大到足以容納我的數據。但是這個地址可能在堆的中間,所以我可以繼續寫直到達到堆的上限。

+0

你正在使用什麼操作系統和體系結構? 另外,你確定malloc()調用sbrk()嗎? – Crashworks

+0

我不確定,但我的教授和一些在線資源告訴我。我在ubuntu 14.04 –

+2

ITYM 4096下使用x86架構,而不是4086.「(1)」是什麼? 'sbrk'是一個系統調用(2),'malloc'是一個庫函數(3)。 –

回答

6

舊的malloc()使用UNIX的實現sbrk()/brk()系統調用。但是現在,實施使用mmap()sbrk()。該malloc()執行的glibc的(這可能是你在你的Ubuntu 14.04使用的)同時使用sbrk()mmap()而選擇使用哪一個,當你要求通常取決於分配請求的大小,這glibc的動態不分配。

對於小分配,glibc使用sbrk(),對於較大的分配,它使用mmap()。宏M_MMAP_THRESHOLD用於決定這一點。目前,它的默認值是set to 128K。這就解釋了爲什麼你的代碼設法分配135152字節,因爲它大約是128K。儘管您只需要1個字節,但您的實施將分配128K用於有效的內存分配。所以在你超過這個限制之前,segfault纔會發生。

您可以通過使用mallopt()通過更改默認參數與M_MAP_THRESHOLD玩。

M_MMAP_THRESHOLD

對於由M_MMAP_THRESHOLD分配大於或等於(以字節爲單位)指定的限制 無法滿足從 空閒列表,存儲器分配函數採用MMAP(2)而不是使用sbrk(2)增加程序中斷的 。

使用mmap(2)分配內存具有顯着的優點,即分配的內存塊總是可以獨立地被釋放回 到系統。 (相比之下,只有在頂端釋放內存 時才能修剪堆棧)。另一方面,使用mmap(2)存在一些缺點:在釋放列表上未放置釋放空間 供以後的分配重用;內存可能浪費 ,因爲mmap(2)分配必須是頁面對齊的;並且內核必須執行通過 mmap(2)清零內存的昂貴任務。平衡這些因素導致M_MMAP_THRESHOLD參數的默認設置爲 128 * 1024。

此參數的下限是0。上限是 DEFAULT_MMAP_THRESHOLD_MAX:512 * 1024在32位系統或 4 * 1024 * 1024 *的sizeof在64位系統(長)。

注意:現在,glibc默認使用動態mmap閾值。 閾值的初始值爲128 * 1024,但當塊 大於當前閾值且小於或等於 時釋放DEFAULT_MMAP_THRESHOLD_MAX,則向上調整閾值 至釋放塊的大小。當動態閾值生效時,修剪堆的閾值也是動態調整爲動態mmap閾值的兩倍的 。如果設置了參數M_TRIM_THRESHOLD,M_TOP_PAD,M_MMAP_THRESHOLD或M_MMAP_MAX 中的任意一個,則將禁用對mmap閾值的調整。

例如,如果你這樣做:

#include<malloc.h> 

mallopt(M_MMAP_THRESHOLD, 0); 

調用malloc()之前,你可能會看到不同的限制。其中大多數是實現細節,C標準說它是undefined behaviour來寫入你的進程不擁有的內存。因此,要冒你的風險 - 否則,demons may fly out of your nose ;-)

+0

謝謝,你的回答有幫助 –

3

malloc在性能方面的原因大塊分配內存。隨後調用malloc可以從大塊中獲得內存,而不必向操作系統請求很多小塊。這減少了所需的系統調用次數。

this article

當一個進程需要存儲器,一些房間是通過移動上限的堆的前,使用BRK()或SBRK()系統調用創建。由於系統調用在CPU佔用率方面很昂貴,所以更好的策略是調用brk()來獲取大塊內存,然後根據需要分割以獲得更小的塊。這正是malloc()所做的。它將很多較小的malloc()請求聚合爲較少的大型brk()調用。這樣做會顯着提高性能。

注意的malloc使用mmap,而不是brk/sbrk一些現代的實現分配內存,但在其他上面仍然是正確的。

相關問題