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記憶體
- 記憶體管理兩部曲之實體記憶體管理記憶體
- 記憶體管理篇——實體記憶體的管理記憶體
- 記憶體管理兩部曲之虛擬記憶體管理記憶體
- 記憶體管理 記憶體管理概述記憶體
- linux記憶體管理(一)實體記憶體的組織和記憶體分配Linux記憶體
- Java記憶體管理機制Java記憶體
- jvm記憶體管理機制JVM記憶體
- javaScript 記憶體管理機制JavaScript記憶體
- Java的記憶體 -JVM 記憶體管理Java記憶體JVM
- 【記憶體管理】記憶體佈局記憶體
- C++記憶體管理:簡易記憶體池的實現C++記憶體
- 什麼是Java記憶體模型(JMM)中的主記憶體和本地記憶體?Java記憶體模型
- Go:記憶體管理與記憶體清理Go記憶體
- Redis的記憶體和實現機制Redis記憶體
- 記憶體管理機制的發展記憶體
- Android Handler機制之記憶體洩漏Android記憶體
- JavaScript之記憶體溢位和記憶體洩漏JavaScript記憶體溢位
- Linux實體記憶體管理Linux記憶體
- 溫故之.NET記憶體管理記憶體
- JVM讀書筆記之記憶體管理JVM筆記記憶體
- 要點提煉| 理解JVM之記憶體管理機制JVM記憶體
- 【記憶體洩漏和記憶體溢位】JavaScript之深入淺出理解記憶體洩漏和記憶體溢位記憶體溢位JavaScript
- Redis記憶體——記憶體消耗(記憶體都去哪了?)Redis記憶體
- 淺析java記憶體管理機制Java記憶體
- 【記憶體管理】頁面分配機制記憶體
- jvm:記憶體模型、記憶體分配及GC垃圾回收機制JVM記憶體模型GC
- Python分享之Python的記憶體管理Python記憶體
- Swoole 原始碼分析——記憶體模組之記憶體池原始碼記憶體
- QT之共享記憶體QT記憶體
- Java記憶體模型FAQ(一) 什麼是記憶體模型Java記憶體模型
- js記憶體回收機制JS記憶體
- SAP專家培訓之NetweaverABAP記憶體管理和記憶體調優最佳實踐記憶體
- Linux記憶體是怎麼工作的?Linux記憶體
- Java記憶體模型,垃圾回收機制,常用記憶體命令及工具Java記憶體模型
- redis的記憶體滿了之後,redis如何回收記憶體嗎Redis記憶體
- 【Java基礎】實體記憶體&虛擬記憶體Java記憶體