2012-02-28 10 views
0

Linux環境でANSI CのCPUスケジューリングをプログラミングしている間、待ち行列に入れられた各プロセスの待ち時間は計算できませんでした。基本的には、私は4つのCPUで20以上のプロセスを実行し、各プロセスに要する時間、平均時間、CPU消費などを測定する必要があります。ANSI Cの最初のサービスの待ち時間の計算

ここで私がコードしようとしているプロセスの類推です:

Click me for the image

私が描いた画像が ...私の問題を単純化しようとしていたが、これはCPUのschedualerを果たす最初に最初に来ている、 カウンタAは、CPUバースト、カウンタBは、デバイスのバーストであります 回線1はレディキュー、回線2はデバイスキュー...

これまではタスクを配列に出力することができましたが、私の割り当てのために、各人が待つ時間、各プロセスのターンアラウンドタイム、平均時間を調べる必要があります。

各人構造体には「arrivalTime」があり、いつでも変更することができます 各人物の構造体には、それぞれのカウンタtimeRequired []で必要な時間の配列もあります。交互に表示され、インデックス0はカウンタA、インデックス1はカウンタBの場合、インデックス2はAに対するものです。 人それぞれの構造体が、要する時間[]、「arrayPointer」

のための配列ポインタを持っている私が描いた絵は、秒を言うが、それは実際に私は本当に、実際に必要としない、任意の時間単位、整数、 です時間クロック...

これまで私が行ったのは2つのスレッド機能をcounterAに1つとcounterBに1つ、 を作成し、 Bが人を終えたとき、それはAラインに詰め込まれます。私はすべてのもののように感じる

はすでに私のためにそこにあるが、私は本当に私が計算され、その待ち時間ににここから何をする必要があるかを知らない...

またはスレッドを使用するよりも簡単に解決策はありますか?

教授は私たちに2つのファイル

ヘルパーメソッド

[http://pastebin.com/qF7nQsUR]

ヘッダファイルを与えた

[http://pastebin.com/nQQNXnmq]

+0

だからどんなネクタイで何を記述することができ、これらの配列 - あなたは答えを受け入れたのですか? –

+0

残念ながら、以下の答えのどれも、私はいくつかのクラスメートに尋ね、彼らはループ処理を行い、待ち時間を得るためにi + 1を数えると言った。 – Hiko

答えて

0

私はこのようにアプローチします:

入力をエンコードする方法を解説します。プログラムは何らかの形でそれに利用可能な入力 "person 1 needs ..."を持つ必要があります。
これらの定義は、作業することができます:

struct need { 
    int person_id, counter_id, duration 
}; 
struct need needs[] = { 
    { 1, COUNTER_A, 500 }, 
    { 1, COUNTER_B, 200 }, 
... 
}; 

次に、あなたは一人一人が、いつでもここを追跡する必要があります。
この構造は、人のが今やって何を記述することができます。

struct person_activity { 
    int person_id; 
    struct need *activity; 
    int start_time; 
} 

それぞれが

+0

Ugoren、ご返信いただきありがとうございます!実際、あなたのコードで言及されている「ニーズ」は、プロセスの入力に依存しているため、供給されているデータによって異なります。私がしようとしていることは、29プロセスのそれぞれがFCFSの順序で待ち行列に入っていると考えられる4CPUプロセスと29キュープロセスでCPUスケーリングプロセスでプロセスが終了するまでの時間を測定することです。 – Hiko

0

にgettimeofday(2)。

どこかのプロセス内部

struct timeval bornon; /* time this process was born */ 

をストラクト、その後

if (gettimeofday(&process->bornon, NULL) == -1) 
    err(1, "ohnoes! gettimeofday!"); 

あなたの割り当てパスで、それにはgettimeofday呼び出してから、あなたのプロセスが

struct timeval doneon; 
int secs, usecs; 

gettimeofday(&doneon, NULL); 
secs = doneon.tv_secs - process->bornon.tv_secs; 
usecs = doneon.tv_usecs - process->bornon.tv_usecs; 
を行った場合、再びそれを呼び出します

し、秒/マイクロ秒の変換を行います。

+0

私は彼が実際の時計に興味があるとは思わない。彼はシミュレーションを行っているので、500秒待ってもプログラムが500秒間実行されるわけではありません。 – ugoren

+0

最終的に死亡時刻から差し引かれた「時計」の種類にかかわらず、基本原則が適用されます。そして、ボーナスとして、誰もがgettimeofdayが何であるかを知るようになります; – tbert

+0

'gettimeofday'の使い方は主に説明しますが、ここで必要な時間ではありません。 – ugoren

関連する問題