2010-05-19 74 views
5

我正在使用malloc_stats()來打印malloc相關統計信息,其中一些程序找到「Arena 0」,一些程序找到「Arena 0和Arena 1」。Malloc中的競技場功能

這些競技場代表什麼?

回答

2

請參閱link text。它看起來像堆是用於處理多個線程之間的內存分配的競技場(「子堆」)的集合,從而減少了爭用。

+0

鏈接不再工作;/ – kokosing 2017-11-16 09:01:24

2

在某些malloc實現中,「競技場」是從中進行單獨分配的內存池。確定使用哪個競技場的算法會因實現而有所不同,所以我們不可能解釋爲什麼你會看到不同。一個共同的因素是分配大小。

+0

你能解釋一下使用GNU C庫的malloc實現會發生什麼嗎? – Vaibhav 2010-05-19 07:51:09

5

堆代碼駐留在glibc組件中,並打包在libc.so.x共享庫中。堆的當前實現使用稱爲arenas的多個獨立的子堆。每個競技場都有自己的併發保護互斥體。因此,如果在一個進程堆中有足夠的場所,並且有一個機制來將線程的堆分佈在它們之間均勻訪問,那麼爭用互斥量的可能性應該是最小的。事實證明,這適用於分配。在malloc()中,進行測試以查看當前線程的當前目標競技場的互斥鎖是否可用(trylock)。如果是這樣,那麼競技場現在被鎖定並且分配繼續。如果互斥量繁忙,則每個剩餘​​的競技場會依次嘗試並在互斥量不繁忙時使用。如果沒有阻擋的情況下不能鎖定競技場,則會創建一個新的新競技場。根據定義,該舞臺尚未鎖定,因此現在可以不分塊地進行分配。最後,一個線程最後使用的競技場ID保留在線程本地存儲中,隨後當該線程下一次調用malloc()時,將其用作第一個競技場。因此,所有對malloc()的調用都將繼續進行而不會阻塞。