オペレーティングシステム:生産 - 消費者問題
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 ); // 通知缓冲区有空闲位置
}
}