#author("2018-01-11T15:08:39+00:00","default:haikikyou","haikikyou")
#author("2018-01-13T13:42:29+00:00","default:haikikyou","haikikyou")
[[PostgreSQL/開発]]

#contents

* バックグラウンドワーカプロセス [#q64b878d]

PostgreSQLでは、クライアントコネクション接続を処理するバックエンドプロセスとは異なるプロセスを実行することができる。このバックグラウンドワーカプロセスは、postmasterプロセスによって起動(fork)され、ワーカプロセスの状態はpostmasterの起動・停止・監視とリンクしている。このバックグラウンドワーカの仕組みは、パラレルワーカでも使われており、バックエンドプロセスから動的にバックグラウンドワーカプロセスを起動することも可能である。
PostgreSQLでは、クライアントコネクション接続を処理するバックエンドプロセスとは異なるプロセスを実行することができる。このバックグラウンドワーカプロセスは、''postmasterプロセスによって起動''(fork)され、ワーカプロセスの状態はpostmasterの起動・停止・監視とリンクしている。このバックグラウンドワーカの仕組みは、パラレルワーカでも使われており、バックエンドプロセスから動的にバックグラウンドワーカプロセスを登録(※)することも可能である。

バックグラウンドワーカは、バージョン9.3から機能追加されている。~
9.4からは動的にバックグラウンドワーカを起動できるように拡張されている。

* バックグラウンドワーカプロセスの起動 [#j230d805]

バックグラウンドワーカは、Postmaster起動時及び起動後のタイミングで起動することができる(便宜上、ここではPostmaster起動時のワーカを静的、Posmaster起動後のワーカを動的と呼ぶこととする)。
#ref(./background-worker-overview.png,100%)

なお、バックグラウンドワーカは起動可能なタイミングによって呼び出す関数が異なるが、バックグラウンドワーカ自体は同じ構造体変数で表現される。

&label(info){補足};※ 登録と記述しているのは、実際にプロセス生成を行なうのがpostmasterプロセスであるためである。バックグラウンドワーカの起動は、呼び出し側がposmasterにシグナル送信(SIGUSR1)し、postmasterがforkすることで実現されている。

* バックグラウンドワーカプロセスのフロー [#j230d805]

バックグラウンドワーカは、Postmaster起動時及び起動後のタイミングで登録することができる(便宜上、ここではPostmaster起動時のワーカを静的、Posmaster起動後のワーカを動的と呼ぶこととする)。静的、動的では以下の違いがある。

- 静的バックグラウンドワーカ('''BackgroundWorker''')
-- ''%%%postmaster起動時%%%''(postmasterプロセスからの呼び出し)
-- shared_preload_librariesによる初期化中
- 動的バックグラウンドワーカ('''DynamicBackgroundWorker''')
--''%%% postmaster起動時以外%%%''(''NOT'' postmasterプロセスからの呼び出し)。バックエンドプロセス、静的バックグラウンドワーカ、動的バックグラウンドワーカから登録が可能。

静的・動的でバックグラウンドワーカを登録する関数は異なるが、バックグラウンドワーカ自体は、同じ構造体変数で表現され、共有メモリ上のバックグラウンドワーカ配列で管理される。

#ref(./background-worker-process-image.png,100%)
* BackgroundWorker構造体 [#wdbe9fdd]

バックグラウンドワーカの登録は、BackgroundWorker構造体を介して行なう。以下、静的バックグラウンドワーカを登録する例である。

#geshi(c){{{
/*
 * Module load callback
 */
void
_PG_init(void)
{
	BackgroundWorker worker;

	/* Setup worker information */
	memset(&worker, 0, sizeof(worker));
	worker.bgw_flags = BGWORKER_SHMEM_ACCESS |
		BGWORKER_BACKEND_DATABASE_CONNECTION;
	worker.bgw_start_time = BgWorkerStart_RecoveryFinished;
	worker.bgw_restart_time = BGW_NEVER_RESTART;
	sprintf(worker.bgw_library_name, "myworker");
	sprintf(worker.bgw_function_name, "myworker_main");
         // 静的バックグラウンドワーカの場合は、0以外は無効(ワーカが登録されない)
	worker.bgw_notify_pid = 0;
	snprintf(worker.bgw_name, BGW_MAXLEN, "myworker");

	/* Register a background worker */
	RegisterBackgroundWorker(&worker);
}
}}}
* 参考リンク [#o7ea3c3f]

- [[並列クエリを実行するPostgreSQLのアーキテクチャ>https://www.slideshare.net/kaigai/postgresql-64441503]] - &size(11){&color(gray){https://www.slideshare.net/kaigai/};};
- [[PostgreSQL 9.6.X 文書 第45章 バックグラウンドワーカプロセス>https://www.postgresql.jp/document/9.6/html/bgworker.html]] - &size(11){&color(gray){https://www.postgresql.jp/document/9.6/html/};};
- [[Chapter 47. Background Worker Processes>https://www.postgresql.org/docs/10/static/bgworker.html]] - &size(11){&color(gray){https://www.postgresql.org/docs/10/static/};};
- [[postmaster/bgworker.c>https://git.postgresql.org/gitweb/?p=postgresql.git;a=blob;f=src/backend/postmaster/bgworker.c;h=b690b1b0b85e905572919f86255c0f6c09f54b16;hb=b8279a783dafb7c715b3835d4c9244d3451c4c1a]] - &size(11){&color(gray){https://git.postgresql.org/gitweb/?p=postgresql.git;a=shortlog;h=refs/heads/REL_10_STABLE};};


トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
目次
ダブルクリックで閉じるTOP | 閉じる
GO TO TOP