- 浏览: 226573 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
chenxliang:
2016年10月26、27日,上海浦东,Postgres中国用 ...
PostgreSQL的用户、角色和权限管理 -
gejiod:
最近出了SQL:2011標準,希望樓主也更新下
SQL2008标准 -
lincon77:
太长了,又是E文,要是有些例子可能好理解些
SQL2003标准 -
少主丶无翼:
很谢,找了很久
SQL2003标准 -
zeeeitch:
...
PostgreSQL启动过程中的那些事七:初始化共享内存和信号二十:shmem中初始化堆同步扫描、pg子进程相关结构
1 AllocSet 的内存分配涉及到的方法和数据结构
话说
MemoryContextMethods 结构里的函数实现了pg 里AllocSet 和MemoryContext 的内存管理机制,定义见下面。
typedef struct MemoryContextMethods
{
void *(*alloc) (MemoryContext context, Size size);
/* call this free_p in case someone #define's free() */
void (*free_p) (MemoryContext context, void *pointer);
void *(*realloc) (MemoryContext context, void *pointer, Size size);
void (*init) (MemoryContext context);
void (*reset) (MemoryContext context);
void (*delete ) (MemoryContext context);
Size (*get_chunk_space) (MemoryContext context, void *pointer);
bool (*is_empty) (MemoryContext context);
void (*stats) (MemoryContext context);
#ifdef MEMORY_CONTEXT_CHECKING
void (*check) (MemoryContext context);
#endif
} MemoryContextMethods;
其中alloc 由静态函数AllocSetAlloc() 实现,具体签名在下面。它实现了AllocSet 相关的内存分配机制。
static void * AllocSetAlloc(MemoryContext context, Size size)
在写AllocSet 内存分配机制之前,先看两个和内存分配与管理密切相关的结构 Allockblock 和AllockChunk ,这个在 前面的文章http://beigang.iteye.com/blog/1266554和http://beigang.iteye.com/blog/1279177里已经 提到不 止一次了。
Allockblock 和AllockChunk 都是内存里的块,AllockBlock 类型是AllockBlockData * , AllocChunk 类型是AllockChunkData* ,AllocBlock 是AllocSet 用malloc 分配的内存单元,包含着一到多个AllockChunk ,AllocChunk是 MemoryContextMethods.alloc 请求分配的内存单元,将来由MemoryContextMethods . free_p 释放,放到AllocSet 的freelist 链表数组的大小合适的链表里,以后被MemoryContextMethods.alloc 再分配。
AllockBlockData 和AllockChunkData 的定义如下
typedef struct AllocBlockData
{
AllocSet aset; /* aset that owns this block */
AllocBlock next; /* next block in aset's blocks list */
char *freeptr; /* start of free space in this block */
char *endptr; /* end of space in this block */
} AllocBlockData;
typedef struct AllocChunkData
{
/* aset is the owning aset if allocated, or the freelist link if free */
void *aset;
/* size is always the size of the usable space in the chunk */
Size size;
#ifdef MEMORY_CONTEXT_CHECKING
/* when debugging memory usage, also store actual requested size */
/* this is zero in a free chunk */
Size requested_size;
#endif
} AllocChunkData;
2 AllocSetAlloc
下面就写 MemoryContextMethods.alloc 的实现者AllocSetAlloc() 这个函数。这个内存分配过程还是有点复杂的,下面先上个图,然后分块解读处理流程。
AllocSetAlloc 分配内存流程图
根据上面的图,按红紫蓝黄绿的顺序做简要分解,具体的还是看流程图吧,算法基本上都在图里面了。
先声明一点,TopMemoryContext 所用内存是用malloc 独立分的,其他的AllocSet 都是调用AllocSetAlloc 分得。
现在分解红色块。首先传进来要在其上分配内存的AllocSet 和请求的大小,如果请求大小没有超过AllocChunk 的最大大小8k ,就在该AllocSet 的空闲可用AllocChunk 链表数组freelist (后面分析这个freelist )合适大小的链表里找有没有可以使用的AllocChunk ,如果没有的话就把请求大小加上AllocChunk 的大小(图中的Q ),然后在AllocSet 的AllocBlock 链表blocks 里找,看blocks 有没有满足大小的可用block ,如果没有,就malloc 分配一块block 。红色块到此结束。
接下来是紫色块,在上面分配的block 里分一个AllocChunk ,然后把该chunk 作为MemoryContext 类型返回,至此就分得了一块内存。
蓝色框里是如果请求的大小超过了AllocChunk 的最大值8k ,就malloc 分配一个请求大小的block ,将其加入AllockSet 的blocks 链表中。在这个block 里面分配一个chunk ,作为MemoryContext 类型返回。
黄色框里是如果前面在AllocSet 的freelist 链表数组中的合适的链表里找到了可用chunk ,就把该chunk 从链表中取出来,作为MemoryContext 类型返回。
现在就剩绿色框了。绿色框是维护前面多次提到的freelist 链表数组的,现在是分析这个空闲AllocChunk 链表数组的时候了。先看这个freelist 。AllocSet 可分配的AllocChunk 的大小是从2 的3 次方依次到2 的13 次方字节,也就是从8 字节依次到8k 字节。这样做的好处是可以方便管理内存,要是按实际需求分配的话对于内存再分配是个很大的挑战,会造成内存浪费。结构图见下面。
AllocSet 的freelist 结构图
绿色框里就是说如果在AllocSet 的AllocBlock 链表blocks 里找到了block ,但是该block 的可用空闲空间不够请求大小时就把空闲大小按2 的13 次方到2 的3 次方依次分成AllocChunk 加入到对应大小的freelist 链表数组中的链表里。到此绿色块完了,这个AllocSetAlloc 也结束了。
3 示例
下面再用图例演示从TopMemoryContext 的AllocBlock 链表blocks 里一个block 分配一个AllockChunk 类型的变量chunk ,然后在chunk 上初始化ErrorContext 的例子。下图是只有一个AllocBlock 的TomMemoryContext 结构图
从TopMemoryContext 的AllocBlock 链表blocks 里的block 中分配了一个AllockChunk 变量chunk ,就是图纸粉色的那一块。
把ErrorContext 放在了新分的chunk 上。
发表评论
-
PostgreSQL服务过程中的那些事三:pg服务进程中的内存上下文
2012-12-31 15:07 1995题外话:年底了,就以这篇博文结束2012 ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询六:执行器执行
2012-11-07 20:13 1782话说 查询“ select c ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询五:规划成plantree
2012-10-31 20:37 1642话说 查询“ select cname, comp ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询四:分析重写成querytree
2012-10-24 19:27 1382话说 查询“ select cname, comp ... -
postgresql 小技巧
2012-10-16 19:36 1316Note : #PostgreSQL and ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询三:获取内存快照
2012-10-16 19:31 1731话说 查询“ select cname, comp ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询二:SQL解析为parsetree
2012-10-09 19:50 1485话说 查询“ select cname, comp fr ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询一:开启事务
2012-09-25 19:55 1824在《 PostgreSQL 服务过程中的那些事二: ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.八:加载DB基础设施,完成服务进程初始化
2012-09-18 21:02 1737话说调用 InitPostgres ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.七:初始化portal管理环境
2012-09-11 19:58 1601话说调用 In ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.六:初始化系统表缓存catcache
2012-09-04 20:51 1809话说调用 InitPostgres ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.五:初始化relcache管理环境
2012-08-28 20:47 1269话说调用 InitPostgres ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程三:初始化relcache管理环境
2012-08-28 20:46 0<!-- [if gte mso 9]><x ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询梗概
2012-08-21 21:04 1213话说客户端发起请求, pg 服务器为该请求启动一个 ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程二:建立连接完成
2012-08-13 18:50 15343 这节主要讨论 pg 服务进程 pos ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一
2012-08-08 14:42 5639到pg 服务进程了,打算搞一个完整但简单的查询例子,从 ... -
PostgreSQL启动过程中的那些事十九:walwriter进程二
2012-08-03 16:53 13403 这节主要讨论 walwrit ... -
PostgreSQL启动过程中的那些事十九:walwriter进程一
2012-08-01 17:26 1539话说 main()->Po ... -
PostgreSQL启动过程中的那些事十八:bgwriter进程二
2012-07-27 07:25 14003 这节主要讨论 bgwr ... -
PostgreSQL启动过程中的那些事十八:bgwriter进程一
2012-07-23 20:18 1563话说 main()->Postm ...
相关推荐
五、 pg_auth_members: pg_auth_members: pg_auth_members: pg_auth_members:pg_auth_members: pg_auth_members:pg_auth_members:pg_auth_members:pg_auth_members: .64 七、 pg_tablespace: pg_tablespace: pg_...
工作过程中接触到PG库,PG库的备份和数据迁移,但是手动安装数据的过程没有记录,于是写了脚本,实现一键安装postgres数据库,免去繁琐的安装过程。 解压文件后可以先看下readme.txt。如有疑问可以私信交流,一起...
pg_timetable:PostgreSQL高级调度 pg_timetable是PostgreSQL高级作业调度程序,与cron等传统调度程序相比,具有许多优势。 它完全由数据库驱动,并提供了一些高级概念。 # ./pg_timetable Application Options: -...
pg-promise-strict 带有承诺和严格类型的PostgreSQL,返回结果的大小 语: 也可用于: 特征 严格遵守PG Promise / A +: 与PG中相同的功能,相同的名称和相同的重调谐器,但没有回调 通过测试涵盖了100%。 100...
pg-extend-rs:Rust的Postgres扩展库
pg-index-health是一个Java库,用于分析和维护数据库中的索引运行状况。支持的PostgreSQL版本可用支票pg-index-health可让您检测以下问题: 无效(损坏的)索引( )。 重复(完全相同)的索引( )。 相交(部分...
pg_stat_monitor:PostgreSQL统计信息收集器
pg-错误枚举 没有运行时相关性的Postgres错误的TypeScript枚举。 还与纯JavaScript兼容。 快速开始 安装 # Using npm npm install --save pg-error-enum # Using yarn yarn add pg-error-enum 用法 TypeScript或ES6...
pg_plan_advsr:PostgreSQL扩展,用于自动执行计划调整
pg_track_settings:小扩展,用于跟踪PostgreSQL设置的修改
\ pg_shared_plans是一个PostgreSQL扩展,在共享内存中添加了透明的计划缓存。 它可以与本地计划高速缓存管理器的当前基础结构共存,因为尚未被pg_shared_plans高速缓存的计划仍可以被其高速缓存。 此扩展要求安装pg...
pg_show_plans:显示当前正在运行的所有SQL语句的查询计划
很有可能在桌子上设置一个事件触发器,然后进行一次LISTEN/NOTIFY舞动以接收更改,但这很繁琐且容易出错。 如果您的接收方遇到网络问题怎么办,那么在此期间的所有更改都将丢失。 幸运的是,PG确实具有使用...
pg_stat_kcache:收集有关后端完成的物理磁盘访问和CPU消耗的统计信息
pg_log_statements pg_log_statements是一个PostgreSQL扩展,它允许记录特定数据库会话SQL语句:可以为特定服务器进程设置log_statement ,而不是在实例级别或数据库级别设置log_statement参数。安装编译中可以使用...
pg-amqp-bridge:从PostgreSQL发送消息到RabbitMQ
pg-monitor-sql PostrgreSQL 监控查询 概述 SELECT d.datname, pg_size_pretty(pg_database_size(d.datname)) as size, numbackends, xact_commit, xact_rollback, blks_read, blks_hit, blks_hit::float ...
pg-mem是postgres数据库的实验性内存模拟。 :red_heart: 它既可以在节点中运行,也可以在浏览器中运行。 :star: 如果您喜欢这个软件包,这个回购,它有助于激励我:) :backhand_index_pointing_right: 在观看 ...
pg_upgrade.sh:pg_upgrade包装器将PostgreSQL集群升级到新的主要版本
这是使用和管理数据库体系结构的最佳实践的高级演示。 它显示了如何组织企业级数据库应用程序,并考虑了数据库和查询日益复杂的问题。 该演示集中于以下内容: 组织数据库模块的最佳方法 对数据库使用存储库模式...