SQL

freelist1.dia.gif
freelist1.dia.gif

freelist2.dia.gif
freelist2.dia.gif

mct.dia.gif
mct.dia.gif

分配流程圖.dia.gif
分配流程圖.dia.gif

TopMemoryContext:整個(gè)內(nèi)存上下文樹的根節(jié)點(diǎn),每一個(gè)申請(qǐng)的內(nèi)存上下文都直接或間接的是TopMemoryContext的孩子節(jié)點(diǎn),在這個(gè)上下文上申請(qǐng)的內(nèi)存基本等價(jià)于malloc,因?yàn)檫@個(gè)上下文不會(huì)被重置或被刪除。所以在這個(gè)上下文中應(yīng)該保存不會(huì)釋放的內(nèi)容或者申請(qǐng)者要負(fù)責(zé)對(duì)申請(qǐng)內(nèi)存的釋放。

CacheMemoryContext:永久緩存系統(tǒng)表元組catcache和表模式信息relcache,所以這個(gè)上下文不會(huì)刪除和重置,把他和TopMemoryContext區(qū)分開是為了便于調(diào)試。

MessageContext:上下文保存著當(dāng)前執(zhí)行的sql指令相關(guān)的內(nèi)存,這個(gè)上下文的生命周期和當(dāng)前指令相同,在PostgresMain每一次循環(huán)周期中被重置。

TopTransactionContext:這個(gè)上下文持續(xù)整個(gè)頂層事物的生命周期,當(dāng)頂層事物結(jié)束時(shí)這個(gè)上下文會(huì)釋放掉,大多數(shù)情況下不應(yīng)該在這里直接申請(qǐng)內(nèi)存,應(yīng)該在CurTransactionContext中申請(qǐng)。對(duì)于跨多個(gè)子事物的一些控制信息應(yīng)該保存在這里。

CurTransactionContext:當(dāng)我們?cè)陧敿?jí)事物中時(shí),指向TopTransactionContext。但是當(dāng)我們?cè)谝粋€(gè)子事物時(shí),他指向一個(gè)child context。

如果這個(gè)子事物終止了,那么在完成abort操作之后,這個(gè)上下文就會(huì)被釋放掉。注意所有和這個(gè)事物相關(guān)的指針調(diào)用都要清理,因?yàn)檫@部分內(nèi)存已經(jīng)釋放掉了,如果繼續(xù)調(diào)用的話會(huì)crash。

如果這個(gè)子事物提交了,那個(gè)這個(gè)上下文會(huì)一直保存直到頂層事物提交,這樣保證了如果子事物失敗了,他使用的內(nèi)存會(huì)被立即釋放。

ErrorContext:這也是一個(gè)永久存在的上下文,錯(cuò)誤恢復(fù)過(guò)程中會(huì)使用這個(gè)上下文,在任何時(shí)刻這個(gè)上下文都有8K的空間,這樣可以保證在內(nèi)存耗盡時(shí)仍然可以執(zhí)行相關(guān)的處理動(dòng)作。

???t?l?|?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容