[CS][OS] Semaphore


Semaphore

  • 鍵を取得して返却するプロセスと同様である.
  • 整数変数s(信号量)、P演算、V演算
  • void wait(s){
    	while s<= 0;
        s--;
    }
    void signal(s){
    	s++;
    }
    1プロセスアクセスs値-バイナリ信号量
    n個のプロセスアクセスs値-カウント信号量
  • のジョブ順序(なぜ>P 1はP 2に入るためにsを返さなければならないのか)
  • を決定することができる.
  • s値が負の場合に待機するプロセス数=s値|
  • ビジーウエイトが存在する(s値が負または0の場合、while文で実行し続ける)=>CPUリソース浪費
  • .
  • ビジー待機解決->block and wakeup readyキュー待機.
    -Readyqueueに入り、スケジューリングアルゴリズムに従って選択し、臨界セグメントに入る.(コンテキスト切替オーバーヘッドがある)
  • したがって、キー領域が短い場合busywing<>が長い場合、block and wakeup
  • 信号量の問題
    - deadlock & starvation
  • Priority inversion
  • Deadlock & Starvation


    deadlock
    プロセスが互いの信号を待つと、すべてのプロセスは無限に待機します(2つのプロセスは、互いに所有するリソース+保持されたリソースが非線形である+ループが存在する+反発=>デッドロックを待つ)
    starvation
    block and wakeup方式で準備キューで待機しているプロセスを選択するスケジューリング中に、選択がなければ実行できないプロセスが生成されます(飢餓はLIFOだけでなく(スケールアルゴリズムではなくデータ構造です).スケジューリングアルゴリズムによるスケジューリングアルゴリズム(FIFOはFCFS構造であり、FIFO=Q(データ構造)はPriority(優先キュー)で用いられる).

    優先度バージョン(優先度逆転)(以前はヘテロ強調点)


    優先度が反転します.優先度の低いプロセスでは、優先度の高いプロセスが失われることはありません(優先度が1、4のプロセスBが実行中にSemaphore 0を返してCSに入ると仮定します).優先度1のプロセスは緊急状態にしようとしますが、while文busywaitingの場合、Bが現れるまでAは入れませんが、中間で優先度2のプロセスに切り替えてもAはCSに入れません.)
    細い麻布語やMutexが不適切に使われるとエラーが発生します.ディスプレイはプログラムが提供する機能であり,Javaでは簡単な同期ツールとされている.
    次のレッスン...