一、实验目的
用高级语言完成一个进程调度程序,以加深对进程的概念及进程调度算法的理解。
二、实验要求
设计一个有 N个进程并发执行的进程调度模拟程序。
1.模拟进程数据的生成
允许用户指定作业的个数(2-24),默认值为5。
允许用户选择输入每个进程的到达时间,所需运行时间,进程的运行时间以时间片为单位。
2. 模拟调度程序的功能
2.1 按照模拟数据的到达时间和所需运行时间,能分别执行以下调度算法。
FCFS SJ HRRN RR
2.2 显示每种算法下各进程的调度执行顺序。
2.3计算各进程的开始执行时间,各作业的完成时间,周转时间和带权周转时间(周转系数)。
2.4模拟数据结果分析:对同一组模拟数据,比较各算法的平均周转时间,周转系数。
三、实验说明
1) 先来先服务(FCFS)调度算法,即按作业到达的先后次序进行调度。总是首先调度在系统中等待时间最长的作业。
2) 短作业优先 (SJF) 调度算法,优先调度要求运行时间最短的作业。
3) 响应比高者优先(HRRN)调度算法,为每个作业设置一个优先权(响应比),调度之前先计算各作业的优先权,优先数高者优先调度。RP (响应比)= 作业周转时间 / 作业运行时间=1+作业等待时间/作业运行时间。
4) 时间片轮转(RR)调度算法:调度程序每次把CPU分配给就绪队列首进程使用一个时间片,就绪队列中的每个进程轮流地运行一个时间片。当这个时间片结束时,强迫一个进程让出处理器,让它排列到就绪队列的尾部,等候下一轮调度。
四、实验环境
可以选用Turbo C作为开发环境。也可以选用Windows下的VB,CB等可视化环境,利用各种控件较为方便。自主选择实验环境。
五、程序代码
- #include"stdio.h"
- #define bool char
- #define true 1
- #define false 0
- #define N 50
- int n;
- int sj;
- typedef struct gzuo{
- int id; //进程名字
- int dt; //到达时刻
- int st; //服务时间
- int wct; //完成时刻
- int yxj; //优先级
- int st2; //标志是否完成
- float zt; //周转时间
- float dczt; //带权周转时间
- }Gzuo;
- Gzuo a[N];
- void input(Gzuo a[])
- {
- int i;
- printf("请输入进程个数:");
- scanf("%d",&n);
- for(i=0;i<n;i++)
- {
- a[i].id=i+1;
- printf("\t到达时间: ");
- scanf("%d",&a[i].dt);
- printf("\t服务时间:");
- scanf("%d",&a[i].st);
- a[i].st2 = a[i].st;
- printf("\n");
- }
- printf("\t请输入时间片大小(0<sjp):\t");
- scanf("%d",&sj);
- }
- void sjp(Gzuo a[],int sj)//时间片轮转调度
- {
- int i,j,min,time;
- float sum1,sum2;
- bool flag=true;
- for(j=n-1;j>=0;j--)
- {
- for(i=0;i<j;i++)
- {
- if(a[i].dt>a[i+1].dt)
- {
- min=a[i].dt;
- a[i].dt=a[i+1].dt;
- a[i+1].dt=min;
- min=a[i].st;
- a[i].st=a[i+1].st;
- a[i+1].st=min;
- min=a[i].st2;
- a[i].st2=a[i+1].st2;
- a[i+1].st2=min;
- min=a[i].id;
- a[i].id=a[i+1].id;
- a[i+1].id=min;
- }
- }
- }
- time = a[0].dt;
- min = 0;
- while(min<n)
- {
- flag=true;
- for(i=0;i<n;i++)
- {
- if(a[i].st2>0&&a[i].dt<=time)
- flag=false;
- }
- for(i=0;i<n;i++)
- {
- if(a[i].st2 > 0 )
- {
- if(a[i].dt<=time)
- {
- a[i].st2 = a[i].st2 - sj;
- time = time + sj;
- if(a[i].st2<=0)
- {
- a[i].wct = time + a[i].st2;
- a[i].zt=(float)(a[i].wct-a[i].dt);
- a[i].dczt=a[i].zt/a[i].st;
- min++;
- }
- }else if(flag)
- {
- for(i=0;i<n;i++)
- {
- if(a[i].st2>0&&a[i].dt>time)
- {
- time = a[i].dt;
- break;
- }
- }
- }
- }
- }
- }
- printf("\n进程:到达时间\t服务时间\t完成时间\t周转时间\t带权周转时间\n");
- sum1=0;
- sum2=0;
- for(j=0;j<n;j++)
- {
- for(i=0;i<n;i++)
- if(a[i].id==j+1)
- {
- printf("%d: %d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].st,a[i].wct,a[i].zt,a[i].dczt);
- sum1+=a[i].zt;
- sum2+=a[i].dczt;
- }
- }
- printf("*********************************************************************\n");
- }
- void fcfs(Gzuo a[])//先到先服务调度
- {
- int i,j,min;
- float sum1,sum2;
- for(j=n-1;j>=0;j--)
- {
- for(i=0;i<j;i++)
- {
- if(a[i].dt>a[i+1].dt)
- {
- min=a[i].dt;
- a[i].dt=a[i+1].dt;
- a[i+1].dt=min;
- min=a[i].st;
- a[i].st=a[i+1].st;
- a[i+1].st=min;
- min=a[i].id;
- a[i].id=a[i+1].id;
- a[i+1].id=min;
- }
- }
- }
- a[0].wct=a[0].st+a[0].dt;
- a[0].zt=(float)a[0].st;
- a[0].dczt=a[0].zt/a[0].st;
- for(i=1;i<n;i++)
- {
- if(a[i].dt>a[i-1].wct)
- {
- a[i].wct=a[i].dt+a[i].st;
- a[i].zt=(float)a[i].st;
- a[i].dczt=a[i].zt/a[i].st;
- }
- else
- {
- a[i].wct=a[i-1].wct+a[i].st;
- a[i].zt=(float)(a[i].wct-a[i].dt);
- a[i].dczt=a[i].zt/a[i].st;
- }
- }
- printf("\n进程:到达时间\t服务时间\t完成时间\t周转时间\t带权周转时间\n");
- sum1=0;
- sum2=0;
- for(j=0;j<n;j++)
- {
- for(i=0;i<n;i++)
- if(a[i].id==j+1)
- {
- printf("%d: %d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].st,a[i].wct,a[i].zt,a[i].dczt);
- sum1+=a[i].zt;
- sum2+=a[i].dczt;
- }
- }
- printf("*********************************************************************\n");
- }
- void sjf(Gzuo a[])//短作业优先调度
- {
- int i,j,min;
- int b=0,z;
- float sum1,sum2;
- min=a[0].dt;
- for(j=n-1;j>=0;j--)
- {
- for(i=0;i<j;i++)
- {
- if(a[i].dt>a[i+1].dt)
- {
- min=a[i].dt;
- a[i].dt=a[i+1].dt;
- a[i+1].dt=min;
- min=a[i].st;
- a[i].st=a[i+1].st;
- a[i+1].st=min;
- min=a[i].id;
- a[i].id=a[i+1].id;
- a[i+1].id=min;
- }
- if(a[i].dt==a[i+1].dt&&a[i].st>a[i+1].st)
- {
- min=a[i].dt;
- a[i].dt=a[i+1].dt;
- a[i+1].dt=min;
- min=a[i].st;
- a[i].st=a[i+1].st;
- a[i+1].st=min;
- min=a[i].id;
- a[i].id=a[i+1].id;
- a[i+1].id=min;
- }
- }
- }
- a[0].wct=a[0].st+a[0].dt;
- a[0].zt=(float)a[0].st;
- a[0].dczt=a[0].zt/a[0].st;
- for(i=1;i<n;i++)
- {
- if(a[i].dt>a[0].wct);
- else
- b=b+1;
- }
- for(j=b-1;j>=1;j--)
- {
- for(i=1;i<j;i++)
- {
- if(a[i].st>a[i+1].st)
- {
- min=a[i].dt;
- a[i].dt=a[i+1].dt;
- a[i+1].dt=min;
- min=a[i].st;
- a[i].st=a[i+1].st;
- a[i+1].st=min;
- min=a[i].id;
- a[i].id=a[i+1].id;
- a[i+1].id=min;
- }
- }
- }
- for(i=1;i<n;i++)
- {
- if(a[i].dt>a[i-1].wct)
- {
- a[i].wct=a[i].dt+a[i].st;
- a[i].zt=(float)a[i].st;
- a[i].dczt=a[i].zt/a[i].st;
- }
- else
- {
- a[i].wct=a[i-1].wct+a[i].st;
- a[i].zt=(float)(a[i].wct-a[i].dt);
- a[i].dczt=a[i].zt/a[i].st;
- }
- for(j=i+1,b=j;j<n;j++)
- {
- if(a[j].dt>a[i].wct);
- else
- b=b+1;
- }
- for(j=b-1;j>=i;j--)
- {
- for(z=i;z<j;z++)
- {
- if(a[z].st>a[z+1].st)
- {
- min=a[z].dt;
- a[z].dt=a[z+1].dt;
- a[z+1].dt=min;
- min=a[z].st;
- a[z].st=a[z+1].st;
- a[z+1].st=min;
- min=a[i].id;
- a[i].id=a[i+1].id;
- a[i+1].id=min;
- }
- }
- }
- }
- printf("\n进程:到达时间\t服务时间\t完成时间\t周转时间\t带权周转时间\n");
- sum1=0;
- sum2=0;
- for(j=0;j<n;j++)
- {
- for(i=0;i<n;i++)
- if(a[i].id==j+1)
- {
- printf("%d: %d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].st,a[i].wct,a[i].zt,a[i].dczt);
- sum1+=a[i].zt;
- sum2+=a[i].dczt;
- }
- }
- printf("**************************************************************************\n");
- }
- void yxj(Gzuo a[])//优先级优先调度
- {
- int i,j,min;
- int b=0,z;
- float sum1,sum2;
- min=a[0].dt;
- for(j=n-1;j>=0;j--)
- {
- for(i=0;i<j;i++)
- {
- if(a[i].dt>a[i+1].dt)
- {
- min=a[i].dt;
- a[i].dt=a[i+1].dt;
- a[i+1].dt=min;
- min=a[i].st;
- a[i].st=a[i+1].st;
- a[i+1].st=min;
- min=a[i].id;
- a[i].id=a[i+1].id;
- a[i+1].id=min;
- min=a[i].yxj;
- a[i].yxj=a[i+1].yxj;
- a[i+1].yxj=min;
- }
- if(a[i].dt==a[i+1].dt&&a[i].yxj<a[i+1].yxj)
- {
- min=a[i].dt;
- a[i].dt=a[i+1].dt;
- a[i+1].dt=min;
- min=a[i].st;
- a[i].st=a[i+1].st;
- a[i+1].st=min;
- min=a[i].id;
- a[i].id=a[i+1].id;
- a[i+1].id=min;
- min=a[i].yxj;
- a[i].yxj=a[i+1].yxj;
- a[i+1].yxj=min;
- }
- }
- }
- a[0].wct=a[0].st+a[0].dt;
- a[0].zt=(float)a[0].st;
- a[0].dczt=a[0].zt/a[0].st;
- for(i=1;i<n;i++)
- {
- if(a[i].dt>a[0].wct);
- else b++;
- }
- for(j=b-1;j>=1;j--)
- {
- for(i=1;i<j;i++)
- {
- if(a[i].yxj<a[i+1].yxj) {
- min=a[i].dt;
- a[i].dt=a[i+1].dt;
- a[i+1].dt=min;
- min=a[i].st;
- a[i].st=a[i+1].st;
- a[i+1].st=min;
- min=a[i].id;
- a[i].id=a[i+1].id;
- a[i+1].id=min;
- min=a[i].yxj;
- a[i].yxj=a[i+1].yxj;
- a[i+1].yxj=min;
- }
- if(a[i].dt==a[i+1].dt&&a[i].yxj<a[i+1].yxj)
- {
- min=a[i].dt;
- a[i].dt=a[i+1].dt;
- a[i+1].dt=min;
- min=a[i].st;
- a[i].st=a[i+1].st;
- a[i+1].st=min;
- min=a[i].id;
- a[i].id=a[i+1].id;
- a[i+1].id=min;
- min=a[i].yxj;
- a[i].yxj=a[i+1].yxj;
- }
- }
- }
- a[0].wct=a[0].st+a[0].dt;
- a[0].zt=(float)a[0].st;
- a[0].dczt=a[0].zt/a[0].st;
- for(i=1;i<n;i++)
- {
- if(a[i].dt>a[0].wct) ;
- else b++;
- }
- for(j=b-1;j>=1;j--)
- {
- for(i=1;i<j;i++)
- {
- if(a[i].yxj<a[i+1].yxj)
- {
- min=a[i].dt;
- a[i].dt=a[i+1].dt;
- a[i+1].dt=min;
- min=a[i].st;
- a[i].st=a[i+1].st;
- a[i+1].st=min;
- min=a[i].id;
- a[i].id=a[i+1].id;
- a[i+1].id=min;
- min=a[i].yxj;
- a[i].yxj=a[i+1].yxj;
- a[i+1].yxj=min;
- }
- }
- }
- for(i=1;i<n;i++)
- {
- if(a[i].dt>a[i-1].wct)
- {
- a[i].wct=a[i].dt+a[i].st;
- a[i].zt=(float)a[i].st;
- a[i].dczt=a[i].zt/a[i].st;
- }
- else
- {
- a[i].wct=a[i-1].wct+a[i].st;
- a[i].zt=(float)(a[i].wct-a[i].dt);
- a[i].dczt=a[i].zt/a[i].st;
- }
- for(j=i+1,b=j;j<n;j++)
- {
- if(a[j].dt>a[i].wct);
- else b=b+1;
- }
- for(j=b-1;j>=i;j--)
- {
- for(z=i;z<j;z++)
- {
- if(a[z].yxj<a[z+1].yxj)
- {
- min=a[z].dt;
- a[z].dt=a[z+1].dt;
- a[z+1].dt=min;
- min=a[z].st;
- a[z].st=a[z+1].st;
- a[z+1].st=min;
- min=a[i].id;
- a[i].id=a[i+1].id;
- a[i+1].id=min;
- }
- }
- }
- }
- printf("\n进程:到达时间\t服务时间\t优先级\t完成时间\t周转时间\t带权周转时间\n");
- sum1=0;
- sum2=0;
- for(j=0;j<n;j++)
- {
- for(i=0;i<n;i++)
- if(a[i].id==j+1)
- {
- printf("%d:%d\t\t%d\t\t%d\t\t%d\t\t%.0f\t%.2f\n",a[i].id,a[i].dt,a[i].yxj,a[i].st,a[i].wct,a[i].zt,a[i].dczt);
- sum1+=a[i].zt;
- sum2+=a[i].dczt;
- }
- }
- printf("*********************************************************************\n");
- }
- void main()
- {
- int n;
- input(a);
- printf("以下是先到先服务调度:");
- fcfs(a);
- printf("以下是短作业优先调度:");
- sjf(a);
- printf("以下是时间片轮转法:");
- sjp(a,sj);
- printf("以下是优先级优先调度:");
- yxj(a);
- }
六、程序结果