首页 > 代码库 > 进程调度模拟
进程调度模拟
操作系统实验作业。简单写一下,都写到一个文件去来。
1 /************************************************************************* 2 > File Name: LinkList.c 3 > Author: ICKelin 4 > Mail: 18277973721@sina.cn 5 > Created Time: 2014年12月12日 星期五 02时27分14秒 6 ************************************************************************/ 7 8 #include<stdio.h> 9 #include<string.h> 10 #include<errno.h> 11 #include<stdlib.h> 12 #include<unistd.h> 13 #include<sys/wait.h> 14 #include<limits.h> 15 16 #define WAIT 0x01 17 #define READY 0x02 18 #define RUNNING 0x03 19 #define FINISH 0x04 20 21 #define MAX_PROCESS 255 22 #define INFINITY 65535 23 #define MAX_PRORITY 4 24 25 #define O_FCFS 0x01 26 #define O_SJF 0X02 27 #define O_HRRF 0x03 28 #define O_DEF 0x04 29 30 #define IF_FCFS(a) (a == O_FCFS?1:0) 31 #define IF_SJF(a) (a == O_SJF?1:0) 32 #define IF_HRRF(a) (a == O_HRRF?1:0) 33 34 35 36 struct pcb 37 { 38 int pid; //进程id 39 char pname[256]; //进程名称 40 int priority; //优先级 41 double submit_time; //进程提交时间 42 double run_time; //进程需要运行时间 43 double start_time; //进程开始时间 44 double end_time; //进程结束时间 45 double wait_time; //进程等待时间 46 double response_time; //响应时间 结束时间-开始时间 47 double round_time; //平均带权时间 响应时间/运行时间 48 int status; //进程状态,WAIT,READY,RUNNING FINISH 49 }; 50 51 typedef struct pcb DataType; 52 53 typedef struct list 54 { 55 int size; 56 DataType infor; 57 struct list* next; 58 }*linklist, *pNode, Node; 59 60 int insert_node(linklist, pNode, int); 61 void show_linklist(linklist); 62 63 void error(char *msg) 64 { 65 fprintf(stderr,"msg error with: %s\n",msg, strerror(errno)); 66 exit(1); 67 } 68 69 linklist init_linklist() 70 { 71 linklist list = NULL; 72 list = malloc(sizeof( struct list) ); 73 if(list != NULL) 74 { 75 list->next = NULL; 76 list->size = 0; 77 } 78 79 return list; 80 } 81 //链表复制 82 linklist copy_linklist(linklist list) 83 { 84 linklist backup = init_linklist(); 85 if(backup == NULL) 86 error("init linklist"); 87 linklist head = list->next; 88 89 while(head != NULL) 90 { 91 pNode temp = malloc(sizeof(Node)); 92 temp->infor = head->infor; 93 temp->next = NULL; 94 95 insert_node(backup,temp,O_DEF); 96 head = head->next; 97 } 98 return backup; 99 }100 //尾插法101 int insert_node(linklist list, pNode node, int option)102 {103 int flag = 0;104 105 linklist head = list;106 if(head->next == NULL)107 {108 node->next = head->next;109 head->next = node;110 list->size++;111 return list->size;112 }113 while( head->next !=NULL)114 { 115 //对于FCFS,需要有序插入116 if( IF_FCFS(option) && head->next->infor.submit_time> node->infor.submit_time)117 {118 node->next = head->next;119 head->next = node;120 flag = 1;121 break;122 }123 head = head->next;124 }125 //对于SFJ或者FCFS的尾部,简单插入到尾部即可126 if(!flag)127 {128 node->next = head->next;129 head->next = node;130 }131 list->size++;132 return list->size;133 134 }135 136 137 void show_linklist(linklist list)138 {139 linklist head = list->next;140 printf("pid pname submit run start finish average round\n");141 while(head!=NULL)142 {143 printf("%d\t",head->infor.pid);144 printf("%s\t",head->infor.pname);145 printf("%6.2lf\t",head->infor.submit_time);146 printf("%6.2lf\t",head->infor.run_time);147 printf("%6.2lf\t",head->infor.start_time);148 printf("%6.2lf\t",head->infor.end_time);149 printf("%6.2lf\t",head->infor.wait_time);150 printf("%6.2f\n",head->infor.round_time);151 head = head->next;152 }153 }154 155 /*156 * FCFS原理:157 * 队列按照提交时间排序,取队头158 * fork一个子进程,运行159 * 父进程等待子进程结束160 * 填充数据结构161 *162 * */163 164 void FCFS(linklist list)165 {166 linklist finish_list = init_linklist();167 if(finish_list == NULL)168 error("init finish linklist");169 linklist head = list->next;170 double start = head->infor.submit_time;171 int index = 0;172 while(head!=NULL)173 {174 double run_time = head->infor.run_time;175 head->infor.start_time = start;176 int pid;177 int status;178 if( (pid = fork())<0 )179 error("fork");180 else if(pid == 0) //子进程181 {182 fprintf(stdout,"%s is running\n", head->infor.pname);183 head->infor.status = RUNNING;184 sleep(run_time/10);185 exit(1);186 }187 else //父进程188 {189 head->infor.pid = pid;190 waitpid(pid,&status,0);191 fprintf(stdout,"%s is finished\n", head->infor.pname);192 head->infor.end_time = start + run_time;193 //从提交时间到结束时间194 head->infor.wait_time = head->infor.end_time - head->infor.submit_time;195 head->infor.round_time = head->infor.wait_time/ head->infor.run_time;196 //head->infor.status = FINISH;197 pNode temp = malloc(sizeof(Node));198 if(temp == NULL)199 error("out of memory");200 temp = head;201 start = head->infor.end_time;202 203 head = head->next;204 }205 206 }207 printf("FCFS Result:\n");208 show_linklist(list);209 }210 211 /*212 * SJF原理:213 * SJF相对与FCFS来说,多了个运行时间的判断214 * 还是按照提交时间排序215 * 选出提交时间<当前时间&&运行时间最小&&status == READY的节点216 * fork子进程,运行217 * 父亲进程等待子进程结束218 * 填充数据结构219 *220 * */221 222 void SJF(linklist list)223 {224 //就绪225 linklist head = list; //这样不用再找前驱。利用前驱的后继去对比。对上,得到前驱226 //完成227 linklist finish_list = init_linklist();228 229 if(finish_list == NULL)230 error("init finish linklist");231 232 double start = head->next->infor.submit_time;233 234 235 double min = INFINITY;236 237 pNode node = malloc(sizeof( Node));238 while(list->next != NULL)239 {240 head = list;241 min = INFINITY;242 while(head->next!=NULL)243 {244 if(head->next->infor.status == WAIT && head->next->infor.submit_time <= start && min > head->next->infor.run_time)245 {246 min = head->next->infor.run_time;247 node = head;248 }249 head = head->next;250 }251 252 253 //等待队列删除,删除需要前驱,node是要删除节点的前驱254 255 pNode temp = malloc(sizeof(Node));256 257 temp = node->next;258 temp->infor.status = RUNNING; 259 260 node->next = node->next->next;261 262 //创建子进程263 int pid ;264 if((pid = fork())<0)265 error("fork");266 else if(pid == 0) //子进程267 {268 printf("%s is running!\n", temp->infor.pname);269 double run = temp->infor.run_time;270 sleep(run/10);271 exit(1);272 }273 274 else //父进程275 {276 int status;277 waitpid(pid,&status,0);278 printf("%s is finishd!\n", temp->infor.pname);279 temp->infor.pid = pid;280 temp->infor.start_time = start;281 temp->infor.end_time = start + temp->infor.run_time; //结束时间282 temp->infor.response_time = temp->infor.end_time - temp->infor.submit_time;283 temp->infor.round_time = temp->infor.response_time/temp->infor.run_time;284 temp->infor.wait_time = temp->infor.end_time - temp->infor.submit_time;285 Node node = *temp;286 insert_node(finish_list, temp,O_SJF);287 start = start + temp->infor.run_time;288 }289 290 }291 292 printf("SJF Result: \n");293 show_linklist(finish_list);294 }295 296 /*297 * 优先权调度,非抢占式原理298 * 跟SJF原理相似,二级排序根据优先级来排序299 * 约定优先级为0-3300 *301 * */302 303 void priority_weak(linklist list)304 {305 //就绪306 linklist head = list; //这样不用再找前驱。利用前驱的后继去对比。对上,得到前驱307 //完成308 linklist finish_list = init_linklist();309 310 if(finish_list == NULL)311 error("init finish linklist");312 313 double start = head->next->infor.submit_time;314 315 316 int min = 4;317 318 pNode node = malloc(sizeof( Node));319 while(list->next != NULL)320 {321 head = list;322 min = 4;323 while(head->next!=NULL)324 {325 if(head->next->infor.status == WAIT && head->next->infor.submit_time <= start && min > head->next->infor.priority)326 {327 min = head->next->infor.priority;328 node = head;329 }330 head = head->next;331 }332 333 334 //等待队列删除,删除需要前驱,node是要删除节点的前驱335 336 pNode temp = malloc(sizeof(Node));337 338 temp = node->next;339 temp->infor.status = RUNNING; 340 341 node->next = node->next->next;342 343 //创建子进程344 int pid ;345 if((pid = fork())<0)346 error("fork");347 else if(pid == 0) //子进程348 {349 printf("%s is running!\n", temp->infor.pname);350 double run = temp->infor.run_time;351 sleep(run/10);352 exit(1);353 }354 355 else //父进程356 {357 int status;358 waitpid(pid,&status,0);359 printf("%s is finishd!\n", temp->infor.pname);360 temp->infor.pid = pid;361 temp->infor.start_time = start;362 temp->infor.end_time = start + temp->infor.run_time; //结束时间363 temp->infor.response_time = temp->infor.end_time - temp->infor.submit_time;364 temp->infor.round_time = temp->infor.response_time/temp->infor.run_time;365 temp->infor.wait_time = temp->infor.end_time - temp->infor.submit_time;366 Node node = *temp;367 insert_node(finish_list, temp,O_SJF);368 start = start + temp->infor.run_time;369 }370 371 }372 373 printf("priority_weak Result: \n");374 show_linklist(finish_list);375 }376 377 /*378 * 优先权调度,抢占式原理379 * 利用链表的方式380 * 调度原则:381 * 初始化情况下,就绪队列按照提交时间升序排序382 * 选择当前队头,从就绪队列中删除,并且放入运行队列中,计算运行结束时间,383 * 从链表中找出小于或等于计算出的运行结束时间,并且优先级最小的384 * 记下提交时间,这个提交时间-运行队列队头的提交时间就是队头此次运行的时间。385 * 迭代以上过程,直到就绪队列为空,运行队列为空。则调度完成。386 *387 * */388 void priority_strong(linklist ready_list)389 {390 391 linklist running_list = init_linklist();392 if(running_list == NULL)393 error("init linklist");394 linklist finish_list = init_linklist();395 if(finish_list == NULL)396 error("init linklist");397 398 while(ready_list->next!=NULL) //就绪队列不是空399 {400 linklist running_head = running_list->next;401 double start = running_head->infor.submit_time;402 double end = start + running_head->infor.run_time;403 linklist ready_head = ready_list; //为了方便删除,用下一个节点去对比404 int prority = MAX_PRORITY;405 while(ready_head->next!=NULL&& ready_head->next->infor.submit_time<end)406 {407 pNode to_run;408 if(ready_head->infor.priority<prority)409 {410 to_run = ready_head;411 prority = ready_head->infor.priority;412 }413 ready_head = ready_head->next;414 }415 //找到优先级最高的。且在范围内的416 }417 418 419 printf("priority_strong Result:\n");420 show_linklist(ready_list);421 }422 423 424 int main(int argc,char *argv[])425 {426 linklist list = init_linklist();427 if(list ==NULL)428 error("init_linklist");429 printf("please input process infor(end with EOF):\n");430 printf("name start run priority\n");431 432 pNode node = malloc(sizeof(Node));433 if(node == NULL)434 error("out of memory");435 436 //输入437 while(~scanf("%s%lf%lf%d",node->infor.pname, &node->infor.submit_time, &node->infor.run_time, &node->infor.priority))438 {439 node->infor.status = WAIT;440 insert_node(list, node,O_FCFS); //构建就绪队列,省去后备队列441 node = malloc(sizeof(Node));442 if(node == NULL)443 error("out of memory");444 }445 446 printf("\nReady! go..\n");447 show_linklist(list);448 //FCFS449 linklist backup = copy_linklist(list);450 FCFS(backup);451 //优先权调度,非抢占式子调度452 backup = copy_linklist(list);453 priority_weak(backup);454 //SJF算法455 //backup = copy_linklist(list);456 //SJF(backup);457 //优先权调度,抢占式调度458 //backup = copy_linklist(list);459 //priority_strong(list);460 }
优先权调度,抢占式的代码有问题。
提供一个输入文件input,重定向标准输入即可。
job1 8 60 2job2 8.5 50 0job3 9 10 3job4 9.5 20 1
进程调度模拟
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。