共有メモリ型マルチプロセッサシステムにおいて、生産者プロセスが消費者プロセスに、共有するバッファを介してデータ(文字)を受け渡す有限バッファ問題について考える。生産者プロセスが生成したデータはバッファに格納され、それを消費者プロセスが取り出す。バッファは長さNの環状バッファで、バッファにデータを入れる位置を示すポインタin,バッファからデータを取り出す位置を示すポインタoutをもつ。以下のプログラムは、この有限バッファ問題を記述したものであるが、同期をとるためのコードが抜けているため、正しく動作しない、生産者プロセスは関数producer,消費者プロセスは関数comsumerをそれぞれ一回ずつ実行するものとする。 #define N 16 char buffer[N]; int count = 0; int in = 0; int out = 0; void producer() { char c; do{ while (count == N); 文字cを生成する; count = count + 1; buffer[in] = c; in = (in +1)%N; }while(1); } void consumer() { char c; do{ while(count == 0); c = buffer [out]; out = (out + 1) % N; count = count - 1; 文字cを処理する; }while(1) } 以下の問いに答えよ。 (1)このプログラムが正しく動作しない例を示せ。 (2)計数セマフォsはカウンタcounterと待ち行列queueをもつ構造体として定義される。計数セマフォに対するP命令(wait命令)は、例えば、以下のように定義することができる。 P(semaphore s){ if(s.counter >0)s.counter = s.counter -1; else 呼び出しプロセスをs.queueの最後尾に置く; } (a)このP命令のコードはそれ自身、相互排除しなければならない。その理由を述べよ。また、こうした相互排除の実現を支援するマシン命令の例を挙げ、その仕様を述べよ。 (b)このP命令に対応するV命令(signal命令)を定義せよ。 (3)(2)で定義したP命令とV命令を用いて、2つのプロセスが正しく動作するように、上記のプログラムを書き換えよ。上記のプログラムで、バッファ内の文字数カウンタは、変数countの代わりに、セマフォ内部のカウンタを使って実現せよ。 (4)生産者プロセスが複数存在する場合、生産者プロセス間で相互排除が必要となる。その場合でも正しく動作するよう(2)で定義したP命令とV命令を用いて、(3)のプログラムを書き換えよ。 参考書等で理論としては理解していたつもりだったのですが、具体的なプログラムの問題での出題で悪戦苦闘しております。 ご教示お願い致します。
↧