操作系统实验时间片轮转.docx
- 文档编号:12785072
- 上传时间:2023-04-22
- 格式:DOCX
- 页数:9
- 大小:61.64KB
操作系统实验时间片轮转.docx
《操作系统实验时间片轮转.docx》由会员分享,可在线阅读,更多相关《操作系统实验时间片轮转.docx(9页珍藏版)》请在冰豆网上搜索。
操作系统实验时间片轮转
学号P7*******专业计算机科学与技术姓名陈帅
实验日期2017.11.2教师签字成绩
实验报告
【实验名称】轮转调度算法
【实验目的】
1、掌握轮转调度算法。
2、进一步认识如何实现处理器调度。
3、通过对进程调度算法的设计,深入理解进程调度的原理
【实验原理】
时间片轮转调度算法思想用C语言编程实现,数据结构为队列。
进程等待时间=进程开始运行时间-进程到达时间(即进程处于就绪态时间);
进程周转时间=进程结束时间-进程到达时间;
加权进程周转时间=进程周转时间/进程服务时间;
系统平均周转时间=进程周转时间之和/进程数;
系统平均带权周转时间=进程带权周转时间之和/进程数。
在分时系统中,最常用的是基于时间片的轮转算法调度算法。
该算法采用了非常公平的处理机分配方式,即让就绪队列上的每个进程每次运行一个时间片。
通过分配时间片的方式让进程获得处理机,若一个时间片未用完,正在运行的程序就已经完成,便将其从就绪队列删除,再调用队首进程,并分配时间片;在一个时间片未用完时,中断程序就会启动,将进程送至就绪队列的尾部。
【数据结构和符号说明】
数据结构:
structPCD//定义结构体
{
charname;//进程名
inta_time;//到达时间
ints_time;//服务时间
ints_time2;
intf_time;//完成时间
floatt_time;//周转时间
floatwt_time;//带权周转时间
intstate;//当前进程的状态
};
符号和函数说明
intCurrenttime=0;//当前时间
PCDs[5];//设置为5个进程
queue
intturnover(PCD&n)//求周转时间
floatwturnover(PCD&n)//求带权周转时间
程序流程图:
程序:
#include
#include
#defineMAX100
usingnamespacestd;
structPCD//定义结构体
{
charname;//进程名
inta_time;//到达时间
ints_time;//服务时间
ints_time2;
intf_time;//完成时间
floatt_time;//周转时间
floatwt_time;//带权周转时间
intstate;//当前进程的状态
};
intCurrenttime=0;
intturnover(PCD&n)//求周转时间
{
returnn.t_time=n.f_time-n.a_time;
}
floatwturnover(PCD&n)//求带权周转时间
{
returnn.wt_time=n.t_time/n.s_time;
}
intmain()
{
intt;
queue
q=queue
PCDs[5];
s[0].name='A';//初始化结构体数组
s[1].name='B';
s[2].name='C';
s[3].name='D';
s[4].name='E';
cout<<"请输入五个进程的到达时间:
\n";
for(inti=0;i<=4;i++)
{
cout<
";
cin>>s[i].a_time;
s[i].state=i;
}
cout<<"请输入五个进程的服务时间:
\n";
for(inti=0;i<=4;i++)
{
cout<
";
cin>>s[i].s_time;
s[i].s_time2=s[i].s_time;
}
cout<<"请输入时间片的大小:
\n";
cin>>t;
for(inti=0;i<5-1;i++)//将ABCDE的到达时间升序排列
for(intj=0;j<5-1;j++)
if(s[j].a_time>s[j+1].a_time)
swap(s[j],s[j+1]);
q.push(s[0]);//将第一个进程入队列
for(inti=1;i<5;i++)//5个都入队列
{
while(s[i].a_time>Currenttime+t)//当进程到达时间大于当前时间,执行队列中的进程
{
if(q.empty()==true)//到当前时间
Currenttime++;//队列中无进程
if(q.empty()!
=true)//队列前面有进程
{
if(q.front().s_time-t<=0)
{
Currenttime=Currenttime+q.front().s_time;
for(intj=0;j<5;j++)
if(s[j].state==q.front().state)
s[j].f_time=Currenttime;
q.pop();//队列中删除
}
else
{
Currenttime=Currenttime+t;
q.front().s_time-=t;
q.push(q.front());//队头放入队尾
q.pop();
}
}
}
q.push(s[i]);
if(q.front().s_time<=t)//如果有进程提前结束
{
Currenttime=Currenttime+q.front().s_time;//结束进程
for(intj=0;j<5;j++)
if(s[j].state==q.front().state)//设置进程的序号,如果在队列中与进程控制块中匹配
s[j].f_time=Currenttime;//终止时间
q.pop();
}
else
{
Currenttime=Currenttime+t;//继续执行
q.front().s_time-=t;
q.push(q.front());//入队后队头放入队尾
q.pop();
}
}
while(q.empty()!
=true)//所有进程全部入队
{
if(q.front().s_time<=t)
{
Currenttime=Currenttime+q.front().s_time;
for(inti=0;i<5;i++)
if(s[i].state==q.front().state)//去进程控制块中寻找,改变结束时间
s[i].f_time=Currenttime;
q.pop();
}
else
{
Currenttime=Currenttime+t;
q.front().s_time-=t;
q.push(q.front());
q.pop();
}
}
cout<<""<<"到达时间"<<"服务时间"<<"完成时间"<<"周转时间"<<"带权周转时间"< for(inti=0;i<=4;i++) { cout< cout< } doublesum=0; for(inti=0;i<5;i++) { sum+=s[i].wt_time; } cout<<"此算法平均带权周转时间为"< return0; } 截图及其说明: 在先前定义的5个进程,取名ABCDE 输入时间片大小,当时间片为1时,输出如下结果,程序正确 输入时间片大小,当时间片为1时,输出如下 结果,程序正确。 输入时间片为4,截图如下,程序验证正确,此算法平均周转时间为2.7. 【小结或讨论】 1、当时间片的过大的时候,轮转调度算法便会退化为先来先服务算法。 2、就绪队列是先插入到来的队列,再将未完成的队列送至队尾。 3、一开始在写程序是,为考虑到进程到达时间与当前时间的关系,即进程到达时间大于当前时间时,要继续执行队列中的进程,最终加上了。 4、通过本次实验,我对于进程调度中的时间片轮转调度算法有了更加深入的了解,通过时间片轮转调度的方式,可以有效的提高CPU的利用率,并且可以保证服务时间较长的进程也会被调度完成。 5、编写程序时遇到的一个比较核心的问题就是在某一段时间内就绪进程队列中没有进程,而等待就绪进程队列中的进程都未就绪,这时需要将当前时间逐步加一以找寻到到达的进程。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 时间 轮转
![提示](https://static.bdocx.com/images/bang_tan.gif)