Postgres - MemoryContext
MemoryContext (内存上下文)
- 存在的目的是方便内存管理
- 统一分配
- 统一释放
- 采用层级的管理方式
- 即一个MemoryContext会有对应的father/son
- memory pool
- 对于一个father,可以存在一个memory pool
- 当需要在这个father中分配内存时,可以直接从memory pool中获取内存(可以有效减小频繁分配内存的开销)
- 采用栈结构
- 可以防止内存泄漏
- 调用销毁一个MemoryContetx的函数MemoryContextDelete会从栈顶(以树的形式来说就是叶子节点)删除
- 在并发环境中,可以有效避免内存冲突
Postgresql中的MemoryContext
- 定义
typedef struct MemoryContextData
{
NodeTag type; /* identifies exacts kind of context */
MemoryContextMethods *methods; /* virtual function table */
MemoryContext parent; /* NULL if no parent (toplevel context) */
MemoryContext firstchild; /* head of linked list of children */
MemoryContext nextchild; /* next child of same parent */
char *name; /* context name (just for debugging) */
} MemoryContextData;
typedef struct MemoryContextData *MemoryContext;
有点类似树
- methods对应的是指向方法集MemoryContextMethods的指针,MemoryContextMethods包含了所有的方法
- 分配内存的实现
- 对于不同大小的内存采用不同的分配策略
- 总的来说就是按大小采用不同的分配策略,同时会维护一个free_list作为候选内存片段,分配的时候如果说比较小(<8k)可以直接从这里取出,否则新分配
- 删除的时候采用相同的策略,对于较小的(<8k)放回到free_list,否则直接释放
进程式
-
postgre是典型的进程式数据库
-
并发性能差
- 进程的创建/销毁开销
- 进程间通信很复杂
- 上下文切换开销大(MemoryContextSwitch)
-
隔离性,安全性好
- 每个进程可以创建自己独立的MemoryContext
-
缓解并发性能问题
- 采用一个进程池
-
我记得postgre本身没有提供,可以通过插件实现