操作系统集中上机实验报告.docx

上传人:b****2 文档编号:537776 上传时间:2022-10-10 格式:DOCX 页数:28 大小:87.93KB
下载 相关 举报
操作系统集中上机实验报告.docx_第1页
第1页 / 共28页
操作系统集中上机实验报告.docx_第2页
第2页 / 共28页
操作系统集中上机实验报告.docx_第3页
第3页 / 共28页
操作系统集中上机实验报告.docx_第4页
第4页 / 共28页
操作系统集中上机实验报告.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

操作系统集中上机实验报告.docx

《操作系统集中上机实验报告.docx》由会员分享,可在线阅读,更多相关《操作系统集中上机实验报告.docx(28页珍藏版)》请在冰豆网上搜索。

操作系统集中上机实验报告.docx

操作系统集中上机实验报告

 

操作系统集中上机

实验报告

学生:

学号:

班级:

专业:

重庆邮电大学移通学院

2014年12月

目录

一、目的和要求1

二、实验内容1

1.设计进程控制块PCB的结构:

1

2.编写三种调度算法:

1

3.按要求输出结果:

1

三、银行家算法2

1.基本思想:

2

2.算法实现:

2

3.实验结果:

5

四、时间片轮转法5

1.基本思想:

5

2.算法实现:

6

3.实验结果:

7

五、非抢占式优先级调度算法7

1.基本思想:

7

2.算法实现:

8

3.实验结果:

9

六、程序完整实现10

七、集中上机总结22

八、参考文献22

一、目的和要求

进程调度是处理机管理的核心内容。

本实验要求用高级语言编写模拟进程调度程序,以便加深理解有关进程控制快、进程队列等概念,并体会和了解银行家算法、优先数算法和时间片轮转算法的具体实施办法。

二、实验内容

1.设计进程控制块PCB的结构:

进程名、进程优先数(或轮转时间片数)、进程已占用的CPU时间、进程到完成还需要的时间、进程的状态、当前队列指针等。

2.编写三种调度算法:

(1)银行家算法

(2)时间片轮转调度算法程序

(3)优先级调度算法程序

3.按要求输出结果:

输出结果中应包含进程名、优先级、轮数、CPU时间、需要时间、进程状态、计数器等信息。

三、银行家算法

1.基本思想:

银行家可以把一定数量的资金供多个用户周转使用,为保证资金的安全银行家规定:

1.当一个用户对资金的最大需求量不超过银行家现有的资金就要接纳该用户;

2.用户可以分期贷款,但贷的总数不能超过最大需求量;

3.当银行家现有的资金不能满足用户的沿需贷数时,对用户的贷款可推迟支付,但总能使用户在有限的时间里得到贷款;

4.当用户得到所需的全部资金后,一定能在有限的时间里归还所有的资金。

2.算法实现:

voidBank()/*银行家算法*/

{

inti,cusneed,flag=0;

charagain;

while

(1)

{

showdata();

cout<

input:

cout<<"请输入要申请资源的进程号:

"<

cin>>cusneed;

if(cusneed>num)

{

cout<<"没有该进程,请重新输入"<

gotoinput;

}

cout<<"请输入进程所请求的各资源的数量:

"<

for(i=0;i

{

cin>>REQUEST[cusneed][i];

}

for(i=0;i

{

if(REQUEST[cusneed][i]>NEED[cusneed][i])//如果用户选择的线程的第i个资源请求数>该线程该资源所需的数量

{

cout<<"您输入的请求数超过进程的需求量!

请重新输入!

"<

gotoinput;

}

if(REQUEST[cusneed][i]>AVAILABLE[i])//如果用户选择的线程的第i个资源请求数>系统现有的第i个资源的数量

{

cout<<"您输入的请求数超过系统有的资源数!

请重新输入!

"<

gotoinput;

}

}

for(i=0;i

{

AVAILABLE[i]-=REQUEST[cusneed][i];//系统可用资源减去申请了的

ALLOCATION[cusneed][i]+=REQUEST[cusneed][i];//线程被分配的资源加上已申请了的

NEED[cusneed][i]-=REQUEST[cusneed][i];//线程还需要的资源减去已申请得到的

}

if(Safe())//AVAILABLEALLOCATIONNEED变动之后,是否会导致不安全

{

cout<<"同意分配请求!

"<

}

else

{

cout<<"您的请求被拒绝!

"<

for(i=0;i

{

AVAILABLE[i]+=REQUEST[cusneed][i];

ALLOCATION[cusneed][i]-=REQUEST[cusneed][i];

NEED[cusneed][i]+=REQUEST[cusneed][i];

}

}

for(i=0;i

{

if(NEED[cusneed][i]<=0)

{

flag++;

}

}

if(flag==n)//如果该进程各资源都已满足条件,则释放资源

{

for(i=0;i

{

AVAILABLE[i]+=ALLOCATION[cusneed][i];

ALLOCATION[cusneed][i]=0;

NEED[cusneed][i]=0;

}

cout<<"线程"<

"<

flag=0;

}

for(i=0;i

{

FINISH[i]=false;

}

cout<<"您还想再次请求分配吗?

是请按y/Y,否请按其它键"<

cin>>again;

if(again=='y'||again=='Y')

{

continue;

}

break;

}

}

3.实验结果:

四、时间片轮转法

1.基本思想:

将CPU的处理时间划分成一个个时间片,就绪队列中的诸进程轮流运行一个时间片,当时间片结束时,就强迫运行进程让出CPU,该进程进入就绪队列,等待下一次调度,同时,进程调度又去选择就绪队列中的一个进程,分配给它一个时间片,以投入运行。

在轮转法中,时间片长度的选择非常重要,将直接影响系统开销和响应时间。

如果时间片长度很小,则调度程序剥夺处理机的次数频繁,加重系统开销;反之,如果时间片长度选择过长,比方说一个时间片就能保证就绪队列中所有进程都执行完毕,则轮转法就退化成先进先出算法。

2.算法实现:

voidRoundRun()/*时间片轮转调度算法*/

{

intflag=1;

GetFirst();

while(run!

=NULL)

{

Output();

while(flag)

{

run->count++;

run->cputime++;

run->needtime--;

if(run->needtime==0)/*进程执行完毕*/

{

run->state='F';

InsertFinish(run);

flag=0;

}

elseif(run->count==run->round)/*时间片用完*/

{

run->state='W';

run->count=0;/*计数器清零,为下次做准备*/

InsertTime(run);

flag=0;

}

}

flag=1;

GetFirst();

}

}

3.实验结果:

五、非抢占式优先级调度算法

1.基本思想:

该算法的基本思想是进程优先级高者优先调度,是一种常用的进程调度算法。

该算法的关键是如何确定优先数。

通常确定优先数的方法有两种,即静态法和动态法。

(1)静态优先权是在创建进程时确定的,其运行特征是优先数确定之后在整个进行运行期间不再改变。

确定静态优先权的依据有进程的类型、进程所使用的资源、进程的估计运行时间等因素。

进程所申请的资源越多,估计的运行时间越长,进程的优先权越低。

进程类型不同,优先权也不同,如系统进程的优先权高于用户进程的优先权。

(2)动态优先级是指在创建进程时,其运行特征是根据系统资源的使用情况和进程的当前特点确定一个优先权,在进程运行过程中再根据情况的变化调整优先权。

动态优先权一般根据进程占有CPU时间的长短、进程等待CPU时间的长短等因素确定。

占有处理机的时间越长,则优先权越低;等待时间越长,则优先权越高。

①静态优先级调度算法实现较为简单,但不能反映系统以及进程在运行过程中发生的各种变化。

而动态优先级法可以满足这个方面的需要。

②动态优先级调度算法的性能一般介于时间片轮转算法和先来先服务算法之间。

2.算法实现:

voidPriority()/*按照优先级调度,每次执行一个时间片*/

{

intflag=1;

GetFirst();

while(run!

=NULL)/*当就绪队列不为空时,则调度进程如执行队列执行*/

{

Output();/*输出每次调度过程中各个节点的状态*/

while(flag)

{

run->prio-=3;/*优先级减去三*/

run->cputime++;/*CPU时间片加一*/

run->needtime--;/*进程执行完成的剩余时间减一*/

if(run->needtime==0)/*如果进程执行完毕,将进程状态置为F,将其插入到完成队列*/

{

run->state='F';

run->count++;/*进程执行的次数加一*/

InsertFinish(run);

flag=0;

}

else/*将进程状态置为W,入就绪队列*/

{

run->state='W';

run->count++;/*进程执行的次数加一*/

InsertTime(run);

flag=0;

}

}

flag=1;

GetFirst();/*继续取就绪队列队头进程进入执行队列*/

}

}

3.实验结果:

六、程序完整实现

/*

操作系统实验之银行家算法、时间片轮转算法和优先级调度算法

ByVisualC++6.0

*/

#include

#include

#include

#include

typedefstructnode

{

charname[20];/*进程的名字*/

intprio;/*进程的优先级*/

intround;/*分配CPU的时间片*/

intcputime;/*CPU执行时间*/

intneedtime;/*进程执行所需要的时间*/

charstate;/*进程的状态,W--就绪态,R--执行态,F--完成态*/

intcount;/*记录执行的次数*/

structnode*next;/*链表指针*/

}

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

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1