Linuxのカーネルの開発に関する世界観(IPC)です。
Linuxにおいて、プロセスには個別のメモリ空間が与えられる。
これに対して、スレッドはプロセスよりも軽量であり、プロセスの中で同じメモリ空間を共有する。
スレッドにおいては、並列処理を行うコードは適切に「ロック」すなわち排他制御をし、競り合い状態が発生しないスレッドセーフなものにする必要がある。
また、プロセスにおいては、「プロセス間通信」(IPC)という仕組みを行うことで、異なるプロセスの中でデータを共有できる。
LinuxにおけるIPCには、共有メモリ、セマフォ、マップドメモリ、パイプ、ソケット通信などがある。
共有メモリは、複数のプロセスの間でメモリ領域を共有することで、データを共有する機能。
セマフォは、排他制御を行うための仕組み。整数値を共有する。同時に使えることのできる人数のうち、あとどれくらいの人が使えるかを表す。
マップドメモリは、メモリマップドファイルとも呼ばれ、ファイルを通じて複数のプロセスがデータを共有する。
このほか、パイプ、ソケットなどを用いても、複数のプロセスでデータを共有することができる。
メッセージキューを参照のこと。
(以下は「オペレーティングシステム―設計と理論およびMINIXによる実装」を参考に執筆しました。)
デッドロックにおけるもっとも簡単な解決方法はダチョウアルゴリズム。すなわち、「砂の中に頭を入れて、問題などなんにもないかのようなふりをする」。
デッドロックは平均50年に一度の割合で発生するとして、ほかの問題(たとえばハードウェアの故障など)は月に一度の割合で発生するとしたら、デッドロックを無視しても性能的に問題はないと考えてもおかしくはない。
たとえば、プロセステーブルがいっぱいであるためFORKが失敗した場合、適当な時間だけ待って再試行すればよい。
UNIXでもMINIXでも、このように、デッドロックを見つけようとせず、ほうっておけば自動的に解決するという考え方を採用している。
以下のページが参考になります。
また、以下のページに参考になる内容があります。日本語版もあります。
MINIX本では、IPCについて詳細が記述されています。
Linuxでは、flock(), lockf(), fcntl()などのファイルロックのシステムコールをサポートしている。flock()はBSD系、lockf()は非BSD系。
(詳解 Linuxカーネル 第2版を参考に執筆しました。)
スピンロックは、マルチプロセッサ環境に特化して設計されたロック機構。単一プロセッサでは利用できない。
Linuxカーネルのスピンロックの進歩について、詳しくは以下が参考になる。
並列処理については並列処理を参照のこと。