AntDB記憶體管理之記憶體上下文之記憶體上下文機制是怎麼實現的

亞信AntDB資料庫發表於2024-01-08

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章