中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Windows系統下的PostgreSQL進程fork

發布時間:2021-08-30 11:07:09 來源:億速云 閱讀:157 作者:chen 欄目:大數據

本篇內容介紹了“Windows系統下的PostgreSQL進程fork”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

原稿用Markdown編寫,拷貝進微信平臺時段落有時發生反轉,段落1、2、3變成段落3、2、1,發布前可能沒有檢查出來,遇到別扭的地方試試反過來讀。

Windows系統API我并不熟悉,所以本篇大致點出過程,更多細節還請閱讀代碼和詳查微軟文檔。后邊還會有一篇講Windows下信號處理的模擬,內容跟這篇是關聯的。

這篇文章假定讀者已經了解*nix的fork,如果不了解,請自行閱讀相關資料。

1、*nix下PG后端(backend)進程的發起:

static int
BackendStartup(Port *port)
{
...
#ifdef EXEC_BACKEND
	pid = backend_forkexec(port);
#else							/* !EXEC_BACKEND */
	pid = fork_process();
	if (pid == 0)				/* child */
	{
...

當然這里還有一些其他邏輯,不細表,有興趣可以自己瞅瞅,都不復雜。

2、函數 fork_process

代碼位于 src/backend/postmaster/fork_process.c, 沒有什么很復雜的邏輯:

#ifndef WIN32
...
pid_t
fork_process(void)
{
...
	result = fork();
	if (result == 0)
	{

注意:這里有preprocessor,上邊這段代碼是 #ifndef WIN32 控制,也就是只在 *nix下有效。

3、Windows下的后端進程創建

編譯Windows版的方法,可以自行閱讀,它不一樣的地方之一是啟用預處理符 EXEC_BACKEND。這個開關在*nix一樣有效,有興趣可以自己試試啟用它編譯Linux版,個人感覺進程fork效率一定要低很多。

函數 backend_forkexec 中:

	av[ac++] = "postgres";
	av[ac++] = "--forkbackend";

這里增加兩個參數,一個是程序啟動的文件名,一個是參數forkbackend,指定這是要啟動一個fork后端的進程,啟動過程中會有一些影響:

	if (strcmp(argv[1], "--forkbackend") == 0 ||
	...
		PGSharedMemoryReAttach();

4、參數傳遞

fork()不需要考慮變量傳遞的問題,EXEC_BACKEND 時保存到臨時文件里:

paramHandle = CreateFileMapping(INVALID_HANDLE_VALUE,
...
param = MapViewOfFile(paramHandle, ...
...
if (!save_backend_variables(param, port, pi.hProcess, pi.dwProcessId))
...

這部分代碼在 EXEC_BACKEND 函數實現 internal_forkexec 里,可以結合Windows文檔去理解。

5、為新進程準備共享內存

if (!pgwin32_ReserveSharedMemoryRegion(pi.hProcess))

以后有機會寫共享內存時再寫,感覺尤其是Windows下挺有必要。

6、進程創建

在調用 save_backend_variables 之前:

	if (!CreateProcess(NULL, cmdLine, NULL, NULL, TRUE, CREATE_SUSPENDED,
					   NULL, NULL, &si, &pi))
	{

這里 cmdLine安裝路徑\postgres.exe --forkbackend nnn,最后一個參數是參數處理句柄,第一個參數的計算前幾天寫過。

從微軟文檔看,并沒有說新創建的進程與postmaster之間是父子關系:

Creates a new process and its primary thread. The new process runs in the security context of the calling process.

7、后端進程啟動不一樣的處理分支

Windows下調用 SubPostmasterMain

...
#ifdef EXEC_BACKEND
	if (argc > 1 && strncmp(argv[1], "--fork", 6) == 0)
		SubPostmasterMain(argc, argv);	/* does not return */
#endif
...

此函數位于:src/backend/postmaster/postmaster.c

SubPostmasterMain(int argc, char *argv[])

8、參數讀入

在Windows下,讀取由 CreateFileMapping 創建的文件映射句柄:

#ifdef _WIN64
	paramHandle = (HANDLE) _atoi64(id);
#else
	paramHandle = (HANDLE) atol(id);
#endif
	paramp = MapViewOfFile(paramHandle, FILE_MAP_READ, 0, 0, 0);

9、共享內存ReAttach

	if (strcmp(argv[1], "--forkbackend") == 0 ||
		strcmp(argv[1], "--forkavlauncher") == 0 ||
		strcmp(argv[1], "--forkavworker") == 0 ||
		strcmp(argv[1], "--forkboot") == 0 ||
		strncmp(argv[1], "--forkbgworker=", 15) == 0)
		PGSharedMemoryReAttach();

“Windows系統下的PostgreSQL進程fork”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

屯昌县| 饶平县| 建昌县| 库尔勒市| 华坪县| 梅河口市| 嘉兴市| 洪湖市| 蕲春县| 无棣县| 广州市| 六枝特区| 阿勒泰市| 丰都县| 眉山市| 大足县| 岳西县| 澜沧| 哈密市| 昭觉县| 辽阳市| 南部县| 盱眙县| 米脂县| 孝义市| 池州市| 普宁市| 丘北县| 呼图壁县| 滦平县| 壶关县| 新兴县| 大英县| 桃源县| 寿光市| 山东| 比如县| 海盐县| 阿瓦提县| 彝良县| 和平县|