MutexとSemaphore


概要


同期プログラミング時に共有リソースを安全に管理するためには、反発技術が必要です.
MutexとSemaphoreはこのために設計された技術であり,それらは異なる方法で互いに反発している.だからMutexと細い麻布語の概念を整理しましょう
上記の内容を説明する前に,臨界領域の概念を理解する必要がある.

りんかいいき


共有変数領域とは、2つ以上のスレッドが同時にアクセスできない共有リソース(データ構造またはデバイス)にアクセスするコードの一部です.
臨界領域は指定された時間後に終了する.したがって、スレッド(タスクまたはプロセス)が臨界領域に入る場合は、指定した時間を待つ必要があります.共有リソースに対するスレッドの排他的な使用を保証するために、臨界領域に入るか終了すると、細い麻布語に類似した同期機構が使用される.

コードの領域


各プロセスは、自分の臨界領域に入るためにアクセス許可を申請する必要があります.このような要求を実現するコード部分をエントリ領域(entry section)と呼ぶ.
進入領域で待機し,進入許可が得られると臨界領域に入る.臨界領域の後には終了領域(exit section)があり、これはコード部分であり、臨界領域を離れたことを示す.なお、残りのコード部分を総称して残り部分(残り部分)と呼ぶ.
  • コード例
  • do {
    	wait(mutex);   //입장 구역
    	임계 구역
    	signal(mutex); //퇴장 구역
    	나머지 구역
    }

    りんかいいきもんだい


    臨界領域問題とは、臨界領域のコード領域として指定されていない場合に発生する可能性のある問題を指す.

    Mutex


    プロセスが所有する鍵に基づく反発技術であるスレッド.
    Mutexは、リソースへのアクセスを同期させるための反発技術です.これは、プログラムの起動時に一意の名前で生成されます.Mutexはロック機構であり,同じ時間にMutexを得て臨界領域に入ることができるスレッドは1つしかない.また,このスレッドだけが臨界領域を終了したときにMutexを解除することができる.

    画像ソース:https://open4tech.com/wp-content/uploads/2020/03/mutex_states-400x260.jpg

    細い麻布語(Semaphore)


    Signaling mechanism. 現在アクセス可能な共有リソースのスレッド数とプロセス数を表す値を設定することで反発を実現する方法
    細い麻布語は信号メカニズムであり,これはMutexとは異なる.細い麻布語の特徴は、ロックされていないスレッドも信号を送信してロックを解除することができ、wait関数を呼び出すスレッドだけが信号関数を呼び出すmustexとは異なる.
    同期を実現するために,細い麻布語はwaitとsignalの2つの原子操作を用いた.
    waitを呼び出すと、細い麻布のカウントを1行減らし、細い麻布のカウントが0以下の場合はrockを実行します.
    細い麻布のカウントが0以下の場合、同期を実行する場合、別のスレッドが信号関数を呼び出すと、細い麻布のカウントが1増加し、対応するスレッドがrockから来る可能性があります.
    細麻布語には大きく2種類ある:semaphores、二元semaphoreをカウントする.カウント細麻布は細麻布のカウントが正の整数の値を持ち、設定された値はThreadを許可し、以上のThreadがリソースに近づくとRockが実行されます.バイナリ細麻布語細麻布語のカウントは1で、Mutexのように使えます.△Mutexは決して細い麻布のように使ってはいけません.

    画像ソース:https://open4tech.com/wp-content/uploads/2020/03/counting_semaphore_states-1-600x297.jpg

    MutexとSemaphoreの違い


    Mutexはロック機構によってロックされたスレッドだけが臨界領域を離れたときにロックを解除することができる.しかし,細麻布語は信号機構であり,絡まないThreedも信号を用いて絡みを解除することができる.細い麻布のカウンターを1にすれば、Mutexのように使えます.
  • の分かりやすい例:レストラントイレ2