SQL
freelist2.dia.gif
mct.dia.gif
分配流程图.dia.gif
TopMemoryContext:整个内存上下文树的根节点,每一个申请的内存上下文都直接或间接的是TopMemoryContext的孩子节点,在这个上下文上申请的内存基本等价于malloc,因为这个上下文不会被重置或被删除。所以在这个上下文中应该保存不会释放的内容或者申请者要负责对申请内存的释放。
CacheMemoryContext:永久缓存系统表元组catcache和表模式信息relcache,所以这个上下文不会删除和重置,把他和TopMemoryContext区分开是为了便于调试。
MessageContext:上下文保存着当前执行的sql指令相关的内存,这个上下文的生命周期和当前指令相同,在PostgresMain每一次循环周期中被重置。
TopTransactionContext:这个上下文持续整个顶层事物的生命周期,当顶层事物结束时这个上下文会释放掉,大多数情况下不应该在这里直接申请内存,应该在CurTransactionContext中申请。对于跨多个子事物的一些控制信息应该保存在这里。
CurTransactionContext:当我们在顶级事物中时,指向TopTransactionContext。但是当我们在一个子事物时,他指向一个child context。
如果这个子事物终止了,那么在完成abort操作之后,这个上下文就会被释放掉。注意所有和这个事物相关的指针调用都要清理,因为这部分内存已经释放掉了,如果继续调用的话会crash。
如果这个子事物提交了,那个这个上下文会一直保存直到顶层事物提交,这样保证了如果子事物失败了,他使用的内存会被立即释放。
ErrorContext:这也是一个永久存在的上下文,错误恢复过程中会使用这个上下文,在任何时刻这个上下文都有8K的空间,这样可以保证在内存耗尽时仍然可以执行相关的处理动作。
���t�l�|�