2

私は、コマンドを処理し、1つのスプーラを介して印刷される文字列をキューに入れる複数のプロセッサをシミュレートするプロジェクトに取り組んでいます。

最大10個のプロセッサがあり、それぞれが「compute」および「print」ステートメントを持つ一連のジョブを実行します。Computeは、他の作業をシミュレートするのに時間がかかる数学的なプロセスですが、printは、印刷するスプーラーに短い文字列を転送します。1つのスプーラがあり、1つのプリンタがスプーラに接続されています。各プロセッサは終了前に多数のジョブを処理し、特定のプロセッサ上の特定のジョブからのすべての印刷ステートメントは一緒に印刷する必要があり(個々のジョブからの印刷のインターリーブはありません)、コンピューティング中のプロセスでスプーラがブロックされないようにする必要があります。

私は一般的に、セマフォとミューテックス構造を使用してこれをコーディングする方法を理解していますが、仕様のステートメントは私を混乱させました:

システムの同時実行性を最大化するようにしてください。(プロセッサIDでインデックス付けされたセマフォの配列の使用を検討することもできます。)

個々のプロセスごとにセマフォを使用することに欠けている特定の利点はありますか?

さらに説明が必要な場合は、お知らせください。問題を簡潔に説明しようとしました。

編集:もう1つの重要な部分:各プロセッサには、スプーラに送信するために最大10個の文字列を保持できるバッファがあります。各プロセスのsempahoresは、バッファーがいっぱいになったときに待機するためのものでしょうか?

編集2:ジョブには、複数の計算ステートメントと印刷ステートメントを混在させることができます。
ジョブ1
計算4
印刷フー
計算2
印刷バー
終了ジョブ

ジョブ内の印刷ステートメントはすべて順番に印刷する必要があります(FooとBarは、間に別のジョブ/プロセッサからの印刷を行わずに順番に印刷する必要があります)。

4

1 に答える 1

2

重要な情報はここにあります:

(個々のジョブからの印刷のインターリーブなし)、

これは、new Semaphore(1)(Javaを使用している場合)を意味します。

また、コンピューティング中のプロセスでスプーラがブロックされないようにする必要があります。

1つのパーティを受け入れるセマフォがある場合、この最後のピースは満足されません。実行中のプロセッサは、別のプロセッサが完了するのを待つ必要はありません。並行して実行できます。

これを行うには、セマフォのストライプセットを作成します。各スレッド/プロセッサがインターリーブせずに、他のプロセッサが完了するのを待たずに実行されるように、プロセッサIDでインデックスを付けます。

Semaphore[] semaphores = new Semaphore[Number_of_proessors];
//initialize all semaphore indexes

semaphores[Process.id].acquire();

//work    

semaphores[Process.id].release();
于 2012-04-10T18:48:50.727 に答える