[OS] Spinlock, Semaphore, Mutex, Monitor


問題距離


Q1. 同期環境でプロセスとスレッドを同期する理由


👉 競合やデッドロックを避けるために、

Q2. 同期の方法


👉 spinlock、信号量、反発量、モニタ等

スピンロックって何?



👉 2つのスレッドが1つの臨界領域に近づくと,1つのスレッドだけが近づくと仮定した.
Thread 0が臨界領域を占有し、ロック状態にある場合、Thread 1はアクセスできず、無限に待たなければならない
しかしspinlockはbusy waitingという方法を用いており、Thread 1はThread 0が臨界領域を使い果たしたかどうかを検査し続けなければならない.
Busy waitingの欠点は、コード上でwhile文を使用して待つことであり、コンピュータリソースを大幅に浪費することです.

Semaphoreとは?



👉 spinlockの欠点を克服するために,細い麻布語はwait()とsignal()法を用いる.
Waitステータススレッドはキューに入って待機し、while文を繰り返し実行しないため、リソースを無駄にしません.
臨界領域を占めるスレッドは、タスクの終了時に信号()を介してロックを返し、キューに存在するスレッドを起動してスタンバイキューに移動します.
大きく分けてバイナリ信号量とカウント信号量の2種類があります

binary semaphore



👉 0と1の2つの値しか存在しません
したがって,1つの臨界領域には1つのスレッドしか占有できない.

counting semaphore



👉 任意の数の整数値が存在します
これらの整数値のスレッドは同時にアクセスできます
ここではspinlockとsemaphoreの違いについて説明します
spinlockはloop強制スレッドによって臨界領域が利用可能かどうかを絶えず検査する
逆に、信号量は、直接アクセスできないスレッドをスリープさせ、使用可能なときに起動させることができる.
これにより、信号量は資源の浪費を減らすことができる.
また、spinlockの実装は非常に簡単で、一目瞭然で、ロックが短い時間しかかからない場合は、使用したほうがいいです.
一方、信号量は、実現が困難であるが長時間の待ち時間が必要な場合に非常に有効である.
spinlock信号量とbinary信号量は1つのスレッドにしかアクセスできず、反発を提供するがcounting信号量は複数のスレッドにアクセスする機会を提供する

Mutexとは?


👉 最も簡単なソリューションの1つを同期して実行
Mutual Exclusionの略で、反発を可能にする
Mutexはロックです!運転中に鍵をかけて、使い終わったら開けます!

Mutexを使用する際の注意事項


  • 設計が間違っている場合、ロック権限を持つスレッドは常にプリエンプトされ、飢餓の問題を引き起こす可能性がありますので、注意してください.

  • ロックをたくさん使うとデッドロックが発生する可能性が高くなります
  • バイナリ信号量とmutexの違いを理解する
    バイナリ信号量はシグナリングメカニズムであり,反発量はロックメカニズムである

    Monitorとは?


    👉 スレッドが反発性とコラボレーション性を有することを可能にする同期メカニズム.
    反発ロックにより、特定のスレッドの臨界領域のみに一瞬でアクセスできます.
    コラボレーション-wait setでは、特定の条件に達するまでスレッドを待機し、他のスレッドへの通知を待機できます.

    なぜMonitorと呼ばれているのですか?


    スレッドがリソースにアクセスする方法を監視するため

    Javaはどのようにモニタを実現しますか?


    同期キーの使用


    synchronizedメソッド:簡単で使いやすい
    public synchronized void method() {
        // 이런식으로 사용됨
        }
    synchronized文:セキュリティの面でより良い
    public void method() {
        
        // 여러 스레드가 사용되어도 괜찮은 영역
        
        //여기부터는 임계 영역
        synchronized(공유 객체) {
            
        } // 임계 영역 끝
        
        // 다시 여러 스레드 사용 가능
        
        }

    entry setとwait setの使用

  • ディスプレイは、入口セット、waitセット、および臨界領域
  • に分ける.
  • 臨界領域は同期キーワード宣言の部分であり、スレッドがアクセスする領域
  • である.
  • wait setはスレッドが待機する場所
  • である.
  • entry setはスレッドが入る場所
  • である.
  • wait()、notify()メソッド
  • を使用

    さぎょうげんり

  • スレッドはentry set待機スケジューラ
  • に入る.
  • スケジューラはスレッドを臨界領域
  • に入れる.
  • の動作は完了する可能性があるが、集合
  • を待つ必要がある場合がある.
    さらに
  • の番になると、臨界領域に近づいて動作
  • を完了する.
    JVMのスケジューラは優先度ベースのスケジューラアルゴリズムを使用する
    同じ優先度がある場合は、FIFOスケジューリングを使用して解決します.

    リファレンス


    Baeldungブログ