0.9 プロセス間通信

 Linuxカーネル上では、各プロセスは独立して動作していますが、プロセス間通信を利用することによって、複数プロセスが連携して動作可能です。

 UNIX独特の通信方式として最も歴史が長いのはパイプです。パイプは親子プロセスの間しかつなげませんが、このパイプによって、単機能のコマンドを組み合わせて複雑な動作を実現できます。また、親子関係のないプロセス間でも利用できるように拡張した名前付きパイプというものもあります。Linuxカーネルにおけるパイプの実装はオーソドックスですが、パイプで接続されたプロセス間で無駄にプロセス切り替えが発生しないように、プリエンプションの発生回数を抑制するような実装になっています。

 System V IPCと呼ばれているプロセス間通信機能も実装されています。共有メモリ、セマフォ、メッセージと呼ばれるものです。これらのうち、共有メモリの実装は非常に面白く、ファイルシステムとしてもアクセス可能です。そのファイルシステムは、仮想メモリファイルシステムtempfsと呼ばれています。これはprocファイルシステムなどと同様に、共有メモリに仮想ファイルシステムのインターフェイスを定義することによって実現しています。

 Linuxカーネル2.6に取り込まれた新しいプロセス間通信としてFUTEXというものがあります。同一マシン上の複数のプロセス間で、非常に軽い資源のロック機構を実現します。同一ページをプロセス間でマップし、その上のロック変数を共有することによって、競合が発生しない限りシステムコールを介さずに排他できます。たくさんのプロセスやスレッドが協調して動作するアプリケーションでは、非常に有効な仕組みです。

 パイプの実装に関しては、「第18章 特殊ファイルのアクセス」で解説します。共有メモリの仕組みに関しては、「第13章 プロセス空間の管理」で触れることにします。