オペレーティングシステム:生産 - 消費者問題

オペレーティングシステム:生産 - 消費者問題

1つのプロデューサと単一コンシューマ

     キャッシュの結合問題、二つのプロセス:生産者と消費者、固定サイズのバッファ。

     仕事の生産者は等々キャッシュにデータの一部を作成し、することです。

     消費者は、(キャッシュから削除された)データの消費者の作品です

     コアの問題:キャッシュ内の生産者が、時間はまだキャッシュにデータを書き込むのを防ぐまたはフルすることを確保するためには、

                            消費者は、空のキャッシュからデータを取得してみましょう。

 

その必要性の注意の問題のいくつか:

  • バッファが空になるには、消費者はもはや消費しないことができます
  • バッファがいっぱいになると、生産者はもはや生成できません
  • スレッドでの生産や消費が、スレッドの残りの部分は、もはや、スレッド間の同期を維持するために、動作している他の生産や消費、になることはできません場合には
  • なお、条件変数シーケンスミューテックス

 

擬似コードの実装

プロデューサーは、バッファサイズが10であると仮定すると、消費者スレッド番号。

 互いに同等の生産者と消費者は、限りプールがいっぱいではないように、メッセージは、プロデューサ・バッファ・プールに送ることができます。

 限り、プールが空でないと、消費者は、バッファプールからのメッセージを奪うことができます。

 リソース・アイテムの数が使用されてきた代表的な緩衝液、利用可能なバッファ資源の数の代表的なスペース
 の代わりにミューテックスミューテックス
 [10]代表的なバッファBUF、コンテンツタイプのアイテム
 に、OUTは最初と最後のリソース・リソースを表します

 

var items = 0, space = 10, mutex = 1;
var in = 0, out = 0;
item buf[10] = { NULL };

producer {
    while( true ) {
        wait( space );  // 等待缓冲区有空闲位置, 在使用PV操作时,条件变量需要在互斥锁之前
        wait( mutex );  // 保证在product时不会有其他线程访问缓冲区

        // product
        buf.push( item, in );  // 将新资源放到buf[in]位置 
        in = ( in + 1 ) % 10;
        
        signal( mutex );  // 唤醒的顺序可以不同
        signal( items );  // 通知consumer缓冲区有资源可以取走
    }
}

consumer {
    while( true ) {
        wait( items );  // 等待缓冲区有资源可以使用
        wait( mutex );  // 保证在consume时不会有其他线程访问缓冲区

        // consume
        buf.pop( out );  // 将buf[out]位置的的资源取走
        out = ( out + 1 ) % 10;

        signal( mutex );  // 唤醒的顺序可以不同
        signal( space );  // 通知缓冲区有空闲位置
    }
}

 

公開された736元の記事 ウォンの賞賛123 ・は 80000 +を見て

おすすめ

転載: blog.csdn.net/S_999999/article/details/103648889