《操作系统B》进程调度综合性实验报告.docx

上传人:b****1 文档编号:2569343 上传时间:2023-05-04 格式:DOCX 页数:14 大小:117.62KB
下载 相关 举报
《操作系统B》进程调度综合性实验报告.docx_第1页
第1页 / 共14页
《操作系统B》进程调度综合性实验报告.docx_第2页
第2页 / 共14页
《操作系统B》进程调度综合性实验报告.docx_第3页
第3页 / 共14页
《操作系统B》进程调度综合性实验报告.docx_第4页
第4页 / 共14页
《操作系统B》进程调度综合性实验报告.docx_第5页
第5页 / 共14页
《操作系统B》进程调度综合性实验报告.docx_第6页
第6页 / 共14页
《操作系统B》进程调度综合性实验报告.docx_第7页
第7页 / 共14页
《操作系统B》进程调度综合性实验报告.docx_第8页
第8页 / 共14页
《操作系统B》进程调度综合性实验报告.docx_第9页
第9页 / 共14页
《操作系统B》进程调度综合性实验报告.docx_第10页
第10页 / 共14页
《操作系统B》进程调度综合性实验报告.docx_第11页
第11页 / 共14页
《操作系统B》进程调度综合性实验报告.docx_第12页
第12页 / 共14页
《操作系统B》进程调度综合性实验报告.docx_第13页
第13页 / 共14页
《操作系统B》进程调度综合性实验报告.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

《操作系统B》进程调度综合性实验报告.docx

《《操作系统B》进程调度综合性实验报告.docx》由会员分享,可在线阅读,更多相关《《操作系统B》进程调度综合性实验报告.docx(14页珍藏版)》请在冰点文库上搜索。

《操作系统B》进程调度综合性实验报告.docx

《操作系统B》进程调度综合性实验报告

计算机系综合性实验

实验报告

 

课程名称操作系统B

实验学期2010至2011学年第二学期

学生所在系部

年级专业班级

学生姓名学号

任课教师

实验成绩

 

计算机系制

《操作系统B》课程综合性实验报告

开课实验室:

2011年6月9日

实验题目

进程调度算法程序设计

一、实验目的

通过对进程调度算法的模拟,进一步理解进程的基本概念,加深对进程运行状态和进程调度过程、调度算法的理解。

二、设备与环境

1.硬件设备:

PC机一台

2.软件环境:

安装Windows操作系统或者Linux操作系统,并安装相关的程序开发环境,如C\C++\Java等编程语言环境。

三、实验内容

(1)用C语言(或其它语言,如Java)实现对N个进程采用某种进程调度算法(如动态优先权调度)的调度。

(2)每个用来标识进程的进程控制块PCB可用结构来描述,包括以下字段:

✧进程标识数ID。

✧进程优先数PRIORITY,并规定优先数越大的进程,其优先权越高。

✧进程已占用CPU时间CPUTIME。

✧进程还需占用的CPU时间ALLTIME。

当进程运行完毕时,ALLTIME变为0。

✧进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间片后,进程将进入阻塞状态。

✧进程被阻塞的时间BLOCKTIME,表示已阻塞的进程再等待BLOCKTIME个时间片后,将转换成就绪状态。

✧进程状态STATE。

✧队列指针NEXT,用来将PCB排成队列。

(3)优先数改变的原则:

✧进程在就绪队列中呆一个时间片,优先数增加1。

✧进程每运行一个时间片,优先数减3。

(4)为了清楚地观察每个进程的调度过程,程序应将每个时间片内的进程的情况显示出来,包括正在运行的进程,处于就绪队列中的进程和处于阻塞队列中的进程。

(5)分析程序运行的结果,谈一下自己的认识。

四、实验结果及分析

1.实验设计说明

动态优先权是指在创建进程时所赋予的优先权,是指可以随进程的推进或随其等待时间的增加而改变的,以便获得更好的调度性能。

此程序可以对进程进行动态优先权调度,首先输入进程后,判断进程的优先权,优先权大的先执行,程序将其放入运行队列,而其他进程则位于就绪队列,当一个时间片结束后,上一个时间运行的进程优先权则减3,而位于就绪队列的进程优先权加1,而完成的队列优先权不改变,运行进程的ALLTIME减去1,CPUTIME加1。

当下一个时间片开始时,判断就绪队列中进程的优先权,优先权高者进入运行队列进行执行。

这样直到所有进程的ALLTIME减为0,即所以进程运行完毕,程序结束。

2.实验代码

#include"iostream.h"

#defineM10//最多可以运行的进度数

typedefstruct

{

intID;//进程ID

intPRIORITY;//进程优先级

intCPUTIME;//进程已占用cpu时间

intALLTIME;//还需占用的CPU时间

intSTARTBLOCK;//进程的阻塞时间

intBLOCKTIME;//进程被阻塞的时间

intSTATE;//进程状态

intREACH;//进程是否到达,0为到达

intTIME;//进程开始运行时间

}PROCESS;//进程控制块PCB

voidmain()

{

inti,l,l1,flag=0,server[M],time1,max;

inttime;//时间片长度

inttotal=0;//运行时刻

intN;//进程数目

intturn=0;//进程周转时间

intwturn=0;//进程平均周转时间

PROCESSpro[M];//定义进程控制块

cout<

cout<<"程序中各个进程状态如下:

"<

cout<<"运行:

0阻塞:

1就绪:

2结束:

3未到达:

4"<

cout<<"请输入进程数:

";

cin>>N;

cout<<"请设置时间片长度:

";

cin>>time;

cout<<"请输入各进程初始状态:

"<

cout<<"IDPRIORITYREACHALLTIMESTARTBLOCKBLOCKTIME"<

//进程初始状态信息输入

for(i=0;i

{

pro[i].CPUTIME=0;

pro[i].TIME=0;

cin>>pro[i].ID>>pro[i].PRIORITY>>pro[i].REACH;

cin>>pro[i].ALLTIME>>pro[i].STARTBLOCK>>pro[i].BLOCKTIME;

server[i]=pro[i].ALLTIME;//服务时间设置

if(pro[i].REACH==0)//进程已经到达

pro[i].STATE=0;//初始状态下到达时即进入就绪队列

else

pro[i].STATE=4;//初始状态下未到达

}

do

{//各个时间片时刻进程信息显示输出

cout<

"<

cout<

cout<<"IDPRIORITYALLTIMESTARTBLOCKBLOCKTIMESTATE"<

for(i=0;i

{

cout<

cout<

cout<

}

total+=time;//当前时刻自加时间片时间

for(i=0;i

{

if(pro[i].STATE==4&&pro[i].REACH

//未到达或到达时间小于运行时间

pro[i].STATE=1;

}

for(i=0;i

{

time1=pro[i].ALLTIME;

if(pro[i].STATE==0)//运行状态

{

if(pro[i].ALLTIME<=time)

{

pro[i].ALLTIME=0;

pro[i].STATE=3;//运行完即结束状态

pro[i].TIME=total-time+time1;

}

else

{

pro[i].ALLTIME-=time;//未运行完则所需的CPU时间减少

pro[i].STARTBLOCK--;//未运行完则阻塞时间减少一个时间片

if(pro[i].STARTBLOCK==0)//阻塞时间为0则进入阻塞队列

{

pro[i].STATE=1;

pro[i].BLOCKTIME=time1;

pro[i].STARTBLOCK=time1;

}

pro[i].PRIORITY-=3;//优先数-3

pro[i].TIME=total;

}

}

if(pro[i].STATE==1)//阻塞状态

{

pro[i].BLOCKTIME--;

if(pro[i].BLOCKTIME==0)

pro[i].STATE=2;

pro[i].TIME=total;

}

if(pro[i].STATE==2)

{

pro[i].PRIORITY++;//优先数加1

pro[i].TIME=total;

}

}

max=-100;

l1=-1;

l=-1;

for(i=0;i

{//选择优先数最大的进程

if(pro[i].PRIORITY>max&&(pro[i].STATE==0||pro[i].STATE==2))

{

l=i;//标记进入就绪队列的进程

max=pro[i].PRIORITY;

}

if(pro[i].STATE==0)

l1=i;//进入就绪队列的进程用其标号标记

}

if(l!

=-1&&l!

=l1)

pro[l].STATE=0;//就绪状态

if(l1!

=-1)

pro[l1].STATE=2;//阻塞状态

//判断是否进程运行结束

flag=0;

for(i=0;i

{

if(pro[i].STATE!

=3)//未结束

{

flag=1;

break;

}

}

if(flag==0)

break;

}while

(1);//循环执行

cout<

"<

cout<

cout<<"IDPRIORITYALLTIMESTARTBLOCKBLOCKTIMESTATE"<

for(i=0;i

{

cout<

cout<

cout<<""<

cout<

}

cout<

"<

cout<<"进程号到达时间结束时间周转时间带权周转时间"<

for(i=0;i

{

cout<<""<

cout<

cout<<(float)(pro[i].TIME-pro[i].REACH)/server[i]<

turn+=pro[i].TIME-pro[i].REACH;//计算进程周转时间

wturn+=(pro[i].TIME-pro[i].REACH)/server[i];

}

cout<<"平均周转时间为:

"<<(float)turn/N<

cout<<"平均周转时间为:

"<<(float)wturn/N<

}

3.实验结果

(1)输入进程的初始状态

(2)各进程运行“动态优先权算法”的过程

(3)运用“动态优先权算法”运行各进程的结果:

4.实验结果分析

此程序可以对进程进行动态优先权调度,首先输入进程后,判断进程是否已到达,进程

(2)到达则进入就绪队列,然后判断进入就绪队列的进程的优先权,首先运行进程

(2),然后起ALLTIME减2,并且其优先权减3,;然后循环执行上述过程,若是继续执行上一过程的进程,则此进程优先数加1,而其他进入运行队列的进程的阻塞时间STARTBLOCK减1,当STARTBLOCK减为0时,此进程进入阻塞队列,而其优先数加1,如此循环下去。

就在例子中,当运行到27时,进程1结束运行,则其周转时间即为:

27-5(REACH)=22,所以其带全周转时间为:

22/7(ALLTIME)。

一次得出其他两个进程的周转及带权周转时间,并得出平均周转及带权周转时间,结果正确。

 

5.实验心得

本次综合实验,让我学到了很多东西。

加深了对所学的进程调度算法的理解,尤其是对“高优先权优先调度算法”中的“动态优先权调度算法”的理解。

在编码实现的过程中,也遇到了很多困难,对于动态优先权调度算法我已经基本掌握,但用编程语言实现起来却并不容易。

通过图书馆借阅书籍、问同学等方式都最终基本解决。

我觉得这样的综合实验很有必要,我们对于理论性知识的掌握,并不能代表我们的实践动手能力好,通过这次综合实验,我认识到了理论和实践的差距,在以后的学习中,应该更注重实践环节,才能真正的提高自己的能力。

对于以后的就业也是很有帮助的,为我们的以后找工作奠定基础。

通过对该算法程序的编程实现,也让我对C程序以及C++程序编程语言进行了更深入的学习,巩固了编程语言的知识点与技能,提高了自己的编程能力。

同时,我也发现了自己的很多不足,希望在以后的学习工作中,不断实践,不断地完善编程方法与编程技能的学习。

教师评价

评定项目

A

B

C

D

评定项目

A

B

C

D

算法正确

界面美观,布局合理

程序结构合理

操作熟练

语法、语义正确

解析完整

实验结果正确

文字流畅

报告规范

题解正确

其他:

 

评价教师签名:

年月日

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

当前位置:首页 > 人文社科 > 法律资料

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

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