上篇博客簡(jiǎn)要的介紹了下psql命令行客戶端的前臺(tái)代碼。這一次,我們來看看后臺(tái)的代碼吧。

十分不好意思的是,上篇博客我們只說明了前臺(tái)登陸的代碼,沒有介紹前臺(tái)登陸過程中,后臺(tái)是如何工作的。即:后臺(tái)接到前臺(tái)的連接請(qǐng)求后發(fā)生了什么?調(diào)用了哪些函數(shù)?啟動(dòng)了哪些進(jìn)程?

那么,我們就先講講后臺(tái)的工作流程吧。


1.postgresql后臺(tái)工作流程

這里首先我們要知道postgresql是典型的“Server/Client”的模式。即服務(wù)器后臺(tái)有一個(gè)主進(jìn)程(postmaster),該進(jìn)程根據(jù)客戶端的連接請(qǐng)求,fork一個(gè)服務(wù)端進(jìn)程(postgres)為之服務(wù)。

具體來說,postmaster監(jiān)聽著一個(gè)特定的 TCP/IP 端口等待進(jìn)來的連接。每當(dāng)檢測(cè)到一個(gè)連接請(qǐng)求時(shí),postmaster進(jìn)程派生出一個(gè)新的叫postgres的服務(wù)器進(jìn)程。服務(wù)器任務(wù)(postgres進(jìn)程)相互之間使用信號(hào)量和共享內(nèi)存進(jìn)行通訊, 以確保在并行的數(shù)據(jù)訪問過程中的數(shù)據(jù)完整性。

前臺(tái)程序發(fā)出一個(gè)啟動(dòng)命令后到Postmaster后,Postmaster根據(jù)其提供的信息建立一個(gè)子進(jìn)程,也就是后臺(tái)進(jìn)程,專門為前臺(tái)服務(wù)。Postmaster負(fù)責(zé)維護(hù)后臺(tái)進(jìn)程的生命周期,但與后臺(tái)進(jìn)程相獨(dú)立。這樣在后臺(tái)進(jìn)程崩潰后可以重啟動(dòng)后臺(tái)進(jìn)程而不會(huì)和這些后臺(tái)進(jìn)程一起崩潰。

落實(shí)到代碼里呢?

我們首先看看\src\backend\main下的main.c文件。我們說過每個(gè)程序都有個(gè)“main”函數(shù),之前也說明了psql里的main函數(shù)。后臺(tái)的main函數(shù)就定義在main.c文件里。

在這個(gè)main函數(shù)里主要做了什么?我寫在下面:

line99: 函數(shù)MemoryContextInit()啟動(dòng)必須的子系統(tǒng)error和memory管理系統(tǒng);

line110:函數(shù)set_pglocale_pgservice()獲取并設(shè)置環(huán)境變量;

line146~148: 函數(shù)init_locale初始化環(huán)境變量;

line219~228:根據(jù)輸入?yún)?shù)確定程序走向,這里進(jìn)入了PostmasterMain(){跳轉(zhuǎn)至postmaster.c文件中}

網(wǎng)友評(píng)論