短作业优先调度.docx
《短作业优先调度.docx》由会员分享,可在线阅读,更多相关《短作业优先调度.docx(10页珍藏版)》请在冰豆网上搜索。
![短作业优先调度.docx](https://file1.bdocx.com/fileroot1/2023-1/25/5f86f5b2-c4ca-4897-a153-339dd9a86996/5f86f5b2-c4ca-4897-a153-339dd9a869961.gif)
短作业优先调度
-标准化文件发布号:
(9456-EUATWK-MWUB-WUNN-INNUL-DDQTY-KII
短作业优先调度
实验一进程调度
一、实验目的
编写并调试一个模拟的进程调度程序,以加深对进程的概念及进程调度算法的理解.
二、实验内容
1.采用“短进程优先”调度算法对五个进程进行调度。
每个进程有一个进程控制块(PCB)表示。
进程控制块可以包含如下信息:
进程名、到达时间、需要运行时间、已用CPU时间、进程状态等等。
2.每个进程的状态可以是就绪W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。
每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查。
重复以上过程,直到所要进程都完成为止。
三、实现思路
主函数-输入函数-短作业优先调度函数-输出函数。
这是一条最基础的思路。
输入函数使用文本导入完成数据输入,输出函数输出调度结果,主函数完成各子函数连接,最主要的是短作业优先的调度函数。
我想到的方法就是排序,不断选择需要运行时间最短的作业,接着进行数据输入计算输出等,遍历全部数据并完成调度。
四、主要的数据结构
structProcess_struct{
charname[MaxNum];//进程名称
intarrivetime;//到达时间
intservertime;//开始运行时间
intfinishtime;//运行结束时间
intruntime;//运行时间
intrunflag;//调度标志
intorder;//运行次序
doubleweightwholetime;//周转时间
doubleaveragewt_FCFS,averagewt_SJF;//平均周转时间
doubleaveragewwt_FCFS,averagewwt_SJF;//平均带权周转时间
}pro[MaxNum];
五、算法流程图
10
是
否
六、运行与测试
用书上数据对程序进行测试,结果如下:
另外随便添加一些数据进行测试,结果如下:
代码实现:
#include
#include
#defineMaxNum100
usingnamespacestd;
structProcess_struct{
charname[MaxNum];//进程名称
intarrivetime;//到达时间
intservertime;//开始运行时间
intfinishtime;//运行结束时间
intruntime;//运行时间
intrunflag;//调度标志
intorder;//运行次序
doubleweightwholetime;//周转时间
doubleaveragewt_FCFS,averagewt_SJF;//平均周转时间
doubleaveragewwt_FCFS,averagewwt_SJF;//平均带权周转时间
}pro[MaxNum];
intN;//实际进程个数
intSJF();//短作业优先函数
intSJF()
{
inttemp_time=0;
inti=0,j;
intnumber,temp_counter;//进程编号,当前已执行进程个数
floatrun_time;
intmin=0;
run_time=pro[i].runtime;
j=1;
while((j{
if(pro[j].runtime>pro[i].runtime){
run_time=pro[i].runtime;
i=j;
}
j++;
}
for(j;j{while((jpro[j].arrivetime))//选出第一个到达的进程
{
min=j;
i=j;
j++;
}}
number=min;//对第一个到达的进程赋值,计算
pro[number].servertime=pro[number].arrivetime;
pro[number].finishtime=pro[number].servertime+pro[number].runtime;
pro[number].runflag=1;
temp_time=pro[number].finishtime;
pro[number].order=1;
temp_counter=1;
while(temp_counter{
for(j=0;j{
if((pro[j].arrivetime<=temp_time)&&(!
pro[j].runflag))
{
run_time=pro[j].runtime;
number=j;
break;
}
}
for(j=0;j{
if((pro[j].arrivetime<=temp_time)&&(!
pro[j].runflag))
if(pro[j].runtime{
run_time=pro[j].runtime;
number=j;
}
}
pro[number].servertime=temp_time;//对最短作业进行赋值,计算
pro[number].finishtime=pro[number].servertime+pro[number].runtime;
pro[number].runflag=1;
temp_time=pro[number].finishtime;
temp_counter++;
pro[number].order=temp_counter;
}
return0;
}
intinput();//进程参数输入
intoutput();//调度结果输出
voidmain()
{
intoption;
printf("\n***********************************************\n");
printf("主菜单\n");
printf("***********************************************\n\n");
printf("1使用短作业优先\n\n");
printf("0退出\n\n");
printf("***********************************************\n\n");
printf("输入你想进行的操作:
");
scanf("%d",&option);
printf("\n");
switch(option){
case0:
printf("运行结束。
\n");break;
case1:
printf("对进程用短作业优先调度。
\n\n");
input();
SJF();
output();
break;
}
printf("点击任意键键继续...");
getchar();
}
intinput()//进程参数输入
{
printf("请输入进程个数:
\n");
scanf("%d",&N);
FILE*f;
charbuf[100];
char*p;
if(NULL==(f=fopen("F:
\\1111.txt","r")))//打开文件
{
fprintf(stderr,"Cannotopenfile:
1111.txt");
return1;
}
inti=0,n=0;
while
(1)//导入数据
{
if(n==N)break;
if(NULL==fgets(buf,100,f))break;
if('\n'==buf[0])continue;//空行继续
p=buf;
sscanf(p,"%c%d%d",&pro[n].name,&pro[n].arrivetime,&pro[n].runtime);
n++;
pro[n].servertime=0;
pro[n].finishtime=0;
pro[n].weightwholetime=0;
pro[n].order=0;
pro[n].runflag=0;
}
fclose(f);
return0;
}
intoutput()//调度结果输出
{
inti;
floatturn_round_time=0,f1,w=0;
printf("进程名称到达运行开始运行结束执行顺序周转带权周转\n");
for(i=0;i{
pro[i].weightwholetime=pro[i].finishtime-pro[i].arrivetime;
f1=pro[i].weightwholetime/pro[i].runtime;
turn_round_time+=pro[i].weightwholetime;
w+=f1;
printf("%4s%8d%5d%7d%7d%7d%8.2f%7.2f\n",pro[i].name,pro[i].arrivetime,pro[i].runtime,pro[i].servertime,pro[i].finishtime,pro[i].order,pro[i].weightwholetime,f1);
}
printf("average_turn_round_timer=%1.2f\n",turn_round_time/N);
printf("weight_average_turn_round_timer=%1.2f\n",w/N);
return0;
}