2012-10-06 4 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 goto 4는 3보다 작 으면 line4로 점프를 의미합니다.

기본적으로 위의 명령 줄을 통해 입력 파일을 구문 분석하고 작업을 주문하려고합니다 시작 시간 (첫 번째 줄). 나는이 단계를 가능한 한 효율적으로 수행하기를 정말로 원합니다. 지금까지 내가 코드를 아래에 작성했습니다 :

/* 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을 전달하는 방법에 대한 도움이 필요합니다. 작업을 읽고 시작 시간과 순서를 얻고 'tick'시간, 즉 텍스트 파일의 첫 줄을 시작하십시오.

도움이 될 것입니다 !!

+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"명령으로 시작한 다음 "sleep by blocked"등을 추가하십시오. 결국 "task는 새로운 작업을 생성합니다", "task는 자식이 종료 할 때까지 대기"및 "task

(내 예제에서는) 모든 명령은 "opcode, 즉치"형식으로되어 있음을 알 수 있습니다. 이것은 고의적인데 - 파싱을 단순하게합니다 (문자를 얻고, 정수를 얻고, 배열이나 링크 된 목록에 둘 다 추가합니다).

+0

In.file을 구문 분석하는 방법을 묻는 필자는 본질적으로 해당 입력 파일에 명시된 텍스트 파일에 대한 작업을 수행합니다. 그걸 도와 주겠니? –

관련 문제