进程调度+存储管理+磁盘调度++银行家算法+资料系统Word文档下载推荐.docx
《进程调度+存储管理+磁盘调度++银行家算法+资料系统Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《进程调度+存储管理+磁盘调度++银行家算法+资料系统Word文档下载推荐.docx(26页珍藏版)》请在冰豆网上搜索。
四.实验过程:
(1)输入:
进程流文件(1.txt),其中存储的是一系列要执行的进程,每个作业包括四个数据项:
进程名
进程状态(1就绪
2等待
3运行)
所需时间
优先数(0级最高)
进程0
1
50
2
进程1
10
4
进程2
15
进程3
3
28
5
进程4
19
进程5
8
7
输出:
进程执行流等待时间,平均等待时间
(2)程序代码
#include<
stdio.h>
#include<
string.h>
iostream.h>
stdlib.h>
constintblock_time=4;
//定义时间片的长度为4秒constintMAXPCB=100;
//定义最大进程数
//定义进程结构体typedefstructnode
{
intid;
intstatus;
intalltime;
intpriority;
intfinished;
intwait_time;
node*next;
}pcb;
pcbpcbs[MAXPCB];
intcount;
inti;
//初始化函数voidinitial()
cout<
<
"
请输入进程数:
"
;
cin>
>
i;
count=i;
for(i=0;
i<
MAXPCB;
i++)
pcbs[i].id=i+1;
pcbs[i].status=1;
pcbs[i].time=random(20);
pcbs[i].priority=random
(2);
pcbs[i].finished=0;
pcbs[i].wait_time=0;
}
//优先数调度算法voidorder()
voidpri()
if(count!
=0){}
intpassed_time=0;
inttotal;
intqueue[MAXPCB];
intcurrent_privilege=1000;
quantity;
current_privilege=1000;
for(j=0;
j<
j++)
if((pcbs[j].finished==0)&
&
(pcbs[j].privilege<
current_privilege))
{p=j;
current_privilege=pcbs[j].privilege;
queue[i]=p;
pcbs[p].finished=1;
pcbs[p].wait_time+=passed_time;
passed_time+=pcbs[p].time;
//输出优先数调度执行流cout<
endl<
***********************************************************"
endl;
优先数调度执行流:
进程名等待时间"
"
pcbs[queue[i]].name<
pcbs[queue[i]].wait_time<
total=0;
{total+=pcbs[i].wait_time;
}
总等待时间:
total<
平均等待时间:
total/quantity<
//主函数voidmain()
intflag;
version();
initial();
flag=readData();
if(flag==1)
{FIFO();
init();
privilege();
init();
timer();
(3)运行结果:
输入进程流文件名1.txt即可得出以下输出结果:
实验二银行家算法
一、实验目的
死锁会引起计算机工作僵死,因此操作系统中必须防止。
本实验的目的在于让学生独立的使用高级语言编写和调试一个系统动态分配资源的简单模拟程序,了解死锁产生的条件和原因,并采用银行家算法有效地防止死锁的发生,以加深对课堂上所讲授的知识的理解。
二、实验要求
设计有n个进程共享m个系统资源的系统,进程可动态的申请和释放资源,系统按各进程的申请动态的分配资源。
系统能显示各个进程申请和释放资源,以及系统动态分配资源的过程,便于用户观察和分析;
三、数据结构
1.可利用资源向量Available ,它是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源的数目,其初始值是系统中所配置的该类全部可用资源数目。
其数值随该类资源的分配和回收而动态地改变。
如果Available(j)=k,标是系统中现有Rj类资源k个。
2.最大需求矩阵Max,这是一个n×
m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。
如果Max(i,j)=k,表示进程i需要Rj类资源的最大数目为k。
3.分配矩阵Allocation,这是一个n×
m的矩阵,它定义了系统中的每类资源当前一分配到每一个进程的资源数。
如果Allocation(i,j)=k,表示进程i当前已经分到Rj类资源的数目为k。
Allocationi表示进程i的分配向量,有矩阵Allocation的第i行构成。
4.需求矩阵Need,这是一个n×
m的矩阵,用以表示每个进程还需要的各类资源的数目。
如果Need(i,j)=k,表示进程i还需要Rj类资源k个,才能完成其任务。
Needi表示进程i的需求向量,由矩阵Need的第i行构成。
上述三个矩阵间存在关系:
Need(i,j)=Max(i,j)-Allocation(i,j);
四、银行家算法
Requesti是进程Pi的请求向量。
Requesti(j)=k表示进程Pi请求分配Rj类资源k个。
当Pi发出资源请求后,系统按下述步骤进行检查:
1.如果Requesti≤Need,则转向步骤2;
否则,认为出错,因为它所请求的资源数已超过它当前的最大需求量。
2.如果Requesti≤Available,则转向步骤3;
否则,表示系统中尚无足够的资源满足Pi的申请,Pi必须等待。
3.系统试探性地把资源分配给进程Pi,并修改下面数据结构中的数值:
Available=Available-Requesti
Allocationi=Allocationi+Requesti
Needi=Needi-Requesti
4.系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。
如果安全才正式将资源分配给进程Pi,以完成本次分配;
否则,将试探分配作废,恢复原来的资源分配状态,让进程Pi等待。
假定系统有5个进程(p0,p1,p2,p3,p4)和三类资源(A,B,C),各种资源的数量分别为10,5,7,在
T0时刻的资源分配情况如下图:
Max Allocation Need Available
ABC A B C A B C ABC
P0 7 5 3 0 1 0 7 4 3 3 3 2
(2 3 0)
P1
(3
2)
(0
0)
P2
9
6
P3
P4
五、安全性算法
1.设置两个向量。
Work:
它表示系统可提供给进程继续运行的各类资源数目,它包含m个元素,开始执行安全性算法时,Work=Available。
Finish:
它表示系统是否有足够的资源分配给进程,使之运行完成,开始Finish(I)=false;
当有足够资源分配给进程Pi时,令Finish(i)=true;
2.从进程集合中找到一个能满足下述条件的进程。
Finish(i)==false;
Needi≤work;
如找到则执行步骤3;
否则,执行步骤4;
3.当进程Pi获得资源后,可顺利执行直到完成,并释放出分配给它的资源,故应执行
Work=work+AllocationiFinish(i)=true;
转向步骤2;
4.若所有进程的Finish(i)都为true,则表示系统处于安全状态;
否则,系统处于不安全状态。
六、 系统流程图
开始
输入资源数m, 及各类资源总数,初始
输入进程数
结束
Y
i≤n
N
max≤资源
i加1
输入进程i的最大需求向量
初始化need
提示错误重新
该进程的Need
输入该进程的资源请求量
Need矩阵为
任选一个进程作为
该进程已运行
所有进程运行
调用银行家算法,及安全性算法,完成分配,
Y
七.银行家算法程序代码
conio.h>
iostream>
usingnamespacestd;
typedefstructMax1 //资源的最大需求量
intm_a;
intm_b;
intm_c;
}Max;
typedefstructAllocation1 //已分配的资源数
inta_a;
inta_b;
inta_c;
}Allocation;
typedefstructNeed1 //还需要的资源数