AntDB記憶體管理之記憶體上下文之記憶體上下文機制是怎麼實現的
4. 記憶體上下文機制是怎麼實現的
下文將針對記憶體上下文機制進行程式碼說明。本次以 AntDB的程式碼為例,來解析記憶體上下文的實現方式。
4.1 最基礎的資料結構
MemoryContextData和MemoryContextMethods是記憶體上下文機制裡最基礎的2個資料結構。定義如下圖4所示(只針對特定成員進行說明,其他的變數說明可以參照程式碼)。
圖 4:MemoryContextData和MemoryContextMethods
※1:這個結構體只是個指標的集合而已,並沒有實現。開發者可以根據這個框架自己提供一套實現方式。AntDB已經實裝的一套通用的實現:AllocSetMethods。另外AntDB也提供了GenerationMethods和SlabMethods的實現方式,但這2個需要在特定的使用場景下進行使用。接下來的說明都是以AllocSetMethods為前提的。
4.2 通用的實現AllocSetContext
AntDB提供了一個通用的記憶體上下文實現:AllocSetContext。程式碼中的記憶體操作幾乎都是透過這個型別的記憶體上下文來處理的。
首先,我們瞭解一下 AllocSetContext的定義,如下圖5所示。
圖 5:AllocSetContext
4.2.1 記憶體操作方法
其次,我們看一下 header成員。從圖5可以看出來,記憶體操作相關的方法都存放在了header成員裡;另外,構建記憶體上下文的樹形關係用的成員變數,比如parent,firstchild等,也都在header裡面。
記憶體上下文可以提供的記憶體操作有以下幾種。
- AllocSetAlloc:記憶體申請
- AllocSetFree:記憶體釋放
- AllocSetRealloc:記憶體重分配
- AllocSetReset:記憶體上下文重置
- AllocSetDelete:記憶體上下文刪除
- AllocSetGetChunkSpace:檢查記憶體片的大小
- AllocSetIsEmpty:檢查記憶體上下文是否為空
- AllocSetStats:獲取記憶體上下文的狀態資訊
- AllocSetCheck:檢查所有記憶體
4.2.2 記憶體塊
接下來,我們就瞭解一下記憶體上下文的實際記憶體在哪裡。
圖 6:記憶體上下文的實際記憶體塊
blocks成員是一個連結串列,記憶體上下文的記憶體都放在blocks成員裡。記憶體上下文申請記憶體時是以block(也可稱作大記憶體)的方式,一次申請一塊大記憶體。申請的block會加入到AllocSetContext的blocks連結串列中。
記憶體上下文提供的記憶體申請函式 AllocSetAlloc,是以chunk(記憶體片,也可稱作小記憶體)的方式分配記憶體給使用者。即該操作會把block根據需要分成一片一片,然後把記憶體片的地址提供給呼叫者。我們呼叫函式palloc得到的就是這個記憶體片的地址。
4.2.3 記憶體上下文例項的整體結構
上文已經分別介紹完了記憶體上下文的 2個重要成員header和blocks。據此,我們可以在腦中畫出一個記憶體上下文例項大概的全貌。請參照下圖7。
圖 7:記憶體上下文例項的整體結構
前面樹形圖中(圖
3)看到的TopMemoryContext、ErrorContext等,從記憶體角度看的話,就是圖7所顯示的模樣。
來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70026696/viewspace-3003072/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java的記憶體管理機制之記憶體區域劃分Java記憶體
- 記憶體管理兩部曲之實體記憶體管理記憶體
- Python如何管理記憶體?記憶體分配機制是什麼?Python記憶體
- 什麼是記憶體管理?其最主要作用?OC記憶體管理機制?記憶體
- 記憶體管理篇——實體記憶體的管理記憶體
- 記憶體管理兩部曲之虛擬記憶體管理記憶體
- Android學習之 記憶體管理機制與應用記憶體優化Android記憶體優化
- 記憶體管理 記憶體管理概述記憶體
- javaScript 記憶體管理機制JavaScript記憶體
- Java記憶體管理機制Java記憶體
- Qt 記憶體管理機制QT記憶體
- jvm記憶體管理機制JVM記憶體
- Java的記憶體 -JVM 記憶體管理Java記憶體JVM
- C++記憶體管理:簡易記憶體池的實現C++記憶體
- 自動共享記憶體管理 自動記憶體管理 手工記憶體管理記憶體
- Android 之 記憶體管理Android記憶體
- 記憶體管理之五 (轉)記憶體
- Qt 記憶體管理機制薦QT記憶體
- linux記憶體管理機制Linux記憶體
- Redis的記憶體和實現機制Redis記憶體
- Go:記憶體管理與記憶體清理Go記憶體
- 記憶體管理機制的發展記憶體
- JavaScript 記憶體機制JavaScript記憶體
- 實體記憶體和虛擬記憶體記憶體
- JavaScript之記憶體溢位和記憶體洩漏JavaScript記憶體溢位
- Swoole 原始碼分析——記憶體模組之記憶體池原始碼記憶體
- Android記憶體優化之記憶體快取Android記憶體優化快取
- Aerospike的bin記憶體管理--即列記憶體管理ROS記憶體
- Linux 記憶體管理:記憶體對映Linux記憶體
- 溫故之.NET記憶體管理記憶體
- ORACLE 記憶體管理 之四 SGAOracle記憶體
- JVM讀書筆記之記憶體管理JVM筆記記憶體
- 要點提煉| 理解JVM之記憶體管理機制JVM記憶體
- 記憶體管理記憶體
- 淺析java記憶體管理機制Java記憶體
- ARC記憶體管理機制詳解記憶體
- jvm:記憶體模型、記憶體分配及GC垃圾回收機制JVM記憶體模型GC
- Redis記憶體——記憶體消耗(記憶體都去哪了?)Redis記憶體