实验二 调度算法的模拟实现
实验目的
加深对先来先服务算法,短作业优先算法,最高优先权优先调度算法等三种调度算法的理解
利用C语言编写算法,模拟实现先来先服务算法,短作业优先算法,最高优先权优先调度算法。
模拟三种调度算法,对比三种调度算法的优缺点,并计算平均周转时间和平均带权周转时间。
实验开发平台
Microsoft Visual C++ 6.0(使用C语言)
三个调度算法说明
先来先服务调度算法,是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度,就是每次从就绪队列中选择一个最先进入队列的进程,该算法比较有利于长作业,而不利于短作业。另处,FCFS调度算法对CPU繁忙型作业较有利,而不利于I/O繁忙作业。
短作业优先调度算法(SWF),是指对短作业或短进程优先调度的算法,是指分派CPU时,把CPU优先分给最短的作业。它的缺点是对长作业不利,不能保证及时处理解紧迫性的作业。
最高优先权优先调度算法,常用于批处理系统中,既照顾了短作业,又考虑了作业到达的先后次序,不会使长作业长期得不到服务。它实现了一种较好的折衷,但每要进行高度之前,都须先做响应比的计算,这会增加系统开销。
实验源程序
#include
struct process
{
char name[10];
int dtime;
int ftime;
int youxian;
};
struct process pro[3];
struct process tempPro[3];
void fcfs()//先来先服务
{
//先对这些线程排序,使用冒泡法排序,从小到大
int i,j;
for (i=0;i<3-1;i++)
{
for (j=0;j<2-i;j++)
{
if (pro[j].dtime>pro[j+1].dtime)
{
tempPro[j]=pro[j];
pro[j]=pro[j+1];
pro[j+1]=tempPro[j];
}
}
}
}
void sjf()
//短作业优先
{
//使用冒泡法排序,从小到大
int i,j;
for (i=0;i<3-1;i++)
{
for (j=0;j<2-i;j++)
{
if (pro[j].ftime>pro[j+1].ftime)
{
tempPro[j]=pro[j];
pro[j]=pro[j+1];
pro[j+1]=tempPro[j];
}
}
}
}
void youxian()
//最高优先权优先,假定此处为优先数最大的进程优先服务
{ //使用冒泡法排序,从大到小
int i,j;
for (i=0;i<3-1;i++)
{
for (j=0;j<2-i;j++)
{
if (pro[j].youxian
{
tempPro[j]=pro[j];
pro[j]=pro[j+1];
pro[j+1]=tempPro[j];
}
}
}
}
void print()//输出进程名称
{
int i;
for (i=0;i<3;i++)
{
printf("%s\n",pro[i].name);
}
}
void main()
{
printf("请输入第一个进程的名字 到达时间 服务时间 优先数\n");
scanf("%s %3d %3d %3d",&pro[0].name,&pro[0].dtime,&pro[0].ftime,&pro[0].youxian);
printf("请输入第二个进程的名字 到达时间 服务时间 优先数\n");
scanf("%s %3d %3d %3d",&pro[1].name,&pro[1].dtime,&pro[1].ftime,&pro[1].youxian);
printf("请输入第三个进程的名字 到达时间 服务时间 优先数\n");
scanf("%s %3d %3d %3d",&pro[2].name,&pro[2].dtime,&pro[2].ftime,&pro[2].youxian);
printf("先来先服务调度执行顺序:\n");
fcfs();
print();
printf("短作业优先调度执行顺序:\n");
sjf();
print();
printf("最高优先权优先调度执行顺序:\n");
y