• 对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 ]

    结束

  • 相关阅读:
    Excel 之查找与替换
    重拾Excel之为什么
    taobao
    祝我生日快乐
    啊哈哈哈哈!自由啦
    我是不是得了抑郁症?
    Be quiet
    tcpdump tutorial
    Java Thread 多线程同步、锁、通信
    java 堆、栈、常量池等
  • 原文地址:https://www.cnblogs.com/gaojian/p/2756956.html
Copyright © 2020-2023  润新知