短作业优先调度.docx

上传人:b****5 文档编号:7686821 上传时间:2023-01-25 格式:DOCX 页数:10 大小:114.91KB
下载 相关 举报
短作业优先调度.docx_第1页
第1页 / 共10页
短作业优先调度.docx_第2页
第2页 / 共10页
短作业优先调度.docx_第3页
第3页 / 共10页
短作业优先调度.docx_第4页
第4页 / 共10页
短作业优先调度.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

短作业优先调度.docx

《短作业优先调度.docx》由会员分享,可在线阅读,更多相关《短作业优先调度.docx(10页珍藏版)》请在冰豆网上搜索。

短作业优先调度.docx

短作业优先调度

-标准化文件发布号:

(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;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1