上篇博客簡要的介紹了下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文件中}
延伸閱讀
- ssh框架 2016-09-30
- 阿里移動安全 [無線安全]玩轉(zhuǎn)無線電——不安全的藍牙鎖 2017-07-26
- 消息隊列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 論文筆記【圖片目標分割】 2017-07-26
- 詞向量-LRWE模型-更好地識別反義詞同義詞 2017-07-26
- 從棧不平衡問題 理解 calling convention 2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明 2017-07-26
- Swift實現(xiàn)JSON轉(zhuǎn)Model - HandyJSON使用講解 2017-07-26
- 阿里移動安全 Android端惡意鎖屏勒索應(yīng)用分析 2017-07-26
- 集合結(jié)合數(shù)據(jù)結(jié)構(gòu)來看看(二) 2017-07-26