进程调度算法实验报告.docx

上传人:b****1 文档编号:14311405 上传时间:2023-06-22 格式:DOCX 页数:13 大小:76.54KB
下载 相关 举报
进程调度算法实验报告.docx_第1页
第1页 / 共13页
进程调度算法实验报告.docx_第2页
第2页 / 共13页
进程调度算法实验报告.docx_第3页
第3页 / 共13页
进程调度算法实验报告.docx_第4页
第4页 / 共13页
进程调度算法实验报告.docx_第5页
第5页 / 共13页
进程调度算法实验报告.docx_第6页
第6页 / 共13页
进程调度算法实验报告.docx_第7页
第7页 / 共13页
进程调度算法实验报告.docx_第8页
第8页 / 共13页
进程调度算法实验报告.docx_第9页
第9页 / 共13页
进程调度算法实验报告.docx_第10页
第10页 / 共13页
进程调度算法实验报告.docx_第11页
第11页 / 共13页
进程调度算法实验报告.docx_第12页
第12页 / 共13页
进程调度算法实验报告.docx_第13页
第13页 / 共13页
亲,该文档总共13页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

进程调度算法实验报告.docx

《进程调度算法实验报告.docx》由会员分享,可在线阅读,更多相关《进程调度算法实验报告.docx(13页珍藏版)》请在冰点文库上搜索。

进程调度算法实验报告.docx

进程调度算法实验报告

实验报告

实验一:

进程调度算法

一、实验目的

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

printf("%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].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");

结束时间

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

printf("\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;

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

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2