`

PostgreSQL启动过程中的那些事七:初始化共享内存和信号二十:shmem中初始化堆同步扫描、pg子进程相关结构

阅读更多

       这一节 pg 初始化堆扫描同步支持用到的相关结构。

 

       堆扫描同步是当多个进程在同一个表上做顺序扫描( sequential scan ), pg 尝试保持他们同步以减少整体 I/O 需求。这个目标是读每一个页到共享内存仅一次,且使所有参与扫描这个页的进程在这个页被替换出共享内存前处理这个页。

 

活跃 backend 进程列表,这被用来跟踪 pg 有多少个孩子和在需要的时候给他们发送信号。

 

1 先上个图,看一下函数调用过程梗概,中间略过部分细节

 


 

初始化同步扫描和 Backend 结构数组方法调用流程图

 

2 初始化同步扫描相关结构

话说 main()-> ->PostmasterMain()-> ->reset_shared() -> CreateSharedMemoryAndSemaphores()>…-> SyncScanShmemInit () ,调用 ShmemInitStruct() 在其中 调用 hash_search() 在哈希表索引 "ShmemIndex" 中查找 " Sync Scan Locations List " ,如果没有,就在 shmemIndex 中给 " Sync Scan Locations List " 分一个 HashElement ShmemIndexEnt entry ,在其中的 Entry 中写上 " Sync Scan Locations List " 。返回 ShmemInitStruct() ,再调用 ShmemAlloc() 在共享内存上给 " Sync Scan Locations List " 相关结构(见下面“ Sync Scan Locations List 相关结构图” )分配空间,设置 entry (在这儿及ShmemIndexEnt 类型变量)的成员 location 指向该空间, size 成员记录该空间大小 最后返回 SyncScanShmemInit () ,让 ss_scan_locations_t * 类型静态 全局变量 scan_locations 指向 所分配内存 ,初始化 ss_scan_locations_t 结构类型的成员值。

接着 main()-> ->PostmasterMain()-> ->reset_shared() -> CreateSharedMemoryAndSemaphores() ->…-> ShmemBackendArrayAllocation () 调用 ShmemAlloc() 在共享内存上分配 2 * MaxBackends Backend 结构数组 见下面“ Backend 结构数组图” Backend * 类型静态 全局变量 ShmemBackendArray 指向 所分配内存 ,用memset 把所分配内存置0

相关结构定义和图见下面:

 

typedef struct ss_scan_location_t

{

    RelFileNode relfilenode ; /* identity of a relation */

    BlockNumber location ;       /* last-reported location in the relation */

} ss_scan_location_t ;

 

typedef struct ss_lru_item_t

{

    struct ss_lru_item_t * prev ;

    struct ss_lru_item_t * next ;

    ss_scan_location_t location ;

} ss_lru_item_t ;

 

typedef struct ss_scan_locations_t

{

    ss_lru_item_t * head ;

    ss_lru_item_t * tail ;

    ss_lru_item_t items [1];     /* SYNC_SCAN_NELEM items */

} ss_scan_locations_t ;

 

#define SizeOfScanLocations (N) offsetof(ss_scan_locations_t, items[N])

 

/* Pointer to struct in shared memory */

static ss_scan_locations_t *scan_locations;

 

/* prototypes for internal functions */

static BlockNumber ss_search ( RelFileNode relfilenode,

         BlockNumber location, bool set);

 

 

typedef struct bkend

{

    pid_t      pid;          /* process id of backend */

    long        cancel_key;       /* cancel key for cancels for this backend */

    int         child_slot;       /* PMChildSlot for this backend, if any */

    bool       is_autovacuum;    /* is it an autovacuum process? */

    bool       dead_end;     /* is it going to send an error and quit? */

    Dlelem     elem;         /* list link in BackendList */

} Backend;

 

static Backend *ShmemBackendArray;

 

  初始化完 Sync Scan Locations List 相关结构 的共享内存结构图

       为了精简上图,把创建 shmem 的哈希表索引 "ShmemIndex" 时创建的 HCTL 结构删掉了,这个结构的作用是记录创建可扩展哈希表的相关信息,不过这个结构在 "ShmemIndex" 创建完成后也会由于出了对象作用域而消失。增加了左边灰色底的部分,描述 共享内存 /shmem 里各变量物理布局概览,由下往上,由低地址到高地址。 图中黄色的索引项就是本节新增加的索引项。

 

Sync Scan Locations List 相关结构图

 

 

Backend 结构数组图

  • 大小: 148.5 KB
  • 大小: 37.8 KB
  • 大小: 13.2 KB
  • 大小: 567 KB
0
0
分享到:
评论
1 楼 zeeeitch 2012-05-15  

相关推荐

    nacos-2.0.1 postgresql初始化脚本

    nacos-2.0.1 postgresql初始化脚本

    PostgreSQL中文手册9.2

    一、服务器进程的启动和关闭: 一、服务器进程的启动和关闭: 一、服务器进程的启动和关闭: 一、服务器进程的启动和关闭: 一、服务器进程的启动和关闭: 一、服务器进程的启动和关闭: . 50 PostgreSQL PostgreSQL...

    quartz-2.2.3版本的quartz初始化sql语句

    在Quartz 2.2.3版本中,初始化数据库是使用Quartz的关键步骤,因为Quartz依赖于一个持久化存储来保存作业和触发器的信息。这个过程通常涉及执行一系列SQL语句来创建必要的表结构。 Quartz的初始化SQL语句主要用于...

    postgresql--内核分析--多进程结构

    - `src/backend/utils/misc/pg_shmem.c`文件中实现了共享内存的相关功能,这对于多进程之间的通信非常重要。 #### 五、PostgreSQL与MySQL对比 **1. PostgreSQL文件目录组织**: - 整体代码结构清晰,遵循了良好的...

    使用Bucardo搭建PostgreSQL数据库双主同步.docx

    不过,Bucardo 中的同步都是异步的,它是通过触发器记录变化,甚至可以以 PostgreSQL 为源库,可以和 Oracle、MySQL、MongoDB 等很多数据库进行数据异步同步。 二、搭建前准备 在开始搭建 Bucardo 之前,需要满足...

    在windows下手动初始化PostgreSQL数据库教程

    在初始化过程中,initdb会生成一系列的配置文件和数据库模板,并设置默认的最大连接数、共享缓冲区等参数。完成初始化之后,会得到一系列的成功消息,表明数据库系统已经准备就绪。 最后,使用pg_ctl工具来启动...

    PGAdmin系统管理PostgreSQL 中文手册

    手册中还会涵盖一些常见的问题和解决方案,帮助用户解决在使用pgAdmin过程中遇到的问题。同时,也会介绍一些数据库性能优化策略,如调整参数设置、使用索引和查询优化等。 总之,这本中文手册全面覆盖了pgAdmin在...

    Go-PostgreSQLBGWorker用Go编写的PostgreSQL后台工作进程

    8. **配置和启动**:在PostgreSQL中,你需要在`postgresql.conf`中启用BGWorker,并可能在`pg_hba.conf`中配置权限。然后,重启PostgreSQL服务器以加载新的BGWorker。 在“bgworker-master”这个压缩包中,很可能是...

    Postgresql-10安装包

    10. **阅读官方文档**:PostgreSQL 提供详细的官方文档,包括安装、配置和使用指南,强烈建议在安装和使用过程中参考。 **四、安装脚本的使用** 如果你从博主那里获取了安装脚本,通常这是一个包含上述步骤的自动...

    linux配置postgresql

    Linux 配置 PostgreSQL ...配置 PostgreSQL 数据库需要多个步骤,包括建立 postgres 用户、建立数据库目录、初始化数据库和启动 PostgreSQL。但是,只有通过正确的步骤和安全措施,才能确保数据库的安全和可靠性。

    PostgreSQL 存储过程调试

    在psql中,虽然没有图形化的断点,但可以通过退出和重新进入存储过程来模拟类似效果。 4. **查看和修改变量** 在存储过程中,可以使用`RAISE NOTICE`语句打印变量值,以便了解程序执行过程中的状态。对于临时修改...

    linux搭建postgresql、postgis、pg_pathman环境步骤以及需要的软件包

    在Linux系统上搭建PostgreSQL、PostGIS和pg_pathman环境是一项关键的任务,这些组件共同构成了一个强大的地理空间数据库解决方案。PostgreSQL是一种开源的关系型数据库管理系统,具有高度的可扩展性和可靠性;...

    pgadmin3-1.10.2 -postgresql可视化工具

    **pgadmin3-1.10.2:PostgreSQL的可视化宝藏** 在数据库管理的世界里,pgadmin3是一款不可或缺的工具,特别是在与 PostgreSQL 数据库打交道时。标题中的 "pgadmin3-1.10.2" 指的是 pgadmin 的一个特定版本,即...

    mysql实时同步pg

    在这个场景中,我们将使用Flink CDC来实现MySQL到PostgreSQL的实时数据同步。 首先,我们需要配置源数据库和目标数据库的信息。在MySQL端,我们需要指定要同步的数据库和表,以及MySQL的连接信息。在PostgreSQL端,...

    postgresql12主从集群安装

    - 初始化:`/usr/local/pgsql/postgresql-12.2/bin/initdb -D /usr/local/pgsql/postgresql-12.2/data/` 8. 配置数据库: - 修改`postgresql.conf`以设置监听地址(例如,监听本地IP):`vi /usr/local/pgsql/...

    Postgresql存储过程

    Postgresql存储过程详解 Postgresql存储过程是指在Postgresql数据库中定义的一组SQL语句的...Postgresql存储过程是Postgresql数据库中的一种强大工具,可以实现复杂的操作,提高数据库服务器的性能和应用程序的性能。

    PostgreSQL 9.6 RPM包

    5. **初始化数据库**:安装完成后,你需要初始化PostgreSQL数据库集群。使用`initdb`命令,例如: ``` sudo /usr/pgsql-9.6/bin/initdb -D /var/lib/pgsql/9.6/data ``` 这将在指定目录创建数据库集群。 6. **...

    postgresql14+postgis32_14

    安装步骤通常包括解压文件、配置环境变量、初始化数据库集群、安装 PostGIS 扩展以及启动 PostgreSQL 服务。在设置过程中,你需要关注数据目录的位置、端口设置、用户权限等关键参数。 一旦安装完成,你可以使用 ...

    PostgreSQL12.2中文手册.chm.7z

    PostgreSQL是一种开源的对象关系型数据库管理系统(ORM DBMS),它以其强大的功能、高度的可扩展性和稳定性在全球范围内被广泛使用。版本12.2是PostgreSQL的一个重要版本,提供了许多新特性和性能优化,旨在提升...

    Linux下PostgreSQL安装与开机启动

    为了让系统能够识别PostgreSQL相关的路径和配置,我们需要修改`/etc/profile`文件来添加环境变量。 ##### 操作命令: ```bash vi /etc/profile ``` **需要添加的环境变量:** ```bash export LD_LIBRARY_PATH=/usr...

Global site tag (gtag.js) - Google Analytics