0

私は現在の割り当てに固執しています。これは主に、しばらく使用しなかった後、Cにあまり熟練していないためです。

FCFS(First Come First Serve)スケジューリングアルゴリズムシミュレーターを作成する必要があります。このシミュレーターは、各プロセスで発生するすべてのタイムイベントを単純に通過し、プロセスと所要時間を完了したときに出力します。

プロセスがどのように機能するかはわかりますが、CまたはC ++プログラムに実装すると困惑し、どこから始めればよいのかさえわかりません。

stdinから入力を取得し、次の形式になります。

最初の行:(CPUの数)(プロセスの数)(クォンタムサイズ)

プロセスライン:(ID)(優先度)(送信時間)(必要なCPU時間)(I / Oが必要になるまでの計算時間)(各計算のI / O時間)

最初の行から定義されたプロセスの数に基づいて、さらに多くのプロセス行が必要です。

入力例は次のとおりです。

1 1 10

1 1 0 20 5 50

簡単に言えば、複数のCPUの可能性を含むソースを支援またはサンプリングするためのリソースを誰かに教えてもらえますか。または、皆さんが私が始めるのを手伝ってくれるなら、私は本当にそれを感謝します。私はあなたにすべてを作るように求めているのではなく、私がそこからどこに行くべきかを知るために私が始めるのを手伝ってください。

ありがとう!

編集:

これが私がこれまでに得たものです。それは非常に初歩的ですが、今のところ私はこれを成し遂げようとしているだけで、私が言ったように、私はCに非常に錆びています(とにかくそれに熟練していたわけではありません):

int main()
{
    //process *  proc = (process *)malloc(100*sizeof(process));
    process proc[25];
    CPU cp[4];
    int count = 0;
    //int * input = malloc(sizeof(int) * 100);
    int input = 0;
    int cpus = 0;
    int processes = 0;
    int quantum = 0;
    int processLoop = 0;
    int x = 0;

    int id = 0;
    int pri = 0;
    int sub = 0;
    int cptime = 0;
    int compute = 0;
    int itime = 0;
    int complete = 0;


    while(1 == scanf("%d", &input))
    {
            if(count < 0)
                    break;
            if(count == 0)
            {
                    cpus = input;
            }
            else if(count == 1)
            {
                    processes = input;
            }
            else if(count == 2)
            {
                    quantum = input;
            }
            else
            {
                    if(count == 3)
                    {
                            proc[processLoop].ID = input;
                    }
                    else if(count == 4)
                    {
                            proc[processLoop].Priority = input;
                    }
                    else if(count == 5)
                    {
                            proc[processLoop].subTime = input;
                    }
                    else if(count == 6)
                    {
                            proc[processLoop].cpuTime = input;
                    }
                    else if(count == 7)
                    {
                            proc[processLoop].computeTime = input;
                    }
                    else if(count == 8)
                    {
                            proc[processLoop].ioTime = input;
                            proc[processLoop].isCompleted = 0;
                            processLoop++;
                            if(processLoop == processes)
                            {
                                    count = -1;         //Leaves possibility for multiple simulations in one run
                            }
                            else
                            {
                                    count = 2;          //Repeats if multiple processes are detected
                            }
                    }
            }
            count++;

    }

    for(x = 0; x < cpus; x++)
    {
            cpu[x].idle = 0;
    }

    return 0;
}

ええ、非常に原始的で効率的ではありませんが、すべての数値を読み取り、EOFで終了するか、数字以外のものが来ると終了します。また、負の数。私がprocを25の配列にした理由は、それが私たちのインストラクターが数も増えると言った限界だからです。また、CPUの場合、最大4つが使用されると彼は言ったので、主にポインターがひどいので、配列を作成しました。

配列にデータが入ったので、proc配列をsubTimeで並べ替えて、実際の計算を開始する必要があります。特に私のお粗末な設定では、この部分はどれほど悪くなるでしょうか?

4

2 に答える 2

3

目標を達成するためのアクション プラン:

  1. プロセスと CPU のデータ構造を定義する
  2. すべての入力をスキャンします。すべてのデータ構造を初期化します。
  3. シングル CPU 用のコードを開発します。正しく動作するかどうかを確認する
  4. マルチ CPU 用のコードを修正します。動作するかどうかを確認する

ステップ1:

Process のデータ構造を定義します。C の場合、次のように構造体を使用できます: (C++ の場合はクラスを使用)

typedef struct process
 {
       int ID;
       int Priority;
       int time_of_submission;
       int cpu_time_required;
       int compute_time_before_IO;
       int IO_time_per_compute;
       int isCompleted; // if 1 means its complete. at start, its value is 0
 }process;

CPU の場合は、アイドル状態のプロセスまたは割り当てられたプロセスの ID を示す配列を維持します。

typedef struct CPU
 {
       int idle;     // if set to 1, then its idle. 
                     // If set to 0, then its working on a process
       process *next; // points to the process that CPU is executing
                      // points to null if CPU is idle.
 }CPU;

ステップ2:

scanfを使用してすべての入力をスキャンしprocess、すべての入力プロセスに対して' ' の配列を設定します。作業を簡単にするために、processFCFS に従ってスケジューリングを決定するフィールドに基づいて ' ' の配列をソートします。(例: time_of_submission、必要な CPU 時間、優先度.. 他のフィールドについてはお任せします)

' ' の配列を初期化しCPUます。

ステップ 3: シングル CPU 用のコードを開発します。正しく動作するかどうかを確認します。

複数の CPU シナリオに問題があると思います。したがって、当面は複数の CPU の概念を考慮から外してください。シングル CPU のロジックを紙に書き留めます。擬似コードを作成します。それから C (または C++) コードを作成します。構文に行き詰まったときはいつでも、それを行う方法をググって先に進みます。

ステップ 4: 複数の CPU のコードを変更します。動作するかどうかを確認する

複数の CPU で何が起こるかを考えてみてください。

Loop over all CPUs. 
    For CPU[i], check its status 

    if its idle
         assign it a process..similar logic as for single CPU case (step 3)
    if its not idle
         if its corresponding process is finished, set status of CPU to idle.

ここでの作業が完了したら、これを変更して、プロセスの優先度を考慮することができます。

于 2012-04-12T05:06:09.213 に答える