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

开始

基本上:

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

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

结束

原文地址:https://www.cnblogs.com/gaojian/p/2756956.html