天津理工大学操作系统实验报告实验一Word文档格式.doc
《天津理工大学操作系统实验报告实验一Word文档格式.doc》由会员分享,可在线阅读,更多相关《天津理工大学操作系统实验报告实验一Word文档格式.doc(6页珍藏版)》请在冰点文库上搜索。
0668036
实验时间
2012年12月3日第3、4节
实验地点
软件实验室7-216
批改意见
成绩
教师签字:
实验内容:
1.设定系统中有五个进程,每一个进程用一个进程控制块表示。
2.输入每个进程的“优先数”和“要求运行时间”。
3.为了调度方便,将五个进程按给定的优先数从大到小连成就绪队列。
用一单元指出队列首进程,用指针指出队列的连接情况。
4.处理机调度总是选队首进程运行。
采用动态优先数算法,进程每运行一次优先数就减“1”,同时将运行时间减“1”。
5.若某进程运行时间为零,则将其状态置为“结束”,且退出队列。
6.运行所设计程序,显示或打印逐次被选中进程的进程名,以及进程控制块的动态变化过程。
实验要求:
1.详细描述实验设计思想、程序结构及各模块设计思路;
2.详细描述程序所用数据结构及算法;
3.明确给出测试用例和实验结果;
4.为增加程序可读性,在程序中进行适当注释说明;
5.认真进行实验总结,包括:
设计中遇到的问题、解决方法与收获等;
6.实验报告撰写要求结构清晰、描述准确逻辑性强;
7.实验过程中,同学之间可以进行讨论互相提高,但绝对禁止抄袭。
【实验过程记录(源程序、测试用例、测试结果及心得体会等)】
设计思想:
1.模拟单CPU系统时间片切换、进程切换。
2.使用优先队列,让优先级高的进程位于队列顶端。
在每次时钟周期时,从优先队列队首取出优先级最高的进程,并使其运行一个时钟周期,然后将其优先级减1,已运行时间加1。
然后判断程序是否完成,如果未完成,则重新加入优先队列,参与时钟周期。
数据结构:
使用优先队列,以获得优先级最高程序。
源代码:
#include<
cstdio>
queue>
usingnamespacestd;
//进程控制块PCB
structPCB{
unsignedintpid;
//进程id
unsignedintpriority;
//进程优先级
unsignedintclaimTime;
//需要运行时间
unsignedintrunTime;
//已经运行时间
//构造函数
PCB(unsignedintid,unsignedintp,unsignedintct){
pid=id;
priority=p;
claimTime=ct;
runTime=0;
}
//运行当前进程一个时钟周期,并使进程优先级减1,已运行时间加1
voidrun(){
runTime++;
if(priority>
0)priority--;
//判断进程是否完成
boolisFinished(){
if(claimTime==runTime)
returntrue;
elsereturnfalse;
//重载<
运算符,以使用STL中的priority_queue
booloperator<
(constPCB&
p)const{
if(priority!
=p.priority)
returnpriority<
p.priority;
//比较优先级
else
//优先级相同的话快完成的任务先执行
returnclaimTime-runTime<
p.claimTime-p.runTime;
};
intmain(intargc,char**argv){
intclock=0;
priority_queue<
PCB>
q;
//优先队列
for(inti=0;
i<
5;
i++){
intp,t;
printf("
请输入pid=%u的进程的优先级(非负数):
\n"
i);
scanf("
%u"
&
p);
请输入pid=%u的进程的要求运行时间(非负数):
t);
pid=%u,优先级=%u,要求运行时间=%u\n\n"
i,p,t);
q.push(PCB(i,p,t));
while(!
q.empty()){//模拟单CPU
当前时钟%2d\t"
clock++);
PCBt=q.top();
q.pop();
pid=%u进程运行,优先级=%u,已运行时间=%u\n"
t.pid,t.priority,t.runTime);
t.run();
执行过后:
\tpid=%u,优先级=%u,已运行时间=%u\n"
if(!
t.isFinished())
q.push(t);
printf("
pid=%d进程结束\n"
t.pid);
printf("
程序结束\n"
);
return0;
}
测试用例:
进程pid
优先级
需要运行时间
4
3
1
2
5
6
执行结果:
实验问题:
1.在进程优先级相同时,调度结果不确定。
原因:
在优先级相同时,未进行相关处理。
解决:
添加优先级相同时判断逻辑,快结束的进程先调度
2.程序陷入死循环。
当忘记判断进程是否结束就加入队列。
判断进程是否结束,如果未结束,则继续参与调度,否则不参与。
实验总结:
要根据调度算法,选择合适的数据结构,以实现相应的调度程序。
在调度时,应明确:
哪个程序被调度,调度后优先级有什么变化,该进程是否还参与调度等问题。