2012-03-22 18 views
0

私はオペレーティングシステムを自習しています。 Tanenbaumの著書では、3つのセマフォー(どれがmutexであるか)がproducer-comsumerプロセスのペアをどのように調整しているかを説明しています。私はそれをつかむのに苦労している。どのように達成されているか説明してください。どんな助けもありがとう。ありがとう。ミューテックスとセマフォとのプロセス間同期

#define N 1 00 
    typedef int semaphore; 
    semaphore mutex = 1 ; 
    semaphore empty = N; 
    semaphore full = 0; 
    void producer(void) 
    { 

    int item; 
    while (TRUE) { 
    item = produce_item(); 
    down(&empty); 
    down(&mutex); 
    inserUtem(item); 
    up(&mutex); 
    up(&full); 
} 

    void consumer(void) 
    { 

    int item; 
    while (TRUE) { 
    down(&full); 
    down(&mutex); 
    item = remove_ item(); 
    up(&mutex); 
    up(&empty); 
    consume_item(item); 

} 

答えて

0

(ミューテックス)semahoreが、この1つの単位を取得することができます。1. 1つのスレッドだけに初期化され、他のすべてがブロックされています。任意のタイプの複数のスレッドがキュー&にアクセスするのを防ぐことで、一般的なキューの実装がスレッドセーフであることを保証することが唯一の目的です。

1つのセマフォ(full)はゼロに初期化され、キュー内の項目数がカウントされます。

セマフォ(空)は、キューの長さに初期化され、キュー内の空きスペースの数がカウントされます。

これは本当です。オブジェクトを押したままにするには、空き領域があることを確認するためにまず待ってから(ミューテックス)待ってからキューにアクセスし、オブジェクトを押します(空きスペースが常にあります - 待ち行列をチェックする必要はありません)、キューをロック解除するシグナル(mutex)、そして最後にシグナル(full)を返すことで、キューに入っているオブジェクトを表すユニットを待つか、 。

オブジェクトをポップアウトするには、オブジェクトがキューで使用可能であることを確認するために待機してから、キューにアクセスするためにミューテックスを待ってから、オブジェクトをポップオフします(はい、待ち行列に入っているオブジェクトである - キューの数を確認する必要はない)、キューのロックを解除する信号(ミューテックス)、最後にシグナル(空)を返すことで、キュー内の空き領域を表す単位。

これはComputer Science 101のものです。これは絶対に古典的なプロデューサ/コンシューマブロッキングキューです。

+0

あなたのOSが偽の起床をサポートしている場合は、whileループ全体を追加する必要があるかもしれません。幸運にも、OSの唯一の人気クラスは疑似ウェークアップをサポートしています:) –

+0

ありがとう! – yukon

+0

そのWindowsですか?また、もう1つの説明..完全に空の代わりに適切に処理された(つまり、条件付きの)ポインタをスタックできますか? – yukon

関連する問題