堆學習 1 巨集觀觀察

2021-09-27 03:05:18 字數 2226 閱讀 6155

動態記憶體的分配和釋放最重要的就是malloc 和 free 這兩個函式 乙個是用於向作業系統索取動態的記憶體空間 乙個是用於釋放之前通過malloc或者relloc函式分配的空間。其內部通過brk,sbrk和mmap實現對記憶體的索取。

舉個例子 當malloc(1024)的時候 即我們只需要1024bytes,但是程序會向作業系統先批發一塊大的記憶體塊,又因為是主線程所以稱為main arena它是一塊非常大的連續記憶體區域緊鄰在bss,即未初始化資料的下方 下面的圖直接展示了它是在主線程的下方 開闢了132kb大的空間。之後的再次提交malloc之類的動態記憶體申請的時候,就會先使用該arena直到消耗完這片連續的記憶體區域

當消耗完該塊arena後,程式可以通過增加相應的break location 即資料段高度(通過brk()和sbrk()實現)並且會伴隨著top chunk的變化

當使用free函式釋放記憶體的時候 堆區域並不會立即被釋放掉 而是會被新增這個被free的區塊到main arena的bin中 在glibc中 釋放所需的資料結構跟bin這個資料結構有關。 當之後使用者再次請求動態記憶體的時候就不必先向作業系統提交請求,而是先從bin中找有木有合適的chunk,當區塊均不合適的時候,才會向作業系統提交申請

之前我們分析了主線程第一次進行malloc的時候以及進行free時候的情形。現在在多執行緒的情況下 ,分析一下在主線程之外建立額外執行緒的時候,額外執行緒使用malloc時候的情形。此時雖然執行緒未建立 但是對應的執行緒堆疊是存在的

額外執行緒在建立heap之後的情形 其向作業系統申請的堆區域是0xb7500000-0xb7521000 也是132kb的大小,由於是在額外執行緒 所以這塊大區域我們稱之為thread arena。額外執行緒使用動態記憶體分配函式的時候 其內部並不是像main arena一樣使用brk()或者sbrk(),而是使用mmap這個系統呼叫來分配一塊區域,並且令人注意的是 我們從圖中發現的是其實mmap一開始對映一塊1mb的記憶體空間,但是只有132kb是擁有讀寫屬性的,這132kb才是真正的thread arena。

當使用者釋放掉在thread arena的緩衝區時,作業系統也不會立即**這塊記憶體,而是也將這個freed chunk加入到對應的thread arena中供以後分配使用

當使用者申請一次性申請超大記憶體的時候 不論此時是處於哪個執行緒 都會用mmap來對映一塊記憶體到該程序空間中返回給使用者使用

對於arena的數量 其應用程式的arena數量自然不是乙個執行緒乙個arena 這樣顯得非常浪費和無用,其arena的最大數量是基於cpu的核心數來決定的

, in such a case

具體的arena數量見下 32位系統下arena數量是核心的兩倍 64位系統下則是核心的8倍

for 32 bit systems:

number of arena =

2* number of cores.

for 64 bit systems:

number of arena =

8* number of cores.

當執行緒的數量大於最大arena數量的時候,就需要進行乙個共享操作具體流程見下 這裡我們以在32位機子上只有乙個cpu核心 而程式執行著4個執行緒為例

okchain原始碼閱讀1 巨集觀框架

okchain作為okex的公鏈專案,功能面向交易所交易撮合。實現上,基於cosmos和tendermint兩個框架來實現。這裡記錄一下他的實現的大概框架。公鏈專案鏈結是 staking 投票質押邏輯 distribution slashing 非法投票懲罰 感覺這個會是審計重點 order tok...

C語言再學習part1 巨集觀認識C語言

天下莫柔弱於水,而攻堅強者莫之能勝,以其無以易之也。弱之勝強,柔之勝剛,天下莫不知行,莫能行。老子 我近來每天都在堅持讀書,所以我一直沉浸於古人的智慧型中無法自拔。所以如果我這篇博文被你有幸看到,那上面的話便贈予君子了。言歸正傳,這篇博文是c語言再學習系列的第一篇。雖然我已經學習了c語言兩年多之久,...

設計模式學習之巨集觀把控

學習設計模式已經有乙個多月了,也算是學習完第一遍了。但是設計模式的全域性了解還不太清楚,接下來把自己通過自己學習,查資料以及自己的感受和認為最開始學習設計模式需要知道有那些做個總結。結合類圖,書本例項,擴充套件自己的例項,在學習的過程中每個模式基本都有例項,同過對例項的理解,自己舉例,如果自己能用自...