进程调度实验实验报告.docx
《进程调度实验实验报告.docx》由会员分享,可在线阅读,更多相关《进程调度实验实验报告.docx(13页珍藏版)》请在冰豆网上搜索。
进程调度实验实验报告
实验一进程调度实验
专业:
信息管理与信息系统
学号:
2021******
:
*
实验日期:
2021年11月11日
一、实验目的
通过本实验,采用动态优先权优先的调度算法编写和调试一个简单的进程调度程序,加深理解了有关进程控制块、进程队列的概念,并体会了优先权调度算法的具体实施方法。
二、实验要求
用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解.
三、实验方法容
1.算法设计思路〔流程图〕
2.算法中用到的数据构造
〔1〕首先定义一个构造体,用以保存一个进程的各种信息,最后一个指针便于将所有进程形成一个链表
typedefstructpcb{
intid;
intarriveTime;//到达时间
intpriority;
intcpuTime;
intallTime;
intstartBlock;
intblockTime;
charstate;
structpcb*next;
}PCB;
〔2〕接着建立一个链表存储所有进程,以构造体PCB为节点〔头节点为空节点,从第二个节点开场存储数据〕。
链表建立过程如下:
inti=0;
PCB*head,*p1,*p2;
head=(PCB*)malloc(sizeof(PCB));//创立链表头
p2=head;
//三个进程
for(i=0;i<3;i++){
p1=(PCB*)malloc(sizeof(PCB));
//设置进程的初始状态,各个数据已经保存在对应的各个数组中
p1->id=pcId[i];
p1->priority=priority[i];
p1->cpuTime=cpuTime[i];
p1->allTime=allTime[i];
p1->startBlock=startBlock[i];
p1->blockTime=blockTime[i];
p1->state='W';//初始状态为就绪
p2->next=p1;
p2=p1;
}
p2->next=NULL;//表尾指针设为空指针,表示链表完毕
3.主要模块〔函数名〕
如下:
(1)创立初始队列,用链表存储
PCB*createLink(){};
〔2〕输出链表中所有进程的状态
voidprintLink(PCB*head,inttime);
〔3〕判断是否所有进程都已完成
intisFinish(PCB*head);
〔4〕判断是否所有未完成的进程都处于阻塞状态
intisBlock(PCB*head);
〔5〕获得当前时刻优先权最高且处于就绪状态的进程
PCB*getHighPriority(PCB*head);
〔6〕运行〔调度函数,在这里展示所有代码〕
voidrun(PCB*head){};
所有代码如下:
#include
#include
//三个进程的初始状态
intpcId[]={0,1,2};
intpriority[]={6,8,5};
intcpuTime[]={0,0,0};
intallTime[]={7,7,6};
intstartBlock[]={6,4,2};
intblockTime[]={3,8,6};
typedefstructpcb{
intid;
intarriveTime;//到达时间
intpriority;
intcpuTime;
intallTime;
intstartBlock;
intblockTime;
charstate;
structpcb*next;
}PCB;
//创立初始队列,用链表存储
PCB*createLink(){
//intpcNum=0;//进程个数
inti=0;
PCB*head,*p1,*p2;
head=(PCB*)malloc(sizeof(PCB));//创立链表头
p2=head;
for(i=0;i<3;i++){
p1=(PCB*)malloc(sizeof(PCB));
p1->arriveTime=i;//进程到达时间为输入时间
//设置进程的初始状态
p1->id=pcId[i];
p1->priority=priority[i];
p1->cpuTime=cpuTime[i];
p1->allTime=allTime[i];
p1->startBlock=startBlock[i];
p1->blockTime=blockTime[i];
p1->state='W';//初始状态为就绪w
p2->next=p1;
p2=p1;
}
p2->next=NULL;//表尾指针设为空指针,表示链表完毕
returnhead;
}
//输出所有队列中所有进程的状态
voidprintLink(PCB*head,inttime){
printf("当前时刻为:
%d\n",time);
printf("IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE\n");
PCB*p1=head->next;
while(p1!
=NULL){
printf("%d%d%d%d%d%d%c\n"
p1->id,p1->priority,p1->cpuTime,p1->allTime,p1->startBlock,p1->blockTime,p1->state);
p1=p1->next;//指向下一个节点
}
printf("\n");//空行
return;
}
//判断是否所有进程都已完成
intisFinish(PCB*head){
PCB*p1=head->next;
while(p1!
=NULL){
if(p1->state!
='F')//如果有未完成的进程,返回0
return0;
p1=p1->next;
}
return1;//所有进程都完成了,返回1
}
//判断是否所有未完成的进程都处于阻塞状态
intisBlock(PCB*head){
PCB*p1=head->next;
while(p1!
=NULL){
if(p1->state!
='F'&&p1->state!
='B')//如果有未阻塞的进程,返回0
return0;
p1=p1->next;
}
return1;//所有进程都阻塞了,返回1
}
//获得当前时刻优先权最高且处于就绪状态的进程
PCB*getHighPriority(PCB*head){
intpri=-32768;//优先权
PCB*p1,*p2=NULL;
p1=head->next;
while(p1!
=NULL){
if(p1->state=='W'&&p1->priority>pri){
pri=p1->priority;//获得优先权更高的进程
p2=p1;
}
p1=p1->next;
}
returnp2;//返回优先权最高的进程
}
//运行
voidrun(PCB*head){
inttime=0;//时刻
inti;
intmark;
PCB*p1,*p2;
while(!
isFinish(head)){
mark=0;
p1=getHighPriority(head);//p1所指进程优先权最高,获得运行资格
if(p1!
=NULL){
p1->state='R';
}
for(i=1;i<=2;i++){//运行两个时间片
p2=head->next;
while(p2!
=NULL){
if(p2==p1&&p2->state!
='F'){
p2->priority-=2;//进程每运行一个时间片,优先权减2。
p2->cpuTime++;
p2->allTime--;
if(p2->allTime==0){
p2->state='F';
mark=1;
}
elseif(p2->cpuTime%p2->startBlock==0){
p2->state='B';//如果进程运行了startBlock个时间片,进入阻塞状态
mark=1;
}
}
elseif(p2!
=p1&&p2->state!
='F'){
if(p2->state=='W'){
p2->priority++;//进程在就绪队列中呆一个时间片,优先权增加1
}
if(p2->state=='B'){
p2->blockTime--;
if(p2->blockTime==0){
p2->state='W';//阻塞时间完毕,回到就绪队列
p2->blockTime=blockTime[p2->id];
}
}
}
p2=p2->next;
}
time++;
printLink(head,time);
if(isBlock(head))
break;
if(mark==1)
break;
}
if(p1!
=NULL&&p1->state=='R'){
p1->state='W';
}
}
}
//主函数
intmain(){
PCB*head;
head=createLink();
printLink(head,0);
run(head);
return0;
}
四、实验结果
1.执行结果:
当前时刻为:
0
IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE
060763W
180748W
250626W
当前时刻为:
1
IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE
070763W
161648R
260626W
当前时刻为:
2
IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE
080763W
142548R
270626W
当前时刻为:
3
IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE
061663R
152548W
280626W
当前时刻为:
4
IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE
042563R
162548W
290626W
当前时刻为:
5
IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE
052563W
172548W
271526R
当前时刻为:
6
IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE
062563W
182548W
252426B
当前时刻为:
7
IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE
072563W
163448R
252425B
当前时刻为:
8
IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE
082563W
144348B
252424B
当前时刻为:
9
IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE
063463R
144347B
252423B
当前时刻为:
10
IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE
044363R
144346B
252422B
当前时刻为:
11
IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE
025263R
144345B
252421B
当前时刻为:
12
IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE
006163B
144344B
252426W
当前时刻为:
13
IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE
006162B
144343B
233326R
当前时刻为:
14
IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE
006161B
144342B
214226B
当前时刻为:
15
IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE
006163W
144341B
214225B
当前时刻为:
16
IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE
016163W
144348W
214224B
当前时刻为:
17
IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE
026163W
125248R
214223B
当前时刻为:
18
IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE
036163W
106148R
214222B
当前时刻为:
19
IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE
017063F
116148W
214221B
当前时刻为:
20
IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE
017063F
1-17048F
214226W
当前时刻为:
21
IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE
017063F
1-17048F
2-15126R
当前时刻为:
22
IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE
017063F
1-17048F
2-36026F
2.结果分析
(1)每对一个进程进展一次操作〔优先级加减、CPUtime加减等〕后,就要判断是否要进展状态改变。
情况如下:
:
运行状态的进程运行一个时间片之后,CPUTime加1,AllTime加1,此时判断AllTime是否为零,为零那么该进程状态设为F〔完成〕,否那么不变;再判断CPUTime对startTime求余是否为零,为零那么该进程状态设为B〔阻塞〕,否那么不变;
:
阻塞状态的进程经过一个时间片之后,blockTime减1,此时判断blockTime是否为零,为零那么该进程状态设为W〔就绪〕,否那么不变;
(2)假设所有未完成的进程都进入阻塞状态,那么按照对阻塞进程的操作进展两个时间片。
再判断是否有进程可以获得运行资格。
3.实验总结
(1)通过本实验,我更加理解了什么是进程,也对高优先级调度方法有了更深层次的了解。
借助本实验,我也加深了对其他调度算法理解。
(2)本次试验,我通过实践,加深了理论知识。
通过理论与实践的结合,更好地掌握了知识。
这也是以后要继续实行的学习方法。
C语言编程技能与操作系统知识的相结合,让我在提高编程能力的同时,加强了与实际问题的结合,提高了对实际问题的解决能力。
教育之通病是教用脑的人不用手,不教用手的人用脑,所以一无所能。
教育革命的对策是手脑联盟,结果是手与脑的力量都可以大到不可思议。
(3)