处理器调度设计一个按时间片轮转法实现处理器调度的程序.docx
- 文档编号:25741043
- 上传时间:2023-06-12
- 格式:DOCX
- 页数:12
- 大小:146.79KB
处理器调度设计一个按时间片轮转法实现处理器调度的程序.docx
《处理器调度设计一个按时间片轮转法实现处理器调度的程序.docx》由会员分享,可在线阅读,更多相关《处理器调度设计一个按时间片轮转法实现处理器调度的程序.docx(12页珍藏版)》请在冰豆网上搜索。
处理器调度设计一个按时间片轮转法实现处理器调度的程序
实验一处理器调度
一、实验容
选择一个调度算法,实现处理器调度。
二、实验目的
在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。
当就绪进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。
本实习模拟在单处理器情况下的处理器调度,帮助学生加深了解处理器调度的工作。
三、实验题目
设计一个按时间片轮转法实现处理器调度的程序。
[提示]:
(1)假定系统有五个进程,每一个进程用一个进程控制块PCB来代表。
进程控制块的
格式为:
进程名
指针
要求运行时间
已运行时间
状态
其中,进程名——作为进程的标识,假设五个进程的进程名分别为Q1,Q2,Q3,Q4,Q5。
指针——进程按顺序排成循环队列,用指针指出下一个进程的进程控制块的首地址
最后一个进程的指针指出第一个进程的进程控制块首地址。
要求运行时间——假设进程需要运行的单位时间数。
已运行时间——假设进程已经运行的单位时间数,初始值为“0”。
状态——有两种状态,“就绪”和“结束”,初始状态都为“就绪”,用“R”表示。
当一个进程运行结束后,它的状态为“结束”,用“E”表示。
(2)每次运行所设计的处理器调度程序前,为每个进程任意确定它的“要求运行时间”。
(3)把五个进程按顺序排成循环队列,用指针指出队列连接情况。
另用一标志单元记录轮到运行的进程。
例如,当前轮到P2执行,则有:
标志单元
K2
K1
Q1
K2
Q2
K3
Q3
K4
Q4
K5
Q5
K2
K3
K4
K5
K1
2
3
1
2
4
1
0
0
0
0
R
R
R
R
R
PCB1
PCB2
PCB3
PCB4
PCB5
(4)处理器调度总是选择标志单元指示的进程运行。
由于本实习是模拟处理器调度的
功能,所以,对被选中的进程并不实际的启动运行,而是执行:
已运行时间+1
来模拟进程的一次运行,表示进程已经运行过一个单位的时间。
请同学注意:
在实际的系统中,当一个进程被选中运行时,必须置上该进程可以运
行的时间片值,以及恢复进程的现场,让它占有处理器运行,直到出现等待事件或
运行满一个时间片。
在这时省去了这些工作,仅用“已运行时间+1”来表示进程已
经运行满一个时间片。
(5)进程运行一次后,应把该进程的进程控制块中的指针值送到标志单元,以指示下一
个轮到运行的进程。
同时,应判断该进程的要求运行时间与已运行时间,若该进程
的要求运行时间已运行时间,则表示它尚未执行结束,应待到下一轮时再运行。
若
该进程的要求运行时间=已运行时间,则表示它已经执行结束,应指导它的状态修
改成“结束”(E)且退出队列。
此时,应把该进程的进程控制块中的指针值送到前
面一个进程的指针位置。
(6)若“就绪”状态的进程队列不为空,则重复上面的(4)和(5)的步骤,直到所有
的进程都成为“结束”状态。
(7)在所设计的程序中应有显示或打印语句,能显示或打印每次选中进程的进程名以及
运行一次后进程队列的变化。
(8)为五个进程任意确定一组“要求运行时间”,启动所设计的处理器调度程序,显示
或打印逐次被选中的进程名以及进程控制块的动态变化过程。
四.所用数据结构及符号说明
typedefstructPNode//PCB
{
structPNode*next;//定义指向下一个节点的指针
charname[10];//定义进程名,并分配空间
intAll_time;//定义总运行时间
intRuned_Time;//定义已运行时间
charstate;//定义进程状态Ready/End
}
*Proc;//指向该PCB的指针
intProcNum;//总进程数
五.流程图
六.源代码:
#include
#include
usingnamespacestd;
typedefstructPNode//PCB
{
structPNode*next;//定义指向下一个节点的指针
charname[10];//定义进程名,并分配空间
intAll_time;//定义总运行时间
intRuned_Time;//定义已运行时间
charstate;//定义进程状态Ready/End
}
*Proc;//指向该PCB的指针
intProcNum;//总进程数
//初始化就绪队列
voidlnitPCB(Proc&H)
{
cout<<"请输入总进程个数:
";
cin>>ProcNum;//进程总个数
intNum=ProcNum;
H=(Proc)malloc(sizeof(PNode));//建立头结点
H->next=NULL;
Procp=H;//定义一个指针
cout<<"总进程个数为"< cout< while(Num--) { p=p->next=(Proc)malloc(sizeof(PNode)); cout<<"进程名,总运行时间,已运行时间: "; cin>>p->name>>p->All_time>>p->Runed_Time; p->state='R'; p->next=NULL; } p->next=H->next; } //输入运行中的进程信息 voidDisplnfo(ProcH) { Procp=H->next; do { if(p->state! ='E')//如果该进程的状态不是End的话 { cout<<"进程名: "< "< "< p=p->next; } elsep=p->next; }while(p! =H->next);//整个进程链条始终完整,只是状态位有差异 } //时间片轮转法 voidSJP_Simulator(Proc&H) { cout< intflag=ProcNum;//记录剩余进程数 intround=0;//记录轮转数 Procp=H->next; while(p->All_time>p->Runed_Time) { round++; cout< p->Runed_Time++;//更改正在运行的进程的已运行的时间 Displnfo(H);//输出此时为就绪状态的进程的信息 if(p->All_time==p->Runed_Time) { //判断该进程是否结束 p->state='E'; flag--; cout< \n"; } p=p->next; while(flag&&p->All_time==p->Runed_Time) p=p->next;//跳过先前已结束的进程 } cout< } voidmain() { ProcH; lnitPCB(H);//数据初始化 Displnfo(H);//输出此刻的进程状态 SJP_Simulator(H);//时间片轮转法 system("pause"); } 七、测试数据与实验结果 八、结果分析与实验体会 时间片轮转算法中,系统将所有的就绪程序按先来先服务的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片(一个较小的时间单元)。 轮转法是一种剥夺式调度,当执行的时间片用完时,调度程序停止该进程的执行,并将它送往就绪队列的末尾;然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片,就这样一次又一次地执行,一次又一次地等待,直到该进程的任务完成。 时间片轮转调度算法特别适合于分时系统中使用。 该算法的难度和关键在于选择合理的时间片。 如果时间片过长,时间片轮转法就变成了先来先服务调度算法,如果时间片过小,则系统会花费大部分时间用于上下文切换。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 处理器 调度 设计 一个 按时 轮转 实现 程序