zoukankan      html  css  js  c++  java
  • PostgreSQL-内存上下文

    内存上下文背景:

    需要经常处理大量以指针传值的查询,存在内存泄漏的问题,直到查询结束才能收回内存。所以实现了新的内存管理机制-内存上下文(MemoryContext)

    内存上下文通俗解释:

    一个内存上下文相当于一个进程环境,进程环境间不互相影响,pgSQL提供了在内存上下文进行内存操作的函数:pallloc、pfree、repalloc等。

    MemoryContext:

    pgSQL的每一个子进程都拥有多个私有的内存上下文,每个子进程的内存上下文组成一个树形结构,根节点为TopMemoryContext。

    创建一个新的内存上下文,将其添加到已有的内存上下文作为子节点。清除内存的时候可以从根节点遍历,将所有节点的内存完全释放

    内存处理函数:包含了对内存上下文进行操作的函数集合

     

     1.对内存上下文的操作,都是全局变量AllocSetMethods中实现的操作函数来控制的。

     2.在任何时候,都有一个"当前"的MemoryContext,记录在全局变量CurrentMemoryContext。进程就在这个内存上下文中调用palloc分配内存。

     3.变换内存上下文,使用MemoryContextSwitchTo函数

    AllocSet:

    管理一个内存上下文中的内存块是通过AllocSet结构完成,MemoryContext只作为AllocSet头部信息,AllocSet是指向AllocSetContext结构的类型指针。

     可以在进行重置的时候,检查isReset是否为true,如果为true就不需要重置操作,提高效率。

    keeper在重置时只会把内存里的内容删除。

    MemoryContext创建与初始化:

    调用MemoryContextInit做初始化。先创建根节点TopMemoryContext,然后在该节点下创建ErrorContext用于错误恢复处理

  • 相关阅读:
    C open fopen read fread
    图像混合模式算法
    高级API和低级API
    strcpy_s与strcpy
    IsPowerOfTwo
    透明度算法
    POJ 2240(bellman_ford)
    POJ 1797(dijkstra)
    【转载】POJ 图论题目列表
    POJ 1502(Floyd)
  • 原文地址:https://www.cnblogs.com/itsad/p/11599227.html
Copyright © 2011-2022 走看看