Postgresql - 源码 - 数据库启动 -StartChildProcess

启动其他子进程。such as the bgwriter, walwriter, walreceiver, bootstrapper and the shared memory checker code.

包括 src/backend/postmaster/postmaster.c 中的

#define StartupDataBase()       StartChildProcess(StartupProcess)

#define StartBackgroundWriter() StartChildProcess(BgWriterProcess)

#define StartCheckpointer()     StartChildProcess(CheckpointerProcess)

#define StartWalWriter()        StartChildProcess(WalWriterProcess)

#define StartWalReceiver()      StartChildProcess(WalReceiverProcess)

1. 在数据库进行检查(权限,文件,文件夹等)之后,会先进行 StartupDataBase(),启动数据库进程。

2. 随后,运行ServerLoop() 函数, 其他的子进程会被启动。(ServerLoop函数具体位置请参考数据库启动-backend启动)

函数位置

src/backend/postmaster/postmaster.c StartChildProcess(AuxProcType type) --> AuxiliaryProcessMain

backend/bootstrap/bootstrap.c AuxiliaryProcessMain(int argc, char *argv[]) --> StartupProcessMain

src/backend/postmaster/startup.c StartupProcessMain(void)

    if (IsUnderPostmaster)

    {

        const char *statmsg;

        switch (MyAuxProcType)

        {

            case StartupProcess:

                statmsg = pgstat_get_backend_desc(B_STARTUP);

                break;

            case BgWriterProcess:

                statmsg = pgstat_get_backend_desc(B_BG_WRITER);

                break;

            case CheckpointerProcess:

                statmsg = pgstat_get_backend_desc(B_CHECKPOINTER);

                break;

            case WalWriterProcess:

                statmsg = pgstat_get_backend_desc(B_WAL_WRITER);

                break;

            case WalReceiverProcess:

                statmsg = pgstat_get_backend_desc(B_WAL_RECEIVER);

                break;

            default:

                statmsg = "??? process";

                break;

        }

所有进程启动完成。

猜你喜欢

转载自blog.csdn.net/chuckchen1222/article/details/82870245