1

C でプログラミングしているオペレーティング システム クラスの宿題で、疑似コードを書くのに問題があります。

N 個の要素、P 個のプロデューサー スレッド、および C 個のコンシューマー スレッドの制限付きバッファー キューを使用してプロデューサー/コンシューマー プログラムを実装します (N、P、および C は、プログラムのコマンド ライン引数であり、3 つの追加パラメーター X、Ptime、およびCtime については後述します)。
プロデューサ スレッドは、X 個の異なる数値をキューにエンキューする必要があります (エンキューへの各呼び出しの間に Ptime*100,000 サイクルのスピン待機)。各コンシューマー スレッド
は、キューから P*X/C アイテムをデキューする必要があります (デキューへの各呼び出しの間に Ctime*100,000 サイクルのスピン待機)。
メイン プログラムは、バウンド バッファー キューを作成/初期化し、タイムスタンプを出力し、C コンシューマー スレッドと P
プロデューサー スレッドを生成し、すべてのスレッドが終了するのを待ってから、別のタイムスタンプと実行時間を出力する必要があります。

私の主な困難は、変数の 100,000 倍をスピン待機するという私の教授の意味を理解することです。私を混乱させるセクションを太字にしました。

各スレッドの違いを出力するためにタイムスタンプが使用されることを理解しています。現在、セマフォを使用して同期を実装しています。上記のクエリに関する提案は大歓迎です。

4

3 に答える 3

3

私はそれがビジー・ウェイティングを意味していると推測しています。ループの状態を繰り返しチェックし、タイトなループで不要な CPU パワーを消費します。

while (current_time() <= wake_up_time);

理想的には、スレッドがスケジューラによって外部で起動されるまでスレッドを一時停止するものを使用します (CPU などのリソースを他の場所に転用できるようにするため)。

sleep(2 * 60 * 1000 ms);

または、少なくとも一部のCPU を放棄します (つまり、それほどきつくしないでください):

while (current_time() <= wake_up_time)
    sleep(100 ms);

しかし、スケジューラを手動で呼び出して、OS (またはスレッド ライブラリ) にコンテキスト スイッチを行う良い時期であることをほのめかしてほしくないのだと思います。

サイクルが何であるかはわかりません。アセンブリでは、それらは CPU サイクルである可能性がありますが、質問に C のタグが付けられていることを考えると、それらは単にループの反復であると確信しています。

for (int i=0; i<Ptime*100000; ++i); //spin-wait for Ptime*100,000 cycles

宿題を出した人に尋ねるのが常に最も安全ですが.

于 2012-11-06T04:54:36.023 に答える
2

ビジー待機またはスピンtrueは、キーボード入力が使用可能かどうか、またはロックが使用可能かどうかなど、条件が であるかどうかをプロセスが繰り返しチェックする手法です。

したがって、割り当ては、次の要素を生成する前にPtime*100000時間待機し、条件がtrueになった後に x 個の異なる要素をキューに入れるように指示します

同様に、各コンシューマ スレッドはキューからP*X/Cアイテムをデキューし、アイテムを消費するたびに ctime*100000 待機する必要があります

于 2012-11-06T04:51:49.550 に答える
1

私はあなたの教授が完全なパッツであると思います - 実際に存在する最悪の「忙しい待機」テクニックを求めています:

int n = pTime * 100000;
for ( int i=0; i<n; ++i) ; // waste some cycles.

私はまた、彼はまだ翼竜の大腿骨を杖として使っていて、とても素敵な (乾いた) 洞窟を持っていて、大きな禿げたパッチを持ったパートナーを持っているのではないかと疑っています.... O / Sの人はそのようになる傾向があります. 涼しげなヒゲが似合います。

彼の完全に現代的な学生が彼を誤解しているのも不思議ではありません。彼は、IN TUNE でうなる方法を (再) 学習する必要があります。

乾杯。キース。

于 2012-11-06T05:03:37.517 に答える