`

PostgreSQL的内存管理机制十二:共享内存/shmem分配

阅读更多

pg 的内存除了 AllocSet/MemoryContext 外,另一个主要部分就是共享内存(shared memory )。这一节讨论共享内存(简写shmem )的分配。

pg reset_shared () 这个函数里, 计算数据缓冲、xlogclog 、共享进程、子事务、并发控制、轻量级锁、backend 进程等需要的共享内存, 调用 shmget() 函数在堆上分配, PGShmemHeader * 类型的 ShmemSegHdr 变量的index 成员指向调用hash_create() 创建的共享内存索引——可扩展 哈希表索引 "ShmemIndex" totalSize 成员中记录分配的shmem 大小。

有了共享内存和共享内存索引,再加上一个共享内存锁(关于此锁及pg 中的其它锁,是一个需要很多字才能讨论清楚的点,以后专门讨论),就可以分配共享内存了。

分配共享内存时,先把要分配内存的结构做对齐处理,然后回去共享内存锁,接着判断要分配的内存大小,大于8k 的需要做块对齐,从共享内存的空闲共享内存偏移量处分配所需大小内存,判断所分配内存是否 超过了共享内存的末尾地址,如果超过,释放锁,报错 "out of shared memory" ,如果没有超过, 释放锁,设置新的 空闲共享内存偏移量,返回分配的共享内存地址。

 

 

 

共享内存分配流程图

 

    到这儿貌似共享内存分配很简单,已经讨论完,其实不然,通常分配共享内存时还需要在共享内存索引表"ShmemIndex" 加一个索引,为了清楚,再把这个索引图放到下面,复习一下。

共享内存及其索引 "ShmemIndex" 结构图

 

下面举个在shmem 上分配xlog 相关内存的例子,串一下分配的过程。

XLOGSHmemInit() 分配xlog 相关内存 ,初始化控制文件 data/global/pg_control 相关数据结构及事务日志 xlog 相关数据结构,在 XLOGSHmemInit() 函数里,首先在 shmem 的哈希表索引 "ShmemIndex" 上给控制文件 pg_control 增加一个 HashElement ShmemIndexEnt entry ), shmem 里根据 ControlFileData 大小调用 ShmemAlloc() 分配内存空间,使 ShmemIndexEnt 的成员 location 指向该空间, size 成员记录该空间大小

XLOGSHmemInit() 调用 ShmemInitStruct() 在其中 调用 hash_search() 在哈希表索引 "ShmemIndex" 中查找 "XLOG Ctl" ,如果没有,就在 shmemIndex 中给 "XLOG Ctl" 分一个 HashElement ShmemIndexEnt entry ,在其中的 Entry 中写上 "XLOG Ctl" 。返回 ShmemInitStruct() ,再调用ShmemAlloc() 在共享内存上给"XLOG Ctl" 相关结构(见下面“ XLog 相关结构图” )分配空间,设置 entry (在这儿及ShmemIndexEnt 类型变量)的成员 location 指向该空间, size 成员记录该空间大小 最后返回 XLOGShmemInit() ,让 XLogCtlData * 类型静态 全局变量 XLogCtl 指向在shmem 里给"XLOG Ctl" 相关结构分配的内存地址。

增加了xlog 相关结构在 "ShmemIndex" 中的索引及在共享内存/shmem 中分配了内存的xlog 相关结构对象的结构如下。

 

增加了xlog 相关机构索引的共享内存索引 "ShmemIndex" 结构图

 

 

 

控制文件结构图

       上图中 ControlFileData 结构中的 XLogRecPtr CheckPoint 不是指针,因此应该用右边的相应结构图代替,把这两个合进去有点费劲,将就着看吧。

 

 

 

XLog 相关结构图

 

  • 大小: 44.7 KB
  • 大小: 104.9 KB
  • 大小: 47.8 KB
  • 大小: 145.8 KB
  • 大小: 63.5 KB
0
0
分享到:
评论

相关推荐

    常见的JDBC数据库连接的驱动名称及URL.docx

    PostgreSQL 的驱动程序类名是 org.postgresql.Driver,数据库 URL 格式是 jdbc:postgresql:database jdbc:postgresql://host/database jdbc:postgresql://host:port/database,其中 database 是数据库名,host 是...

    postgresql缺少文件

    问题链接:https://blog.csdn.net/u011043673/article/details/103099092 在 postgresql 加载timescaledb 时报:could not load library timescaledb-1.4.2.dll The specified procedure could not be found.

    Vite + Vue3 + ts 注册登录页面书写 搭配Nodejs + Express + postgresql接口

    一个接口包 连的本地postgresql 表及信息有截图 库自己装 一个vue包 vite+vue3+ts+eleplus 配置了router vuex axios postcss-px-to-viewport界面自适应 env prod环境等 启动:均是 npm i npm start 仅供学习哈 也...

    postgresql安装部署手册

    PostgreSQL 是一个功能强大且广泛使用的开源关系数据库管理系统。下面是 PostgreSQL 安装部署手册的摘要信息: 1. 下载安装包 在安装 PostgreSQL 之前,需要下载安装包。用户可以从 PostgreSQL 官方网站下载最新...

    postgresql12主从集群安装

    【PostgreSQL 12主从集群安装】 在搭建PostgreSQL 12主从集群时,首先需要理解主从复制的概念。主从复制是数据库高可用性的一种常见解决方案,它允许数据从一个节点(主节点)实时同步到另一个或多个节点(从节点)...

    引:https://rng-songbaobao.blog.csdn.net/article/details/123029321

    1. PostgreSQL的学习心得和知识总结(五十九)|内核级自上而下完美实现PostgreSQL数据库 新增表权限实现列数据无权访问 的实现方案 2. PostgreSQL 14.1 内核

    greenplum/postgresql驱动包:greenplum-1.0.jar

    《Greenplum与PostgreSQL数据库驱动详解》 在IT领域,数据库管理系统的高效运作是支撑企业数据处理和服务的核心。本文将深入探讨Greenplum和PostgreSQL两种数据库系统,以及它们对应的驱动包`greenplum-1.0.jar`的...

    mysql-sqlserver-postgresql-jar包.rar

    在IT行业中,数据库是数据存储和管理的核心工具。在Java编程环境下,开发人员常常需要连接不同的数据库系统,如MySQL、SQL Server和PostgreSQL。本文将详细介绍如何使用指定的jar包来建立这些数据库与Java应用程序...

    postgreSQL的JDBC驱动

    schemaspy那篇博客用到的资源

    postgresql-9.4.1212

    postgresql-9.4.1212驱动, driver=org.postgresql.Driver url=jdbc:postgresql://127.0.0.1:5432/test 配置驱动 url 账户密码等, 创建connector即可连接使用, 亲测可用

    Ubuntu 下源码安装Postgresql

    su -c "/softwares/postgresql/bin/pg_ctl start -D /softwares/postgresql/bin/PGDATA/postgres" postgres 十、配置 Shell 设置 最后,需要配置 Ubuntu 的 Shell 设置,将其从 Dash 更改回 Bash: sudo dpkg-...

    PostgreSQL修炼之道:从小工到专家

    PostgreSQL中国社区资深数据库专家、沃趣科技首席数据库架构师撰写,PostgreSQL数据库领域经典著作 系统讲解PostgreSQL技术内幕,深入分析PostgreSQL特色功能,包含大量来自实际生产环境的经典案例和经验总结 ...

    CentOS6平台下PostgreSQL数据库的安装

    #vim /home/postgresql/.bash_profile ``` 在文件末尾添加: ```bash PGLIB=/usr/local/pgsql/lib PGDATA=$HOME/data PATH=$PATH:/usr/local/pgsql/bin MANPATH=$MANPATH:/usr/local/pgsql/man LD_LIBRARYPATH=$LD_...

    Linux安装postgresql(压缩包安装)

    Linux 安装 PostgreSQL 是一种常用的数据库管理系统安装方法,本文将指导您一步步地完成 PostgreSQL 的安装。 下载和解压缩 首先,下载 PostgreSQL 的压缩包,并将其上传至 Linux 根目录中。然后,使用 tar 命令来...

    pgApex:http://95.85.49.98:8081/apex/q-开源

    它允许开发者利用 PostgreSQL 的强大功能,通过浏览器进行应用程序的创建、管理和维护,而无需深入学习复杂的 Web 开发技术。 作为开源软件,pgApex 充分体现了开放源代码的精神,用户可以免费使用、修改和分发其源...

    postgresql 离线安装教程

    PostgreSQL是一款功能强大且全面的开源对象-关系型数据库管理系统(ORDBMS)。它基于加州大学伯克利分校开发的POSTGRES 4.2版本构建而成,引入了许多先进的概念和技术,这些技术在其他商业数据库中往往出现得更晚。...

    Linux环境PostgreSQL源码编译安装1

    pg_ctl -D /var/postgresql/data -l /var/postgresql/log/pg_server.log start tail -100f /var/postgresql/log/pg_server.log ``` 10. 如果遇到权限问题,可能需要调整数据目录的权限: ``` chmod 700 /var/...

    postgresql14-server-14.12-1PGDG.rhel7.x86-64.rpm

    postgresSQL14-rpm,CentOs7 离线安装 PostgreSQL 14.clip 安装步骤: rpm -ivh libicu-50.2-4.el7_7.x86_64.rpm rpm -ivh postgresql14-contrib-14.12-1PGDG.rhel7.x86_64.rpm rpm -ivh postgresql14-libs-14.12-...

    postgresql-42.3.1-API文档-中文版.zip

    赠送jar包:postgresql-42.3.1.jar; 赠送原API文档:postgresql-42.3.1-javadoc.jar; 赠送源代码:postgresql-42.3.1-sources.jar; 赠送Maven依赖信息文件:postgresql-42.3.1.pom; 包含翻译后的API文档:...

    postgresql11.5安装timescale1.4.2需要在postgres的bin下导入以下两个dll.zip

    postgresql11.5.1安装timescale1.4.2需要在postgres的bin下导入以下两个dll

Global site tag (gtag.js) - Google Analytics