golang原始碼剖析 記憶體管理 2

2021-08-19 15:30:44 字數 1049 閱讀 4721

接上篇:[ ]

在真正進入記憶體分配過程之前,還需要了解一下整個記憶體分配器是如何建立的以及初始化成什麼樣子。完成記憶體分配器建立初始化的函式是runtime·mallocinit,看一下簡化的原始碼:

void

runtime·mallocinit(void)

// 初始化好heap的arena以及bitmap。

runtime·mheap->bitmap = p;

runtime·mheap->arena_start = p + bitmap_size;

runtime·mheap->arena_used = runtime·mheap->arena_start;

runtime·mheap->arena_end = runtime·mheap->arena_start + arena_size;

// 初始化heap的其他內部結構,如:spanalloc、cacachealloc都fixalloc的初始化,

// free、large欄位都是掛載維護span的雙向迴圈鍊錶。

runtime·mheap_init(runtime·mheap, runtime·sysalloc);

// 從heap的cachealloc從分配mcache,掛在乙個執行緒上。

m->mcache = runtime·allocmcache();

}

初始化過程主要是在折騰mcache和mheap兩個部分,而mcentral在實際邏輯中是屬於mheap的子模組,所以初始化過程就沒明確的體現出來,這和我繪製的結構圖由兩大塊構造相對應。

heap是所有底層執行緒共享的;而cache是每個執行緒都分別擁有乙個,是獨享的。

在64位平台,heap從作業系統申請的記憶體位址保留區只有136g,其中bitmap需要8g空間,因此真正可申請的記憶體就是128g。當然128g在絕大多數情況都是夠用的,但我所知道的還是有個別特殊應用的單機記憶體是超過128g的。

memcache中記憶體管理原始碼剖析

memcahce採用了記憶體頁面,記憶體頁面上的記憶體塊技術實現了記憶體管理器,對item的指標採用了hashtable的方法,通過item的key值實現快速定位查詢item指標的方法,這裡詳細剖析一下實現的關鍵 首先是記憶體管理,在slabs.c 中實現.1 void slabs init voi...

原始碼剖析 Hashtable 原始碼剖析

hashtable同樣是基於雜湊表實現的,同樣每個元素都是key value對,其內部也是通過單鏈表解決衝突問題,容量不足 超過了閾值 時,同樣會自動增長。hashtable也是jdk1.0引入的類,是執行緒安全的,能用於多執行緒環境中。hashtable同樣實現了serializable介面,它支...

python原始碼剖析 Python原始碼剖析

第頁共 頁python 原始碼剖析 物件機制 1.物件 在python 的世界中,一切都是物件,乙個整數是乙個物件,乙個字串也是 乙個物件,更為奇妙的是,型別也是乙個物件,整數型別是乙個物件,字串類 型也是乙個物件。從 年guido 在那個聖誕節揭開 python 世界的大幕開始,一直到現在,pyt...