



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?|?