2012-10-06 22 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,并基本上处理该输入文件中所述的文本文件。有任何帮助吗? –