2012-10-06 59 views
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開頭的行外,所有行都沒有意義。即如果我< 3 i = i + 1轉到4意味着跳轉到line4,只要我是小於3.

所以基本上現在我想通過上面的命令行解析輸入文件,並命令作業按開始時間(第一行)。我非常希望儘可能有效地完成這一步驟。到目前爲止,我已經寫了下面的代碼:

/* 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; 
    } 
} 

/**讀取並輸入文件解析輸入*/ 靜態無效parse_input(無效){使用至今

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讀取作業,並獲得開始時間和順序,然後開始'打勾'的時間,即第一行文本文件。

任何幫助將是偉大的!

+0

我明白我的sscanf可能沒有任何意義...那在很大程度上我需要幫助... –

回答

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」命令開始,然後添加「由於睡眠而被阻塞」等。最後,您可以添加諸如「任務產生新任務」和「任務等待孩子退出」等任務,並且「任務(通過。管道,插座,無論什麼),阻止另一項任務「等。

你會注意到(在我的例子中)所有的命令都是」opcode,immediate「形式。這是故意的 - 它使分析變得簡單(獲取字符,獲取整數,將它們添加到數組或鏈接列表中)。

+0

我問如何解析in.file,並基本上處理該輸入文件中所述的文本文件。有任何幫助嗎? –