本記事では、以下の IPC について説明します。
IPC の種類 | 特徴 | 具体例 |
---|---|---|
パイプ (匿名パイプ) | 単方向・プロセスを fork | シェルのパイプ (|) |
名前付きパイプ (FIFO) | ファイルシステムを使うパイプ 権限を持つ全プロセスで利用可 | mkfifo コマンド |
シグナル | 割り込み処理 | Ctrl + C (SIGINT) |
メッセージキュー | メッセージ単位で読み書き 非同期通信可能 | 専用のソフトウェアを使う場合も (例:Apache Kafka) |
セマフォ/mutex | 排他制御に使用 | データベース (mutex でロックを実現) |
共有メモリ | 高速 排他制御のためにセマフォを併用 | データベース |
Non-persisted メモリマップドファイル | 共有メモリの作成に利用 メモリを直接読み書き | 共有メモリの作成に利用 |
ソケット (インターネットソケット) | ネットワーク越しで通信可能 双方性・プロセス fork 不要 | TCP/UDP 通信 |
UNIX ドメインソケット | ローカル通信のみ ソケットより早い | システムログの /dev/log Web と AP サーバー間の通信 |
Linux カーネルの機能 | |||
---|---|---|---|
各 IPC の詳細
パイプの利用例は、シェルのパイプ (|) です。
例えば「cat test.txt | grep abc」の場合、親プロセスの cat 出力が pipe0 を経由して、子プロセス grep の入力となります。
名前付きパイプの利用例は、mkfifo コマンドです。
名前付きパイプの作成 (mkfifo コマンド)
名前付きパイプは、以下のコマンドで作成可能です。
ファイルの種類が名前付きパイプ (先頭のシンボルが "p") であることが確認できます。
prw-rw-r-- 1 ec2-user ec2-user 0 1月 6 06:44 my_pipe
名前付きパイプを使ったプロセス間の通信は以下のとおりです。
別の端末から、以下のコマンドを実行します。
cat プロセス側の端末を見ると、echo プロセスから送信されたデータ ("test") を確認できます。
名前付きパイプの特徴
ファイルシステムを使うため、以下の特徴を持ちます。
シグナルの利用例は、プロセスを終了するショートカットキー Ctrl + C (SIGINT) です。
シグナル一覧
代表的なシグナルは以下です。(全てのシグナル一覧はこちら)
ID (番号) | シグナル | 動作※ | 説明 (シグナルの意味) |
---|---|---|---|
1 | SIGHUP | 終了 | 端末の終了/プロセスの死 |
2 | SIGINT | 終了 | キーボードからの割り込みシグナル |
3 | SIGQUIT | コア | キーボードによる中止 |
9 | SIGKILL | 終了 | Kill シグナル |
17 | SIGCHLD | 無視 | 子プロセスの一時停止 (stop) または終了 |
18 | SIGCONT | 続き | 一時停止 (stop) からの再開 |
19 | SIGSTOP | 停止 | プロセスの一時停止 |
※「動作」は、デフォルトで以下の動作となります。
なお、SIGKILL と SIGSTOP 以外はデフォルトから変更可能です。
任意のシグナルを送信 (kill コマンド)
kill コマンドを利用することで、任意のシグナルを送信可能です。
PID TTY TIME CMD 26452 pts/0 00:00:00 ps 30812 pts/0 00:00:00 bash
Connection to 192.0.2.1 closed.
SIGHUP により、端末が終了しました。
メッセージキューの利用例は、プロセス間で非同期に通信する際のバッファです。
大規模なメッセージキューを必要とする場合は、専用のソフトウェア (Apache Kafka など) を利用します。
メッセージキューの確認 (ipcs コマンド)
メッセージキューは、ipcs コマンドで確認可能です。
------ メッセージキュー -------- キー msqid 所有者 権限 使用済みバイト数 メッセージ ------ 共有メモリセグメント -------- キー shmid 所有者 権限 バイト nattch 状態 ------ セマフォ配列 -------- キー semid 所有者 権限 nsems
セマフォ/mutex の利用例は、データベースのリソース制限やロックです。
セマフォの詳細
セマフォのルールは以下の4つです。
- セマフォの値をリソースの数と同じにします
- リソースを使用すると、セマフォの値を1減らします
- セマフォの値 (利用可能なリソース) が0でプロセスを実行する場合、リソースの解放待ちとなる
- リソースの使用が終わると、セマフォの値を1増やします
待ち状態のプロセスを、実行状態にするためには、コンテキストスイッチが発生します。
mutex の詳細
mutex は、値が0と1しかないセマフォです。
また、スピンロック (CPU で無意味な処理) を利用して、プロセスを実行状態のままにしながらリソースの解放待ちをします。そのため、コンテキストスイッチが発生しない代わりに、CPU を消費し続けます。
セマフォと mutex の違いをまとめると以下のとおりです。
セマフォ | mutex | |
---|---|---|
利用用途 | しばらくリソースが解放されない時 | すぐにリソースが解放される時 |
コンテキストスイッチ | あり (待ち状態から復帰に時間がかかる) | なし |
スピンロック | なし | あり (CPU に負荷をかける) |
とりうる値 | 複数 | 0と1 (使用/未使用) |
セマフォの確認方法 (ipcs コマンド)
セマフォ配列は、ipcs コマンドで確認可能です。
------ メッセージキュー -------- キー msqid 所有者 権限 使用済みバイト数 メッセージ ------ 共有メモリセグメント -------- キー shmid 所有者 権限 バイト nattch 状態 ------ セマフォ配列 -------- キー semid 所有者 権限 nsems
共有メモリの利用例は、データベースのキャッシュや WAL バッファです。
共有メモリの特徴
共有メモリは、他の IPC と異なり、カーネルを経由しないため高速で動作します。
(IPC ベンチマークの結果はこちら)
共有メモリの欠点
共有メモリのアクセスにカーネルを経由しないため、排他制御を実装する必要があります。
排他制御でリソースを利用中かどうかを判断するために、セマフォ/mutex を利用します。
共有メモリの確認 (ipcs コマンド)
共有メモリは、ipcs コマンドで確認可能です。
------ メッセージキュー -------- キー msqid 所有者 権限 使用済みバイト数 メッセージ ------ 共有メモリセグメント -------- キー shmid 所有者 権限 バイト nattch 状態 ------ セマフォ配列 -------- キー semid 所有者 権限 nsems
Non-persisted メモリマップドファイルの利用例は、共有メモリを作成です。
なお、Non-persisted メモリマップドファイルは永続化されていません。(ストレージにファイルが関連づけられていません)
一般的にソケットは、<IP アドレス> と <ポート番号> で指定します。
ソケットの確認方法 (netstat コマンド)
Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 200 ip-192-0-2-1:ssh 198.51.100.1:60000 ESTABLISHED tcp 0 0 ip-192-0-2-1:50000 198.51.100.1:https ESTABLISHED
UNIX ドメインソケットの利用例は、「システムログの /dev/log」や、「Web サーバーと AP サーバーの通信」です。
一般的に UNIX ドメインソケットは、ファイルパスで指定します。
UNIX ドメインソケットの確認方法 (netstat コマンド)
Proto RefCnt Flags Type State I-Node Path unix 3 [ ] DGRAM 10000 /run/systemd/notify unix 6 [ ] DGRAM 10001 /run/systemd/journal/socket
関連情報
Linux カーネルの機能 | |||
---|---|---|---|