对PostgreSQL中后台进程的内存结构建立的初步跟踪

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核8GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介:

开始

基本上:

AuxiliaryProcessMain  --> BaseInit --> InitCommunication --> CreateSharedMemoryAndSemaphores

AuxiliaryProcessMain 是各个后台进程(bgwriter等)的调用起始点

[作者:技术者高健@博客园  mail: luckyjackgao@gmail.com ]

复制代码
/*                    
 *     AuxiliaryProcessMain                
 *                    
 *     The main entry point for auxiliary processes, such as the bgwriter,                
 *     walwriter, walreceiver, bootstrapper and the shared memory checker code.                
 *                    
 *     This code is here just because of historical reasons.                
 */                    
void                    
AuxiliaryProcessMain(int argc, char *argv[])                    
{                    
    ……                
    /*                
     * Fire up essential subsystems: error and memory management                
     *                
     * If we are running under the postmaster, this is done already.                
     */                
    if (!IsUnderPostmaster)                
        MemoryContextInit();            
                    
    ……                
    /*                
     * Identify myself via ps                
     */                
    if (IsUnderPostmaster)                
    {                
        const char *statmsg;            
                    
        switch (MyAuxProcType)            
        {            
            case StartupProcess:        
                statmsg = "startup process";    
                break;    
            case BgWriterProcess:        
                statmsg = "writer process";    
                break;    
            case CheckpointerProcess:        
                statmsg = "checkpointer process";    
                break;    
            case WalWriterProcess:        
                statmsg = "wal writer process";    
                break;    
            case WalReceiverProcess:        
                statmsg = "wal receiver process";    
                break;    
            default:        
                statmsg = "??? process";    
                break;    
        }            
        init_ps_display(statmsg, "", "", "");            
    }                
                    
    ……                
    BaseInit();                
                    
    /*                
     * When we are an auxiliary process, we aren't going to do the full                
     * InitPostgres pushups, but there are a couple of things that need to get                
     * lit up even in an auxiliary process.                
     */                
    if (IsUnderPostmaster)                
    {                
        /*            
         * Create a PGPROC so we can use LWLocks.  In the EXEC_BACKEND case,            
         * this was already done by SubPostmasterMain().            
         */            
        #ifndef EXEC_BACKEND            
            InitAuxiliaryProcess();        
        #endif            
        ……            
    }                
                    
    /*                
     * XLOG operations                
     */                
    SetProcessingMode(NormalProcessing);                
                    
    switch (MyAuxProcType)                
    {                
        ……            
        case BgWriterProcess:            
            /* don't set signals, bgwriter has its own agenda */        
            BackgroundWriterMain();        
            proc_exit(1);        /* should never return */
        ……            
    }                
}                    
复制代码

而其中的 BaseInit 要完成如下几件事:

复制代码
 * Early initialization of a backend (either standalone or under postmaster).    
 * This happens even before InitPostgres.    
 *    
 * This is separate from InitPostgres because it is also called by auxiliary    
 * processes, such as the background writer process, which may not call    
 * InitPostgres at all.    
 */    
void    
BaseInit(void)    
{    
    /*
     * Attach to shared memory and semaphores, and initialize our
     * input/output/debugging file descriptors.
     */
    InitCommunication();
    DebugFileOpen();
    
    /* Do local initialization of file, storage and buffer managers */
    InitFileAccess();
    smgrinit();
    InitBufferPoolAccess();
}    
复制代码

对于  InitCommunication ,是这样的:

复制代码
/* --------------------------------            
 *        InitCommunication    
 *            
 *        This routine initializes stuff needed for ipc, locking, etc.    
 *        it should be called something more informative.    
 * --------------------------------            
 */            
static void            
InitCommunication(void)            
{            
    /*        
     * initialize shared memory and semaphores appropriately.        
     */        
    if (!IsUnderPostmaster)        /* postmaster already did this */
    {        
        /*    
         * We're running a postgres bootstrap process or a standalone backend.    
         * Create private "shmem" and semaphores.    
         */    
        CreateSharedMemoryAndSemaphores(true, 0);    
    }        
}            
复制代码

真正建立为每个后台进程建立内存结构的,就是这个  CreateSharedMemoryAndSemaphores






本文转自健哥的数据花园博客园博客,原文链接:http://www.cnblogs.com/gaojian/archive/2012/11/06/2756956.html,如需转载请自行联系原作者

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍如何基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
5月前
|
Arthas 存储 算法
深入理解JVM,包含字节码文件,内存结构,垃圾回收,类的声明周期,类加载器
JVM全称是Java Virtual Machine-Java虚拟机JVM作用:本质上是一个运行在计算机上的程序,职责是运行Java字节码文件,编译为机器码交由计算机运行类的生命周期概述:类的生命周期描述了一个类加载,使用,卸载的整个过类的生命周期阶段:类的声明周期主要分为五个阶段:加载->连接->初始化->使用->卸载,其中连接中分为三个小阶段验证->准备->解析类加载器的定义:JVM提供类加载器给Java程序去获取类和接口字节码数据类加载器的作用:类加载器接受字节码文件。
469 55
|
3月前
|
监控 编译器 Python
如何利用Python杀进程并保持驻留后台检测
本教程介绍如何使用Python编写进程监控与杀进程脚本,结合psutil库实现后台驻留、定时检测并强制终止指定进程。内容涵盖基础杀进程、多进程处理、自动退出机制、管理员权限启动及图形界面设计,并提供将脚本打包为exe的方法,适用于需持续清理顽固进程的场景。
|
9月前
|
消息中间件 存储 网络协议
从零开始掌握进程间通信:管道、信号、消息队列、共享内存大揭秘
本文详细介绍了进程间通信(IPC)的六种主要方式:管道、信号、消息队列、共享内存、信号量和套接字。每种方式都有其特点和适用场景,如管道适用于父子进程间的通信,消息队列能传递结构化数据,共享内存提供高速数据交换,信号量用于同步控制,套接字支持跨网络通信。通过对比和分析,帮助读者理解并选择合适的IPC机制,以提高系统性能和可靠性。
1162 14
|
6月前
|
存储 NoSQL Redis
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 + 无锁架构 + EDA架构 + 异步日志 + 集群架构
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 + 无锁架构 + EDA架构 + 异步日志 + 集群架构
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 +  无锁架构 +  EDA架构  + 异步日志 + 集群架构
|
7月前
|
Linux Shell
Linux 进程前台后台切换与作业控制
进程前台/后台切换及作业控制简介: 在 Shell 中,启动的程序默认为前台进程,会占用终端直到执行完毕。例如,执行 `./shella.sh` 时,终端会被占用。为避免不便,可将命令放到后台运行,如 `./shella.sh &`,此时终端命令行立即返回,可继续输入其他命令。 常用作业控制命令: - `fg %1`:将后台作业切换到前台。 - `Ctrl + Z`:暂停前台作业并放到后台。 - `bg %1`:让暂停的后台作业继续执行。 - `kill %1`:终止后台作业。 优先级调整:
350 5
|
7月前
|
SQL 存储 缓存
【赵渝强老师】达梦数据库的内存结构
本文介绍了达梦数据库管理系统的内存结构,包括内存池、缓冲区、排序区和哈希区。内存池分为共享内存池和运行时内存池,能够提高内存申请与释放效率,并便于监控内存使用情况。缓冲区涵盖数据缓冲区、日志缓冲区、字典缓冲区和SQL缓冲区,用于优化数据读写和查询性能。排序区和哈希区分别提供排序和哈希连接所需的内存空间,通过合理配置参数可提升系统效率。文内附有具体配置示例及视频讲解,帮助用户深入理解达梦数据库的内存管理机制。
172 0
|
9月前
|
消息中间件 Linux
Linux:进程间通信(共享内存详细讲解以及小项目使用和相关指令、消息队列、信号量)
通过上述讲解和代码示例,您可以理解和实现Linux系统中的进程间通信机制,包括共享内存、消息队列和信号量。这些机制在实际开发中非常重要,能够提高系统的并发处理能力和数据通信效率。希望本文能为您的学习和开发提供实用的指导和帮助。
620 20
|
10月前
|
运维 监控 Ubuntu
【运维】如何在Ubuntu中设置一个内存守护进程来确保内存不会溢出
通过设置内存守护进程,可以有效监控和管理系统内存使用情况,防止内存溢出带来的系统崩溃和服务中断。本文介绍了如何在Ubuntu中编写和配置内存守护脚本,并将其设置为systemd服务。通过这种方式,可以在内存使用超过设定阈值时自动采取措施,确保系统稳定运行。
354 4
|
10月前
|
C语言 开发者 内存技术
探索操作系统核心:从进程管理到内存分配
本文将深入探讨操作系统的两大核心功能——进程管理和内存分配。通过直观的代码示例,我们将了解如何在操作系统中实现这些基本功能,以及它们如何影响系统性能和稳定性。文章旨在为读者提供一个清晰的操作系统内部工作机制视角,同时强调理解和掌握这些概念对于任何软件开发人员的重要性。
|
10月前
|
Linux 调度 C语言
深入理解操作系统:从进程管理到内存优化
本文旨在为读者提供一次深入浅出的操作系统之旅,从进程管理的基本概念出发,逐步探索到内存管理的高级技巧。我们将通过实际代码示例,揭示操作系统如何高效地调度和优化资源,确保系统稳定运行。无论你是初学者还是有一定基础的开发者,这篇文章都将为你打开一扇了解操作系统深层工作原理的大门。
134 4

推荐镜像

更多