MutexとSemaphoreの大きな違いは、Mutexがロック機構であるのに対し、Semaphoreは信号伝達機構であることです。
複数のプロセスが同時に共有データにアクセスすると、データの不整合が発生することがあります。
データの一貫性を保つためには、プロセスの実行順序を維持する必要がある。
さらに、クリティカルセクションは、共有変数や共有資源にアクセスするコードセグメントです。
クリティカルセクションで複数のプロセスが実行されると、共有変数のデータ不整合が発生する可能性があります。
したがって、これをクリティカルセクション問題と呼ぶ。
したがって、クリティカルセクション問題を回避するためには、プロセスを同期させる必要がある。
プロセスの同期をとるためのソフトウェア的な解決策として、ミューテックスとセマフォがあります。
Mutexとは
Mutex または相互排他オブジェクトは、ロック機構の一つです。
プロセスは、クリティカルセクションに入る前にロックを取得する必要があります。
クリティカルセクションで実行された後、プロセスはロックを解放します。
同様に、一度に1つのプロセスだけがクリティカルセクションで実行されます。
複数のプロセスが存在する場合、一度に1つのプロセスだけがクリティカルセクションで実行され、同時に実行されることはない。
以下のコードを参照してください。
do{を行う。
ロック取得
クリティカルセクション
ロック解除
残部
} while (true)
プログラムの実行開始時に、システムにミューテックスの生成を要求します。
プロセスは、クリティカルセクションで実行したいときに、そのロックを占有します。
この操作をacquire()という。
クリティカルセクションの実行が完了すると、プロセスはロックを解放する。
この操作をrelease()という。
すると、他のプロセスがそのロックを取得できるようになる。
あるプロセスがロックを持っている場合、他のプロセスはクリティカルセクションを実行することができない。
したがって、これらのプロセスは、ミューテックスのロックが解除されるまで待ち行列で待機しなければならない。
セマフォとは
セマフォは整数の変数(S)です。
wait()とsignal()という2つの原子操作は、セマフォの値を変更するのに役立つ。
特定のプロセスがセマフォの値を変更した場合、他のプロセスは同時にセマフォの値を変更することができません。
waitとsignalのコードは以下の通りです。
wait(S){
while(s<=0);
s-;
}
signal(S){(シグナル
s++;
}
また、セマフォにはバイナリセマフォとカウントセマフォの2種類があります。
バイナリセマフォは、整数値が0から1の間で変化し、クリティカルセクションにアクセスしたいプロセスがwait()操作を行うと、セマフォの値が1から0に減少する。
そして、セマフォの値を1から0に減少させ、クリティカルセクションから出るときは、セマフォに対してsignal()操作を行う。
したがって、値を1まで増加させることになる。
カウントセマフォでは、値は無制限な領域で変化することができる。
あるプロセスがクリティカルセクションで実行する必要がある場合は、()操作を行い、セマフォの値を1つ減らします。
クリティカルセクションから出る場合は、signal()操作を行い、セマフォの値を1つ増やします。
いずれの場合も、セマフォ値0はすべての資源が使用中であることを示す。
あるプロセスがセマフォの取得を要求し、セマフォの値が0である場合、そのプロセスはセマフォの値が0より大きくなるまでwait()を実行する。
MutexとSemaphoreの違い
定義
ミューテックスとは、複数のプロセスが順番に同じ資源を共有できるようにするプログラムオブジェクトのことです。
これに対してセマフォは、マルチタスクOSなどの並行システムにおいて、複数の プロセスが共通の資源にアクセスすることを制御するための変数です。
このように、mutexとセマフォの根本的な違いはここにあります。
メカニズム
重要なことは、ミューテックスとセマフォの大きな違いは、ミューテックスがロック機構であるのに対し、セマフォは信号伝達機構であることです。
タイプ
なお、mutexはオブジェクトであるのに対し、semaphoreは整数型の変数です。
カテゴリー分け
また、mutexには分類がありませんが、セマフォはバイナリセマフォとカウントセマフォに分類されます。
発売
さらに、ミューテックスがロックされている場合、ロックを要求したプロ セスはシステムがロックを解放するまで待機する。
一方、セマフォの値が0である場合、プロセスはセマフォが0より大きくなるまでwait()操作を行う。
オペレーション
また、プロセスはacquire()とrelease()を使ってミューテックスにアクセスしたり解放したりしますが、セマフォの変更にはwait()とsignal()を使います。
これが、ミューテックスとセマフォのもう一つの違いです。
結論
簡単に説明すると、mutexとセマフォは、複数のプロセスの機能を同期させるための2つの機構です。
mutexとセマフォの主な違いは、mutexがロック機構であるのに対し、セマフォは信号伝達機構であることです。
したがって、セマフォはミューテックスよりも高機能です。