进程调度实验实验报告.docx

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

进程调度实验实验报告.docx

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

进程调度实验实验报告.docx

进程调度实验实验报告

 

实验一进程调度实验

 

专业:

信息管理与信息系统

学号:

2014******

姓名:

陈*

实验日期:

2016年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)

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

当前位置:首页 > 初中教育 > 科学

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

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