1、进程调度C语言实现#include#include/ 进程结点的基本结构#include typedef struct ProcessNodechar name; / 进程名int service_time; / 服务时间 int arrive_time; / 到达时间 int priority; / 优先级struct FCFS_time / 先到先服务int finish_time; / 完成时间int turnaround_time; / 周转时间 float weigtharound_time;/ 带权周转时间 FCFS_time;struct SJF_time / 短作业优先 int
2、 finish_time; int turnaround_time; float weigtharound_time; int flag;SJF_time;struct RR_time / 时间片轮转的结点int finish_time;int turnaround_time; float weigtharound_time;int flag_time;/ 赋值为进程的服务时间,为 0 则进程完成 RR_time;struct Pri_time / 优先权非抢占式 int finish_time;int turnaround_time;float weigtharound_time;Pri_t
3、ime;struct ProcessNode*next;ProcessNode,*Linklist;void main()int choice;Linklist p,head;Linklist read_information();Linklist FCFS_scheduling(Linklisht ead);Linklist SJF_scheduling(Linklisth ead);Linklist RR_scheduling(Linklisth ead);Linklist Pri_scheduling(Linklist head);head=read_information();/ 读入
4、进程的基本信息dop=head-next;printf(n);printf(n);printf(1、FCFS-先- 到先服务 n); printf(2、SJF 短- 作业优先 n);printf(3、 RR 时间片轮转 n);printf(4、Pri 优先权调度 n);printf(5 、退出 n);printf(n);n);printf(printf(n);printf(请在 15 之间选择 : ); scanf(%d,&choice);printf(n);printf(n);switch(choice)case 1: FCFS_scheduling(head); break;case 2:
5、 SJF_scheduling(head); break;case 3: RR_scheduling(head); break;case 4: Pri_scheduling(head); break;/ case 5: exit();while(choice!=5);Linklist read_information()/ 进程读入函数int i;int num;/ ProcessNode ;Linklist pro;Linklist p;Linklist head;printf(n);printf(进程调度算法 * n);printf(n);printf(请输入进程的个数 :);scanf(
6、%d,&num);printf(n);printf(n);head=(Linklist)malloc(sizeof(ProcessNode);头/ 结点 head-next=NULL;p=head;for(i=1;iname); printf( 到达时间 : ); scanf(%d,&pro-arrive_time); printf( 服务时间 : );scanf(%d,&pro-service_time);printf( 优先级 : );scanf(%d,&pro-priority); /pro-next=head-next; head-next=pro;/ 逆序建链p-next=pro;
7、p=pro;/ 顺序建链/p+;pro-next=NULL;printf(n);return head;Linklist FCFS_scheduling(Linklist head先)/到先服务算法函数Linklist p;Linklist q;/指向前一进程p=head-next;while(p) / 初始化进程的完成时间、周转时间、带权周转时间,初值均赋为 0p-FCFS_time.finish_time=0;p-FCFS_time.turnaround_time=0; p-FCFS_time.weigtharound_time=0;p=p-next;p=q=head-next;p-FCF
8、S_time.finish_time=p-arrive_time;/避免第一个进程到达时间不为 0 while(p) if(p-arrive_timeFCFS_time.finish_time)/下一进程已到达,在等待中p-FCFS_time.finish_time=(p-service_time)+(q-FCFS_time.finish_time);服/ 务时间p-FCFS_time.turnaround_time=(p-FCFS_time.finish_time)-(p-arrive_time);周/ 转时间 p-FCFS_time.weigtharound_time=(float)(p-
9、FCFS_time.turnaround_time)/(p-service_time);/带 权周转时间elsep-FCFS_time.finish_time=p-service_time+p-arrive_time;/服/ 务时间 p-FCFS_time.turnaround_time=(p-FCFS_time.finish_time)-(p-arrive_time);周/ 转时间 p-FCFS_time.weigtharound_time=(float)(p-FCFS_time.turnaround_time)/(p-service_time);/带 权周转时间q=p;p=p-next;p
10、=head-next;到先服务调度后的进程信息printf(n);printf(进程名称 ); printf(到达时间 ); printf(服务时间 );printf(优先级 ); printf(完成时间 ); printf(周转时间 );printf( 带权周转时间 );printf(n);while(p)printf( %c ,p-name);printf( %d ,p-arrive_time);printf( %d ,p-service_time);printf( %d ,p-priority);printf( %d,p-FCFS_time.finish_time);printf( %d
11、,p-FCFS_time.turnaround_time);printf( %0.2f,p-FCFS_time.weigtharound_time); printf(n);p=p-next;printf(n);n);printf(printf(n); return head;Linklist SJF_scheduling(Linklisth ead)/ 短作业优先算法Linklist p,r;Linklist q;/指向前一进程结点int num=0;/ 记录进程个数int add_flag=0;/ 进程完成服务个数int service_time_min;int arrive_time;in
12、t k;p=head-next;/ 首元结点while(p) / 初始化进程的完成时间、周转时间、带权周转时间,初值均赋为 0p-SJF_time.finish_time=0; p-SJF_time.turnaround_time=0; p-SJF_time.weigtharound_time=0;p-SJF_time.flag=0;+num;q=p;p=p-next;q-next=head-next;/ 将创建的进程队列变为循环队列p=head-next;q=p;p-SJF_time.finish_time=p-arrive_time+p-service_time;p-SJF_time.tu
13、rnaround_time=(p-SJF_time.finish_time)-(p-arrive_time);/周/ 转时间 p-SJF_time.weigtharound_time=(float)(p-SJF_time.turnaround_time)/(p-service_time);/带 权 周 转 时 间q-SJF_time.finish_time=p-SJF_time.finish_time;p-SJF_time.flag=1; add_flag=1;p=p-next;doif(p-SJF_time.flag=1)p=p-next;else if(p-arrive_time)(q-S
14、JF_time.finish_time)service_time_min=p-service_time;arrive_time=p-arrive_time; while(p-arrive_time=arrive_time&p-SJF_time.flag=0)/寻找最短的作业 if(p-next-service_time)service_time)service_time_min=p-next-service_time;p=p-next;else p=p-next;p=q-next;r=q; while(p-service_time!=service_time_min)p=p-next;/指针指
15、向最短作业 p-SJF_time.finish_time=p-arrive_time+p-service_time; p-SJF_time.flag=1;+add_flag;p-SJF_time.turnaround_time=(p-SJF_time.finish_time)-(p-arrive_time);/周 转 时间p-SJF_time.weigtharound_time=(float)(p-SJF_time.turnaround_time)/(p-service_time);/带/ 权周转时间 q=p;p=r-next;elsek=0;service_time_min=p-servic
16、e_time;while(p-arrive_time)SJF_time.finish_time)&kSJF_time.flag=1) p=p-next;+k;else if(p-SJF_time.flag!=1)&(p-service_time)service_time;p=p-next;+k;else p=p-next;+k; p=q-next;r=q;while(p-service_time!=service_time_min)p=p-next;/指针指向最短作业 p-SJF_time.finish_time=q-SJF_time.finish_time+p-service_time; p
17、-SJF_time.turnaround_time=(p-SJF_time.finish_time)-(p-arrive_time);/ 周 转 时间p-SJF_time.weigtharound_time=(float)(p-SJF_time.turnaround_time)/(p-service_time);/带/ 权周转时间 p-SJF_time.flag=1;+add_flag;/q=p;p=p-next;q=p;p=r-next;while(add_flag!=num);for(p=head-next;num0;num-)/ 断开循环队列 q=p;p=p-next; q-next=N
18、ULL;p=head-next;/ 指向链首,输出短作业调度后的进程信息printf(n);Linklist RR_scheduling(Linklisth ead)/ 时间片轮转算法 Linklist q;/指向前一进程结点Linklist p;int q_time;/ 时间片大小int num=0;/ 记录进程个数int add_flag=0;/ 进程完成服务个数printf(请输入时间片的大小 : ); scanf(%d,&q_time);p=head-next;while(p) / 初始化进程的完成时间、周转时间、带权周转时间,初值均赋为 0p-RR_time.finish_time=
19、0; p-RR_time.turnaround_time=0;p-RR_time.weigtharound_time=0; p-RR_time.flag_time=p-service_time;q=p;+num;p=p-next;q-next=head-next;/ 将创建的进程队列变为循环队列 p=head-next;q-RR_time.finish_time=p-arrive_time;do/* printf(n);n);printf( printf( %c ,p-name);printf( %d ,p-arrive_time); printf( %d ,p-service_time);
20、printf( %d ,p-priority);printf( %d,p-RR_time.finish_time);printf(n); */if(p-RR_time.flag_time)(q_time)/ 服务时间大于时间片 p-RR_time.finish_time=(q-RR_time.finish_time)+(q_time);/累加完成时间 p-RR_time.flag_time=(p-RR_time.flag_time)-(q_time);if(p-next-arrive_time)RR_time.finish_time)/有进程等待 q=p;p=p-next; else / 当前
21、进程未完成,无进程等待,指针不向后移 q=p; else if(p-RR_time.flag_time)=0)/ 进程已经完成p=p-next;elsep-RR_time.finish_time=(q-RR_time.finish_time)+(p-RR_time.flag_time);p-RR_time.flag_time=0; +add_flag;p-RR_time.turnaround_time=(p-RR_time.finish_time)-(p-arrive_time);/周转时间p-RR_time.weigtharound_time=(float)(p-RR_time.turnar
22、ound_time)/(p-service_time);/ 带权周转时间if(p-next-arrive_time)RR_time.finish_time)/ 有进程等待 q=p;p=p-next; else / 当前进程完成,无进程等待,指针向后移/ q=p; q-RR_time.finish_time=p-next-arrive_time; p=p-next;q=p;q-RR_time.finish_time=p-arrive_time;while(add_flag!=num);/while(p-RR_time.flag=0);for(p=head-next;num0;num-)/ 断开循
23、环队列q=p;p=p-next;q-next=NULL;p=head-next;/ 指向链首,输出时间片轮转调度后的进程信息 printf(n);printf(n);printf(进程名称 ); printf(到达时间 ); printf(服务时间 ); printf(优先级 );printf(完成时间 );printf(周转时间 ); printf( 带权周转时间 );printf(n);while(p)printf( %c ,p-name);printf( %d ,p-arrive_time);printf( %d ,p-service_time);printf( %d ,p-priority);printf( %d,p-RR_time.finish_time);printf( %d,p-RR_time.turnaround_time);printf( %0.2f,p-RR_time.weigtharound_time); printf(n);p=p-next;printf(n);n);printf(printf(n);return head;Linklist Pri_scheduling(Linklist head)/ 优先权调度算法 printf( 优先权调度算法 n); return head;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1