0

現在、FCFS とラウンド ロビン アルゴリズムの両方を使用したプロセス スケジューラのシミュレーションに着手しています。

まず、入力の解析をできるだけ簡単にしたいと思います...

特定の情報を保持するための構造がいくつかあります。プログラムは次のように動作します。

my_project FCFS in.file
OR
my_project RR 2 in.file

in.file は次のようになります。

./Job1.txt
./Job2.txt
./Job3.txt
./Job4.txt

そこで、この入力ファイルを処理してジョブを注文したいと思います。

テキストファイルは次のようになります。

10
1fi
if i < 3 i=i+1 goto 8
3sdkfj
4ksdkk
5kdkfk
6kdkjf
7dkjkfd
if k < 2 k=k+1 goto 2
9dkkf
10dku
if j < 2 j=j+1 goto 2

最初の行 (このジョブの開始時刻を示します) と if で始まる行を除いて、すべての行は意味がありません。つまり、i < 3 i = i+1 goto 4 の場合、i が 3 未満である限り、4 行目にジャンプすることを意味します。

したがって、基本的には、上記のようにコマンドラインから入力ファイルを解析し、開始時間 (最初の行) でジョブを並べ替えたいと考えています。私は本当にこのステップをできるだけ効率的にやりたいと思っています。これまでのところ、以下のコードを書きました。

/* I/O Files */ 
static char *inputFile;
static FILE *input;

/*Scheduled jobs indexed by PID*/
struct job list[20];

/* the next job to schedule */
static struct job *job_next = NULL;

/* Time */
time clock;

/*Initialises job list* /
static void initialise_list(void) {
     for(int i = 0; i < sizeof(job_list); i++) {
        job_list[i].params.pid = -1;
    }
}

/** 入力ファイルから入力を読み取って解析する */ static void parse_input(void) {

char buffer[BUFSIZ];
unsigned int jobs;

struct job *current;

jobs = 0;

initialise_list();

/** Read input file **/
while( fgets(buffer, sizeof(buffer), input)) {
    time start, finish;
    pid job;        

    //if(buffer[0] == '#') {
    //  continue;
    //}

    sscanf(buffer, "Job%d%ld", &job, &start);

        if(start < 0) {
            fprintf(stderr, "Job start time must be greater than or equal to 0,     found %ld.\n", start);
            exit(EXIT_FAILURE);
        }

        if(finish <= 0) {
            fprintf(stderr, "Job finish time must be greater than 0, found %ld.      \n", arrival);
            exit(EXIT_FAILURE);
        }

        current = &list[job];

        current->parameters.pid = job;
        current->parameters.start = start;


        jobs++;


}    


 int main(int argc, char **argv) {

    /* Open input and output files */
    for(int i = 0; i < argc; i++) {
        if(strcmp(argv[i], "in.file") {
            inputFile = argv[i];    
            input = fopen(inputFile,"r");
        }
    }
    if(!inputFile) {
        exit(EXIT_FAILURE);
    }
    parse_input();
    fclose;
    return EXIT_SUCCESS;
}

これまでに使用した構造体。

/**
 * Simulation of a process scheduler
*/

#ifndef SCHEDULER_H_
#define SCHEDULER_H_

#include <stddef.h>


/* types */
/** units of time */
typedef long time;
/** process identifier */
typedef int pid;

/** Information about a job of interest to the task scheduler */
struct job_data {

/* pid of this process */
    pid pid;
    /* time process starts */
    time start;
    /* time needed to finish */
    time finish;
    /* time spent processing so far */
    time scheduled;
    /* size of the process */
    size_t size;

};

struct job {

    /* Various parameters used by the scheduler */
    struct job_data parameters;
    /* next job to be scheduled */
    struct job *next;


};

最後に、ジョブを開始時間順に並べて、特定のアルゴリズムでスケジュールできるようにしたいと考えています。

そのため、入力ファイルを in.file に渡す方法について助けが必要です。ジョブを読み取り、開始時刻と順序を取得してから、「ティック」時刻、つまりテキスト ファイルの最初の行を開始します。

どんな助けでも素晴らしいでしょう!!

4

1 に答える 1

0

あなたの質問が何であるかわかりません(何も尋ねずに何をしているのかの説明を投稿したようです)。このため、私の答えは答えにならないので、「うまくいけば役立つ」方法でとりとめのない話をします。

実際のシステムでは。さまざまなタスクがさまざまなタイミングで実行を開始し、さまざまなタイミングでブロックしてさまざまなことを待機し (そして、待機していることが発生するとブロックが解除されます)、最終的に終了/終了します。

これに加えて、いくつかの高度な機能があります。たとえば、明示的なタスクの優先度制御 ("nice()" など)、タスクのグループ化、CPU 時間の割り当てなどです。これらのことについて心配する必要があるかどうかはわかりません。

これを実現するために、BASIC の最小限のサブセット (変数、ループなどを含む) を実装する必要はありません。実装しようとしても、無意味な複雑さが増すだけです。各ファイルは単純な線形リストにすることができます。例えば:

123         ;Starting time
r22         ;Task runs for 22 ticks
s23         ;Task blocks due to "sleep()" for 23 seconds
r4          ;Task runs for 4 ticks
f4          ;Task blocks waiting for "4 units" of file IO (how quickly it unblocks depends on file system load)
r32         ;Task runs for 32 ticks
n8          ;Task blocks until it receives 8 packets from network
r22         ;Task runs for 22 ticks
            ;Task terminates

必要に応じて、これにコマンドを追加できます。たとえば、「r」コマンドから始めて、「スリープのためにブロックされました」などを追加します。最終的には、「タスクが新しいタスクを生成する」、「タスクが子の終了を待機する」、「タスクが終了するのを待つ」などを追加できます。別のタスクのブロックを解除する何かを(パイプ、ソケットなどを介して)送信します」など

(私の例では) すべてのコマンドが「オペコード、即時」形式であることに気付くでしょう。これは意図的なものです。これにより、解析が簡単になります (文字を取得し、整数を取得し、それらの両方を配列または連結リストに追加します)。

于 2012-10-06T10:18:48.207 に答える