进程调度算法实验报告.docx
《进程调度算法实验报告.docx》由会员分享,可在线阅读,更多相关《进程调度算法实验报告.docx(13页珍藏版)》请在冰点文库上搜索。
![进程调度算法实验报告.docx](https://file1.bingdoc.com/fileroot1/2023-6/22/8bf80d4e-8e01-4533-a17d-2ac9b741434a/8bf80d4e-8e01-4533-a17d-2ac9b741434a1.gif)
进程调度算法实验报告
实验报告
实验一:
进程调度算法
一、实验目的
1.利用高级语言实现三种不同及进程调度算法:
短作业优先算法、时间片轮转调度算法和优先级调度算法。
2.通过实验理解有关进程控制块,进程队列等的概念。
二、实验原理
各调度算法思想:
1.先来先服务算法(FCFS):
按照进程进入就绪队列的先后次序来分配CPU,一旦一个进程占有CPU,就一直运行下去,知道该进程完成工作,才释放CPU。
2.时间片轮转算法:
系统将所有就绪进程按到达时间的先后次序排成一个队列,进程调度程序总是选择队列中的第一个进程执行,且仅能执行一个时间片,在使用完一个时间片后,即使进程并未完成其运行,也必须将CPU交给下一个进程;如果一个时间片未使用完就完成了该进程,则剩下的时间分配给下一个进程。
3.优先权调度算法;在创建进程时就确定优先权,确定之后在整个程序运行期间不再改变,根据优先级排列,系统会把CPU分配给优先权最高的进程。
三、实验步骤、数据记录及处理
1、算法流程
抽象数据类型的定义:
PCB块结构体类型
structPCB
{
intname;
intarrivetime;//到达时间
intservicetime;//服务时间
//intstarttime[max];//开始时间
intfinishtime;//完成/结束时间
intturntime;//周转时间
intaverage_turntime;//带权周转时间
intsign;//标志进程是否完成
intremain_time;//剩余时间
intpriority;//优先级
}pcb[max];
主程序的流程以及各程序模块之间的层次(调用)关系:
主程序中从键盘得到进程的数量,创建PCB,调用layout()函数显示选择界面。
Layout()函数中选择相应的算法并调用相关函数如:
FCFS()、time_segment();
Priority(),这三个函数分别实现先来先服务算法,时间片轮转算法和优先级算法,最后分别打印。
程序流程图:
2、运行结果分析:
先来先服务算法:
时间片轮转算法:
优先级算法:
西安工业大学实验报告
也发现了已
四、总结与体会
经过此次实验,我觉得具体写代码就是对解题步骤的一个细化,
往课程中学习的不足,以便日后改正。
附录:
源代码
#include
#include
#definemax50
structPCB
{
intname;
intarrivetime;//到达时间
intservicetime;//服务时间
//intstarttime[max];//开始时间
intfinishtime;//完成/结束时间
intturntime;//周转时间
intaverage_turntime;//带权周转时间
intsign;//标志进程是否完成
intremain_time;//剩余时间
intpriority;//优先级
}pcb[max];
voidinit(intn)//初始化
{
for(inti=0;i{
pcb[i].arrivetime=0;
pcb[i].servicetime=0;
//pcb[i].starttime=0;
pcb[i].finishtime=0;
pcb[i].turntime=0;
pcb[i].average_turntime=0;
pcb[i].remain_time=0;
pcb[i].sign=0;
pcb[i].priority=0;
}
}
voidcreat(intn)//创建PCB
{
inti;
for(i=1;i<=n;i++)
printf("\n%d:
\n请依次输入进程的信息\n请输入进程名:
",i);
scanf("%d",&pcb[i].name);
printf("请输入到达时间:
");
scanf("%d",&pcb[i].arrivetime);
printf("请输入服务时间:
");
scanf("%d",&pcb[i].servicetime);
printf("请输入优先级:
");
scanf("%d",&pcb[i].priority);
pcb[i].remain_time=pcb[i].servicetime;//初始化剩余时间为服务时间
}
}
voidFCFS(intn)//先来先服务
{
intstarttime;
printf("请输入开始执行时间:
\n");
scanf("%d",&starttime);
if(starttime>=pcb[0].arrivetime)
{
pcb[0].finishtime=pcb[0].servicetime+starttime;
else
pcb[0].finishtime=pcb[0].finishtime+pcb[0].servicetime;
}
for(inti=1;i{
if(pcb[i-1].finishtime>pcb[i].arrivetime)
pcb[i].finishtime=pcb[i-1].finishtime+pcb[i].servicetime;
else
pcb[i].finishtime=pcb[i].arrivetime+pcb[i].servicetime;
pcb[i].turntime=pcb[i].finishtime-pcb[i].arrivetime;
pcb[i].average_turntime=pcb[i].turntime/pcb[i].servicetime;
}
}
voidprint_FCFS(intn)
周转时
{
//printf("进程名,到达时间\t服务时间\t完成时间\t周转时间\t
间:
%s\t%d\t%d\t%d\t%d\t%d\t");
printf("进程名到达时间服务时间完成时间周转时间带权周转时间:
\n");
%d
for(inti=0;iprintf("%d,%d,%d,%d,%d
",pcb[i].name,pcb[i].arrivetime,pcb[i].servicetime,pcb[i].finishtime,pcb[i].turntime,pcb[i].average_turntime);
printf("\n");
}
}
voidtime_segment(intn)//时间片轮转
{
inti,j;
intT;//时间片
intflag=1;//就绪队列中是否还有进程
//inttime=pcb[0].arrivetime;//当前的时间
inttime=0;
intsum=0;//已经完成的进程数
//按各进程的arrivetime进行升序排列
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
{
if(pcb[j].arrivetimepcb[0]=pcb[j];
pcb[j]=pcb[i];
pcb[i]=pcb[0];
}
}
//printf("输出排序结果:
\n");
//for(i=1;i<=n;i++)//检查排序是否正确
//printf("%d\t",pcb[i].name);
printf("输入时间片:
\n");
结束时间
scanf("%d",&T);
//printf("\n运行的进程名开始运行时间运行时间剩余服务时间
\n");
while(sum{
flag=0;//当前就绪队列中没有进程
for(i=1;i<=n;i++)
{
if(pcb[i].sign==1)continue;//表示该进程已完成else
//没有完成的进程需要的时间大于一个时间片
if(pcb[i].remain_time>T)
{
flag=1;
time=time+T;
pcb[i].remain_time=pcb[i].remain_time-T;
//printf("%10d%16d%12d%12d%12d\n",pcb[i].name,time-T,T,pcb[i].remain_time,time);
}
//没有完成的进程需要的时间小于或等于一个时间片
elseif(pcb[i].remain_time<=T)
{
flag=1;//加入就绪队列
time=time+pcb[i].remain_time;
pcb[i].finishtime=time;
pcb[i].sign=1;
//printf("%10d%16d%12d%12d%12d\n",pcb[i].name,time-pcb[i].remain_time,pcb[i].servicet
ime,0,time);
pcb[i].remain_time=0;
if(pcb[i].sign==1)sum++;
}
}//for
if(flag==0&&sum{
for(i=1;i<=n;i++)
if(pcb[i].sign==0){time=pcb[i].arrivetime;break;}
}
}//while
}
voidprint_time(intn)
{
for(inti=0;iprintf("\n进程名服务时间完成时间\n");
printf("%6d%10d%10d",pcb[i+1].name,pcb[i].servicetime,pcb[i].finishtime);printf("\n");
}
}
voidPriority(intn)
{
inti,j;
inttime=pcb[1].arrivetime;
//按各进程的arrivetime进行升序排列,最早到达的进程先执行
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
{
if(pcb[j].arrivetime{
pcb[0]=pcb[j];
pcb[j]=pcb[i];
pcb[i]=pcb[0];
//printf("输出排序结果:
\n");
//for(i=1;i<=n;i++)//检查排序是否正确
//printf("%d\t",pcb[i].name);
printf("\n进程名服务时间优先级完成时间\n");
//先到达的进程第一个执行
if(i=1)
{
pcb[i].finishtime=pcb[i].arrivetime+pcb[i].servicetime;
time=pcb[i].arrivetime+pcb[i].servicetime;
printf("%6d%10d%10d%10d",pcb[i].name,pcb[i].servicetime,pcb[i].priority,pcb[i].finishtime);
printf("\n");
//测试第一个进程输出正确
/*printf("输出第一个程序的:
\n");
printf("名称到达时间完成时间\n");
printf("%4d%8d%8d",pcb[i].name,pcb[i].arrivetime,pcb[i].finishtime);
printf("\n");*/
//按各进程的priority进行降序排列,优先级最高的进程先执行for(i=2;i<=n;i++)
for(j=i+1;j<=n;j++)
{
if(pcb[j].priority>pcb[i].priority)
{
pcb[0]=pcb[j];
pcb[j]=pcb[i];
pcb[i]=pcb[0];
}
}
for(i=2;i<=n;i++)
{
time=time+pcb[i].servicetime;
pcb[i].finishtime=time;
printf("%6d%10d%10d%10d",pcb[i].name,pcb[i].servicetime,pcb[i].priority,pcb[i].finishtime
);
printf("\n");
}//for
}//voidvoidlayout(intn)
{
intch=0;
printf("\t\t**
调度算法
);
printf("\t\t1.先来先服务\n");
printf("\t\t2.时间片轮转\n");
printf("\t\t3.优先级\n");
printf("选择算法:
\n");
scanf("%10d",&ch);
switch(ch)
{
case1:
FCFS(n);
print_FCFS(n);break;
case2:
time_segment(n);
print_time(n);break;
case3:
Priority(n);break;
default:
printf("entererrordata!
\n");
//P:
int类型的变量,case后面不要加''
}
}
intmain()
{
intn;
printf("输入进程的个数\n");
scanf("%d",&n);
init(n);
creat(n);
layout(n);
//FCFS(n);
//print_FCFS(n);
//time_segment(n);
//print_time(n);
//Priority(n);
return0;