[オペレーティングシステム]同期制御の古典的な問題


1.Bounded Buffer問題(生産者消費者問題)


複数のメーカーおよび消費者は、限られた数のデータを保存するBufferにアクセスします.ベンダーの場合、データが作成されるとBufferに格納され、格納可能なBufferスペースがないという問題が発生する可能性があります.
消費者がデータを必要とするときにBufferからデータを取得する場合、Bufferにインポートするデータがないという問題が発生する可能性があります.
解決策は,生産者−消費者が連携し,細い麻布言語を用いてバッファを同期させることである.
  • の場合、各変数は以下のようになります.
  • int n;
    semaphore empty = n; // 버퍼 내에 저장할 공간이 있는지 
    semaphore full = 0 // 버퍼 내에 소비 할 데이터가 있는지 
    semaphore mutex = 1 // 버퍼에 대한 접근을 통제하여 동기화를 충족시켜주는 세마포어 
  • 生産者プロセス
  • while(true){
        // Data 생산 
       wait(empty); // 버퍼에 빈 공간이 생길 때 까지 기다린다.
       wait(mutex); // 임계 영역에 진입 하기 전까지 기다린다.
       
       // 데이터를 버퍼에 추가 
       signal(mutex); // 임계 영역을 빠져나왔다고 알려준다.
       signal(full); // 버퍼에 데이터가 있다고 알려준다. 
    }
  • 消費者プロセス
  • while(true){
        wait(full); // 버퍼에 데이터가 들어올 때 까지 기다린다. 
        wait(mutex); // 임계 영역에 진입 하기 전까지 기다린다. 
        
        // 버퍼로부터 데이터를 가져온다. 
        signal(mutex);
        signal(empty); // 버퍼에 빈 공간이 생겼다고 알려준다. 
    }

    2.リーダ-ライタの問題


    これは、複数の読者と作成者が1つのストレージスペースを共有してアクセスする場合に発生する問題です.
  • 読者:Bufferからデータを読み込みます.複数の読者が同時にデータを読み取ることができる
  • 作成者:
  • :Bufferにデータを書き込みます.1人の作成者がBufferにデータを書き込む場合、彼だけがアクセスできる(読者と他の作成者はアクセスできない)
  • この場合、読者と著者の間に飢餓問題が発生する可能性があります.(読者数が圧倒的に多く、作者は待ち続けるかもしれないが、逆に)
    解決策は細い麻布語を使うことです.
  • の場合、各変数は以下のようになります.
  • int readcount = 0  //현재 Buffer에 접근 중인 독자의 수 
        // 독자 수가 0 일 경우 저자가 임계 영역에 접근 가능 
    semaphore rw_mutex = 1 //저자와 독자 사이 동기화 
    semaphore mutex = 1  // 상호 배제를 보장하기 위해 사용 
  • 著者プロセス
  • while(true){
        wait(rw_mutex); // 임계 영역에 들어가기 위해 기다리는 중
    	// 쓰기 작업 수행
    	signal(rw_mutex); // 임계 영역에서 빠져나옴 
    }
  • 独立プロセス
  • while(true){
        wait(mutex);
        readcount++; // 독자수 1 증가
        if(readcount = 1 ) 
            wait(wrt) // 쓰고 있는 저자가 없을 때 까지 기다리기
        signal(mutex);
    
        // 읽기 작업 수행
    
        wait(mutex);
        readcount--; // 독자수 1 감소
        if(readcount = 0) 
            signal(rw_mutex); // 독자가 없다면 알려줘서 기다리고 있는 독자/저자를 끼운다.
        signal(mutex);
    }

    3.哲学者たちの夕食問題



    哲学者たちはお互いに話をすることができず、両側のフォークを持ってこそご飯を食べることができる.

    細い麻布言語で反発要求を満たす


    各フォークには細い麻布語が掛けられており、互いに細い麻布語を排斥している.哲学者はフォークを持ち上げる時、waitの演算を行い、フォークを置く時、signalの演算を行う.
    while(true){
        // 포크 양쪽 가져오기
        wait(포크[i]);
        wait(포크[(i+1)%5]);
        
        // 냠냠 먹는다.
        
        // 포크 양쪽 놓기 
        signal(포크[i]);
        signal(포크[(i+1)%5]);
        
        // 철학적인 생각한다..
    }
    このように表現すると,互いに反発することは強いが,교착상태기아현상が生じる.

    行き詰まり


    このとき、すべての哲学者が右に置いたフォークを手に取り、左のフォークが消えてしまうと、すべての哲学者が相手がフォークを置くのを無限に待つ問題が発生します.

    解決策

  • のテーブルに席を空けます.
  • 両方のフォークが使用可能な場合にのみ、フォークをつかむことができます.
  • 奇数の哲学者は左フォーククリップ->右フォーククリップ/偶数の哲学者は右フォーククリップ-左フォーククリップ高さ
  • 飢餓問題.


    両手のフォークを握って食事をする哲学者は少数しかいない.

    モニタソリューション


    哲学者たちの状態をthinkinghungryeatingに分けた.
  • 哲学者は自分の状態を飢餓->食事に変えることができ、この時双方の哲学者はeating状態ではない時だけ変えることができる.
  • それでも飢餓は起こり得る.

    コメント/画像ソース

  • ウィキペディア-読者の質問
  • ウィキペディア-食事をする哲学者たちの問題
  • 基礎のオペレーティングシステムの恐竜の本の講座