Postgresql - MemoryContext

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本身没有提供,可以通过插件实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值