void initialize_system () { FILE *fconfig; fconfig = fopen ("config.sys", "r"); fscanf (fconfig, "%d\n", &Observe); fscanf (fconfig, "%d %d\n", &cpuQuantum, &idleQuantum); fscanf (fconfig, "%d %d %d %d\n", &pageSize, &memSize, &swapSize, &OSmemSize); fscanf (fconfig, "%d\n", &periodAgeScan); fscanf (fconfig, "%d\n", &spoolPsize); fclose (fconfig); OriginalPages= find_pages(memSize,pageSize); OriginalPages_swapspace = find_pages(swapSize,pageSize); rem_pages = OriginalPages; rem_pages_swapspace = OriginalPages_swapspace; #undef num_pages #define num_pages OriginalPages; OSpages= find_pages(OSmemSize,pageSize); printf("OS Size is %d , OS pages are %d\n", OSmemSize, OSpages); rem_pages= OriginalPages-OSpages; idlePages= find_pages(3, pageSize); /*printf("Idle Size is 256, Idle pages are %d, rem pages are %d \n", idlePages, rem_pages); rem_pages = rem_pages-idlePages;*/ printf("remaining pages are %d\n", rem_pages); #undef num_pages #define num_pages rem_pages; printf("Number of frames in Main memory is %d remaininng pages are %d\n", OriginalPages, rem_pages); initialize_cpu (); printf("initialized CPU \n"); initialize_swap_freelist(rem_pages_swapspace, OriginalPages_swapspace); printf("initialized Swap Space \n"); initialize_freelist(rem_pages, OriginalPages); printf("initialized Main Memory \n"); initialize_timer (); printf("initialized timer \n"); initialize_memory (); printf("initialized memory \n"); initialize_process (); printf("initialized process \n"); // initialize_memory (); // printf("initialized memory \n"); }
static job* initialize_job() { job *j; if((j = (job*)malloc(sizeof(job))) == NULL) return NULL; j->mode = FOREGROUND; j->process_list = initialize_process(); j->next = NULL; return j; }
/* 受け付けた文字列を解析して結果をjob構造体に入れる関数 */ job* parse_line(char *buf) { job *curr_job = NULL; process *curr_prc = NULL; parse_state state = ARGUMENT; int index=0, arg_index=0; /* 改行文字まで解析する */ while(*buf != '\n') { /* 空白およびタブを読んだときの処理 */ if(*buf == ' ' || *buf == '\t') { buf++; if(index) { index = 0; state = ARGUMENT; ++arg_index; } } /* 以下の3条件は、状態を遷移させる項目である */ else if(*buf == '<') { state = IN_REDIRCT; buf++; index = 0; } else if(*buf == '>') { buf++; index = 0; if(state == OUT_REDIRCT_TRUNC) { state = OUT_REDIRCT_APPEND; if(curr_prc) curr_prc->output_option = APPEND; } else { state = OUT_REDIRCT_TRUNC; } } else if(*buf == '|') { state = ARGUMENT; buf++; index = 0; arg_index = 0; if(curr_job) { strcpy(curr_prc->program_name, curr_prc->argument_list[0]); curr_prc->next = initialize_process(); curr_prc = curr_prc->next; } } /* &を読めば、modeをBACKGROUNDに設定し、解析を終了する */ else if(*buf == '&') { buf++; if(curr_job) { curr_job->mode = BACKGROUND; break; } } /* 以下の3条件は、各状態でprocess構造体の各メンバに文字を格納する */ /* 状態ARGUMENTは、 リダイレクション対象ファイル名以外の文字(プログラム名、オプション)を 読む状態 */ /* 状態IN_REDIRCTは入力リダイレクション対象ファイル名を読む状態 */ /* 状態OUT_REDIRCT_*は出力リダイレクション対象ファイル名を読む状態 */ else if(state == ARGUMENT) { if(!curr_job) { curr_job = initialize_job(); curr_prc = curr_job->process_list; } if(!curr_prc->argument_list[arg_index]) initialize_argument_list_element(curr_prc, arg_index); curr_prc->argument_list[arg_index][index++] = *buf++; } else if(state == IN_REDIRCT) { if(!curr_prc->input_redirection) initialize_input_redirection(curr_prc); curr_prc->input_redirection[index++] = *buf++; } else if(state == OUT_REDIRCT_TRUNC || state == OUT_REDIRCT_APPEND) { if(!curr_prc->output_redirection) initialize_output_redirection(curr_prc); curr_prc->output_redirection[index++] = *buf++; } } /* 最後に、引数の0番要素をprogram_nameにコピーする */ if(curr_prc) strcpy(curr_prc->program_name, curr_prc->argument_list[0]); return curr_job; }