2012-01-10 8 views
7

今期私はOSコースのTAです。だから私は、限られたCプログラミングスキルを持つCS学部向けマルチスレッドプログラミングの課題を設計するように頼まれました。マルチスレッドプログラミングの課題の設計

これは、最終グレードの5%しかかからないため、大きな課題ではありません。そして、これは何か新しいものでなければならないので、生徒はインターネットからコードをダウンロードするだけではいけません。

ここで私が考えているのは、単純なMessage Queueサーバです。

私たちは、学生に一つだけ のスレッドを持っており、唯一の2のクライアント接続、リーダライタを受け入れ、非常にダミーMQのサーバを提供します。ライターは定期的にキュー(すなわちサーバー)にメッセージを送信し、 リーダーはキューからメッセージを読み取ります。つまり、サーバーは メッセージをリーダーに送信します。また、読者には を提供します。

次に、複数の読者とライターを同時に受け入れるようにサーバーを変更するように学生に依頼します。 また、スレッド の安全性を尋ねます。言い換えれば、メッセージは1つのリーダーにしか送信されず、 キュー内でメッセージが失われず、mutexを使用する必要があります。

私はそれが単純すぎるかもしれないと感じますが、私はこの時点で他のことは考えられませんでした。あなたが私の立場にいるなら、あなたはどの任務を与えるでしょうか?

+0

私はあまりにもずっと前にOSクラスを取った。彼らはスタンフォード・ピントスOSクラスのカリキュラムをモデル化しました。これはおそらく、あなたが計画しているものから大きく変化しているかもしれませんが、おそらく来年にはそれを考慮する必要があります。 http://www.stanford.edu/class/cs140/projects/pintos/pintos_2.html 編集:ところで、これはCSのメジャー全員で私のお気に入りのクラスでした。根底にあるOSアーキテクチャを理解したような気がした。 –

答えて

0

Unixを使用していますか?それは重要ではないが、Windowsでもこれを使うことができる。

名前付きパイプを作成するだけです。

次に、4つのスレッドを作成します。

1制御スレッド、1コンシューマ(リーダー)スレッド、および2プロデューサ(ライタ)スレッド。

プロデューサは単にパイプに文字列を送信し、消費者はその文字列を大文字にして何かを印刷して出力します。

制御スレッドは、他の3つのスレッドを開始および停止するために使用されます。 startProducer1、startProducer2、startConsumer、stopコマンド、およびシャットダウンコマンドという単純なコマンドが必要です。

これは、すべてのスレッドが自分で動作していることを示していますが、同時にマスターによって制御されています(シャットダウン時など)。

これをラップすることができる場合のボーナスポイントは、単純なGUI、または単純なNcursesビデオディスプレイでも、コントロールディスプレイには常にコマンドを受け入れて結果を表示するための可視性があります。

1人のプロデューサを開始してもコンシューマがいない場合は、スレッドがどのようにブロックされるかを表示できます。両方の生産者と同じ、または消費者が生産者なしでブロックする方法。

パイプを使用するということは、その外部プログラム(およびその設定、デバッグ、サポートのすべての詳細)に頼る必要がないことを意味します。

UNIXとWindowsの両方に名前付きパイプがあります(ただし、システムコールは違うと思いますが、POSIXの移植性はここではうまくいくかもしれません...)。

0

接続プールマネージャは、接続プールを作成し、接続オブジェクトを確実に使用して再利用できるプリミティブな段階に置くことができます。

第2に、複数のGETのみのリクエストを実行できる(他のリクエストは複雑すぎるため)、各リクエストに対応するすべてのレスポンスを検証できる必要があります(また、要求)。

第3に最も単純なのは、異なる要求を受け入れ、それを新しいサーバースレッドに割り当てることができる単純なサーバーソケットです。要求を完了して応答を返します。私はオフに考えることができるもののthats

..

0

などDining Philosphersような古典的な問題の利点は、デッドロックや飢餓は実装の詳細に深く得ることなく発揮しやすいです。

オリジナルが本当に必要な場合は、並行処理の落とし穴を見やすいプロジェクトを選択してみてください。このようにして、生徒はそれらにぶつかり、割当てからより多くを得ることができます。それ以外の場合は、古典的な問題の1つを再定義して、既存のインターネットソリューションとは十分に違いますが、それでも本質的に同じです。

0

私は、生徒にロボットアームなどのクリティカルセクションにアクセスするためのスレッドステートマシンを提供するように頼まれることになります。

ロボットアームのスレッドには、「MoveArm(double position)」や「StopArm()」などのパブリックメソッドが含まれています。これらのメソッドはすべて、ロボットアームのシグナルキューにシグナルを送ります。ロボットアームスレッドは待ち行列を監視し、一度に1つずつ信号を抜き取り、それに応じて動作し、次の状態遷移シーケンスのために待ち行列に入れられた他の要求を残す。これは理にかなっていますか?

これは、クリティカルセクションだけでなく、重要なアクションシーケンスへのアクセスをシリアル化する方法を示しています。

など。スレッド1(例えばUI)から呼び出さMoveArmは、ロボットアーム信号待ち行列に掲載されるだろう、とロボットアームのスレッドは独自のスレッドで信号を検出すると、readyStateのから次の状態を通って移動します:

  1. StartingToMoveArmState
  2. 我々は)
  3. readyStateの(一度完全に移動)。

スレッド2ロボットアームのスレッドながら処理している可能性がスレッドをなどをE-停止する必要がある場合(ここではStopArm信号(例えばため

  • MovingArmState聴くことができます1の腕の移動要求、StopArm()を呼び出す - これはMovingArmStateで処理されます。また、スレッド2は、アームが他の場所に移動するように要求することもできますが、ロボットアームスレッドはReadyStateに戻るまでそれを処理しません。私。 ReadyStateは移動する次の信号を待ち行列に入れません。

    したがってシグナルキューはスレッドセーフである必要があり、スレッド1または2がシグナルを追加するたびにロックされる必要があります。また、信号待ち行列は、ロボットアームスレッドをブロック解除するように設定する必要があるため、この信号を検査し、それに応じて(手動リセットイベントなどを使用して)動作させることができます。

    これは便利です。