postgresql整體概況

PostgreSQL是用一個簡單的"每個用戶對應一個進程"的client/server 模型實現的。在這種模式裏一個客戶端進程只是與一個服務器進程聯接。因爲我們不知道具體要建立多少個聯接,所以我們不得不利用一個主進程 在每次聯接請求時派生出一個新的服務器進程來。這個主進程叫做postmaster,它監聽着一個特定TCP/IP 端口等待進來的聯接。每當檢測到一個聯接請求時,postmaster 進程派生出一個新的叫postgres的服務器進程。服務器任務(postgres進程)相互之間使用信號燈和共享內存進行通訊,以確保在並行的數據訪問過程中的數據完整性。

介紹下包含後臺服務器端代碼的文件夾:src/backend ,整理其各子文件夾作用:
access: 存儲訪問,支持堆, 索引, 和事務對數據的存取。
bootstrap: 系統初始化
catalog: 系統表以及操作。包含用於操作系統表和系統目錄的函、數表、索引、過程、運算符、類型。它們都是低層的函數,通常由上層將用戶請求格式化爲預定義格式的函數調用。
command: 各種管理命令,不需要executor執行的命令。這些命令是不需要複雜處理的SQL命令,包括copy,alter,create table等等。調用這一部分代碼時使用由parser生成的結構。大多數函數先做一些處理,然後就調用catalog目錄下的一些低層函數來完成實際的工作。
executor: 執行器,執行來自optimizer的複雜的節點形式的查詢計劃。處理select, insert, update,和delete語句. 處理這些語句的操作包括堆掃描、索引掃描、排序、連接表、分組、計算集函數和唯一性處理。
libpq: 通信接口,處理後臺服務器與客戶進程之間的通訊。
Main: 主程序,將控制轉到postmaster或postgres
Nodes: 查詢處理過程中採用的大量抽象數據結構(查詢樹,連接樹,查詢計劃)。PostgreSQL將SQL查詢存儲到稱爲節點的結構中。
parse: 語法分析
port: 各種os平臺的移植
postmaster: 守護進程,控制postgres服務器啓動/終止。創建共享內存,然後循環等待連接請求。請求到達時,啓動一個postgres服務器進程,由它來處理這個連接。
rewrite: 重寫(postgresql的規則系統實現,它的視圖就是基於規則系統的)
storage: 存儲,緩衝區,進程間通信,管理各種類型的存儲系統。
tcop: 命令處理,將請求分派到合適的模塊。postgres後臺服務進程的主要處理部分,它調用parser,optimizer,executor和commands中的函數。
utils: 輔助性的工具,支持功能。
optimizer: 創建查詢路徑和查詢計劃。使用parser的輸出來爲executor生成優化了的查詢計劃。
regex: 正則表達式庫

再來說說執行過程。

數據庫一運行,主函數進去main-> PostmasterMain-> ServerLoop 等待連接的到來。

PostmasterMain運行過程:

postgresMain 怎麼被調用?

其一:main->PostgresMain

       if (argc > 1 && strcmp(argv[1], "--single") == 0)

              exit(PostgresMain(argc, argv, get_current_username(progname)));

其二:main->SubPostmasterMain->BackendRun->PostgresMain

#ifdef EXEC_BACKEND

       if (argc > 1 && strncmp(argv[1], "--fork", 6) == 0)

              exit(SubPostmasterMain(argc, argv));

#endif

EXEC_BACKEND 什麼意思,還沒看明白,主要是找不到定義的地方。有知道的請告知,謝謝。

PostgresMain運行過程如下:

發佈了41 篇原創文章 · 獲贊 4 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章