プログラムが、要求された仕様を満たすことを整合(consistent) という。一般的な整合性(Consistency)は、並列に動作するプログラムが直列可能(Serializable)である場合にのみ得られる。並列環境下で直列可能性を保証するためには、同期機構が必要となる。(consitentの反対はinconsitent (矛盾)、従って、整合のことを無矛盾ともいう)
プロセスは固有のアドレス空間において実行される。アドレス空間を複数のプロセスが共有する場合がある。プロセス自身の要求もあれば、(メモリ使用量を減らすために)カーネルが自動的に行うこともある。
プロセス間通信を利用して、一部のアドレス空間を共有することもできる。mmap()システムコールは、ファイルやブロック型デバイス内の情報をアドレス空間の一部へマッピングできる。
再入可能なカーネルを実装するには同期機構が必要である。
何らかの計算結果が2つ以上のプロセスのスケジューリングに依存する場合、これを競合状態にある(race condition)という。
グローバル変数へのアクセスは、分割できない操作(atomic operation)を行うことにより保証するが、1回の操作でアクセスできないデータ(例えば連結リスト)があり、少なくとも2つのポインタへ同時にアクセスすることになる。
クリティカル区間(critical section)とは、その部分の実行を開始したプロセスが、他のプロセスが同じ部分を実行する前にその処理を終了する必要があるコード領域のことをいう。
カーネルパスが互いに同期を取る方法として、以下のもの挙げられる。
カーネル内プリエンプト(preemptive)の禁止
クリティカル区間を実行する前にカーネル内のプリエンプトを禁止し、クリティカル区間を抜けたときにプリエンプトを許可する。異なるCPUが同じデータに同時にアクセスする可能性があるため、マルチプロセッサシステムでは不十分といえる。
割り込み禁止
カーネル内のプリエンプトの禁止と同じように、クリティカル区間のハードウェアの割り込みを禁止する方法。これも、マルチプロセッサシステムでは不十分である。
セマフォ(semaphore)
セマフォとは、データに関連付けたカウンタである。整数型変数、待ち状態にあるプロセスのリスト、2つのメソッド(down()とup())のオブジェクトからなる。保護するデータのセマフォを1に初期化し、down()を実行して正の値であればデータへのアクセスが許可され、負であれば実効を止め、他のプロセスがup()を実行するまで再開できない。
スピンロック(spin lock)
短い時間でデータ更新する場合、スピンロックが利用される。セマフォと似ているが,スピンロックはプロセスリストを持たない。他のプロセスによってロックされていることを検出したプロセスは、ロックが解除されるまで短いループを繰り返してアクセスできないようにする。
デッドロック(Dead Lock)の回避
最も分かり易いデッドロックとして、プロセスp1がデータaへのアクセスを許可され、プロセスp2がbへのアクセスを許可されるが、p1は次にbへのアクセス許可を待ち、p2はaへのアクセス許可を待つ、というものがある。p1、p2が互いに待っている状態なのでプロセスやカーネル実行パスが完全に停止していることになる。ロック要求をある決まった順序で揃えることで、この問題を回避する。
マルチプロセッサのプログラミングは必要なスキルだし、ここって、結構重要な部分だ。