現在、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 に渡す方法について助けが必要です。ジョブを読み取り、開始時刻と順序を取得してから、「ティック」時刻、つまりテキスト ファイルの最初の行を開始します。
どんな助けでも素晴らしいでしょう!!