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

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

那么,我們就先講講后臺的工作流程吧。


1.postgresql后臺工作流程

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

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

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

落實到代碼里呢?

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

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

line99: 函數(shù)MemoryContextInit()啟動必須的子系統(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ù)確定程序走向,這里進入了PostmasterMain(){跳轉(zhuǎn)至postmaster.c文件中}

延伸閱讀

學習是年輕人改變自己的最好方式-Java培訓,做最負責任的教育,學習改變命運,軟件學習,再就業(yè),大學生如何就業(yè),幫大學生找到好工作,lphotoshop培訓,電腦培訓,電腦維修培訓,移動軟件開發(fā)培訓,網(wǎng)站設(shè)計培訓,網(wǎng)站建設(shè)培訓學習是年輕人改變自己的最好方式