本記事では、以下の 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 の入力となります。
![](https://hogetech.info/wp-content/uploads/2023/01/pipes3-1024x476-1.webp)
名前付きパイプの利用例は、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 ベンチマークの結果はこちら)
![](https://hogetech.info/wp-content/uploads/2023/01/612f43071a2a0f44423b8bcb86c93e1a-4.png)
![](https://hogetech.info/wp-content/uploads/2023/01/7fb8f1c748d490339c64aa37f2515920-1.png)
共有メモリの欠点
共有メモリのアクセスにカーネルを経由しないため、排他制御を実装する必要があります。
![](https://hogetech.info/wp-content/uploads/2023/01/01e20b05948409296d32314122ce234d-2.png)
![](https://hogetech.info/wp-content/uploads/2023/01/deb17bd5bd307fcd49379fd7617489d9-1.png)
排他制御でリソースを利用中かどうかを判断するために、セマフォ/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 カーネルの機能 | |||
---|---|---|---|
参考資料
![](https://hogetech.info/wp-content/uploads/cocoon-resources/blog-card-cache/34d9df1de1ec1cf4193dd4be68c43dca.png)
![](https://upload.wikimedia.org/wikipedia/commons/e/ef/ArchitectureCloudLinksSameSite.png)
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Fadvent-calendar-ogp-background-f625e957b80c4bd8dd47b724be996090.jpg?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTkxNiZoPTMzNiZ0eHQ9JUUzJTgzJTk3JUUzJTgzJUFEJUUzJTgyJUJCJUUzJTgyJUI5JUU5JTk2JTkzJUU5JTgwJTlBJUU0JUJGJUExJUUzJTgxJUFFJUU3JUE4JUFFJUU5JUExJTlFJnR4dC1jb2xvcj0lMjMzQTNDM0MmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9NTYmdHh0LWNsaXA9ZWxsaXBzaXMmdHh0LWFsaWduPWxlZnQlMkNtaWRkbGUmcz1iY2RhZjJhNTQwMDM3NmZiNzU4M2ZjNTUxYzM4MzgwYw&mark-x=142&mark-y=151&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTYxNiZ0eHQ9JTQwbjAxZTAmdHh0LWNvbG9yPSUyMzNBM0MzQyZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT0zNiZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZzPTlhMjQyMWRhZDY3MDQ2N2M2MDQwOGExZWQwYjBkMmFi&blend-x=142&blend-y=491&blend-mode=normal&s=90c3e422994f81e3b55d7c64a27b7c28)