操作系统实验报告 死锁的避免

合集下载

预防死锁的四种方法

预防死锁的四种方法

预防死锁的四种方法
在程序设计中,死锁是一种常见的问题,它会导致程序无法正常运行,影响系统的效率和安全性。

因此,我们需要采取一些方法来预防
死锁的发生。

下面介绍四种预防死锁的方法。

1. 避免使用多个锁
如果我们在程序中使用了多个锁,就会增加死锁的可能性。

因此,我
们可以采用一些技巧来避免使用多个锁。

比如,我们可以采用粗粒度锁,将多个细粒度锁合并成一个大锁,这样可以减少死锁的可能性。

2. 按照规定的顺序申请锁
为了避免死锁,我们可以规定一个申请锁的顺序,在申请锁的时候按
照规定的顺序进行申请。

比如,如果有两个线程需要访问两个资源A、B,我们可以规定线程1先申请资源A,再申请资源B,线程2先申请
资源B,再申请资源A。

3. 设置超时时间
当一个进程在申请锁的时候,如果一直没有得到锁,就会一直等待,
这时候就会增加死锁的可能性。

为了避免这种情况的发生,我们可以
设置一个超时时间,在规定的时间内如果没有得到锁就主动放弃等待,重新进行尝试。

4. 统一管理锁资源
将锁资源的管理进行统一管理,可以更好地避免死锁。

比如,我们可以通过一个锁服务来统一管理所有的锁资源,同时,对于不同的锁资源可以设置不同的优先级,这样就可以更好地避免死锁的发生。

综上所述,针对死锁的问题,我们需要在程序设计中采取一些措施来进行预防。

以此,我们可以保证系统的效率和安全性,更好地应对复杂的应用场景。

操作系统实验报告-死锁的避免

操作系统实验报告-死锁的避免

操作系统实验报告-死锁的避免操作系统实验(二)死锁的避免1.实验内容使用C++实现模拟随机算法和银行家算法2.实验目的(1)了解死锁的产生原因(随机算法)(2)理解死锁的解决办法(银行家算法)3.实验题目使用随机算法和银行家算法设计程序4.程序流程图主要过程流程图银行家算法流程图安全性算法流程图5.程序代码和运行结果#include <stdio.h>#include<stdlib.h> typedef struct{int A;int B;int C;}RES;#define false 0#define true 1//系统中所有进程数量#define PNUMBER 3//最大需求矩阵RES Max[PNUMBER];//已分配资源数矩阵RES Allocation[PNUMBER];//需求矩阵RES Need[PNUMBER];//可用资源向量RES Available={0,0,0};//安全序列int safe[PNUMBER];void setConfig(){int i=0,j=0;printf("================开始手动配置资源==================\n");//可分配资源printf("输入可分配资源\n");scanf("%d%d%d",&Available.A,&Available.B,&Available.C);//最大需求矩阵MAXprintf("输入最大需求矩阵%dx%d\n",PNUMBER,PNUMBER );for (i=0;i<PNUMBER;i++){scanf("%d%d%d",&Max[i].A,&Max[i].B,&Max[i].C);}//已分配矩阵Allocprintf("输入已分配矩阵%dx%d\n",PNUMBER,PNUMBER);for (i=0;i<PNUMBER;i++){scanf("%d%d%d",&Allocation[i].A,&Allocation[i].B,&Allocation[i].C);}//需求矩阵printf("输入需求矩阵%dx%d\n",PNUMBER,PNUMBER);for (i=0;i<PNUMBER;i++){scanf("%d%d%d",&Need[i].A,&Need[i].B,&Need[i].C);}printf("================结束配置资源==================\n");}void loadConfig(){FILE *fp1;if ((fp1=fopen("config.txt","r"))==NULL){printf("没有发现配置文件,请手动输入\n");setConfig();}else{int i=0;printf("发现配置文件,开始导入..\n");//可分配资源fscanf(fp1,"%d%d%d",&Available.A,&Available.B,&Available.C);//最大需求矩阵MAXfor (i=0;i<PNUMBER;i++){fscanf(fp1,"%d%d%d",&Max[i].A,&Max[i].B,&Max[i].C);}//已分配矩阵Allocfor (i=0;i<PNUMBER;i++){fscanf(fp1,"%d%d%d",&Allocation[i].A,&Allocation[i].B,&Allocation[i].C);}//需求矩阵for (i=0;i<PNUMBER;i++){fscanf(fp1,"%d%d%d",&Need[i].A,&Need[i].B,&Need[i].C);}}}//试探分配void ProbeAlloc(int process,RES *res){Available.A -= res->A;Available.B -= res->B;Available.C -= res->C;Allocation[process].A += res->A;Allocation[process].B += res->B;Allocation[process].C += res->C;Need[process].A -= res->A;Need[process].B -= res->B;Need[process].C -= res->C;}//若试探分配后进入不安全状态,将分配回滚void RollBack(int process,RES *res){Available.A += res->A;Available.B += res->B;Available.C += res->C;Allocation[process].A -= res->A;Allocation[process].B -= res->B;Allocation[process].C -= res->C;Need[process].A += res->A;Need[process].B += res->B;Need[process].C += res->C;}//安全性检查bool SafeCheck(){RES Work;Work.A = Available.A;Work.B = Available.B;Work.C = Available.C;bool Finish[PNUMBER] = {false,false,false};int i;int j = 0;for (i = 0; i < PNUMBER; i++){//是否已检查过if(Finish[i] == false){//是否有足够的资源分配给该进程if(Need[i].A <= Work.A && Need[i].B <= Work.B && Need[i].C <= Work.C){//有则使其执行完成,并将已分配给该进程的资源全部回收Work.A += Allocation[i].A;Work.B += Allocation[i].B;Work.C += Allocation[i].C;Finish[i] = true;safe[j++] = i;i = -1; //重新进行遍历}}}//如果所有进程的Finish向量都为true则处于安全状态,否则为不安全状态for (i = 0; i < PNUMBER; i++){if (Finish[i] == false){return false;}}return true;}//资源分配请求bool request(int process,RES *res){//request向量需小于Need矩阵中对应的向量if(res->A <= Need[process].A && res->B <= Need[process].B && res->C <=Need[process].C){//request向量需小于Available向量if(res->A <= Available.A && res->B <= Available.B && res->C <= Available.C){//试探分配ProbeAlloc(process,res);//如果安全检查成立,则请求成功,否则将分配回滚并返回失败if(SafeCheck()){return true;}else{printf("安全性检查失败。

操作系统银行家算法(避免死锁)实验报告

操作系统银行家算法(避免死锁)实验报告

操作系统实验:银行家算法姓名:李天玮班级:软工1101 学号:201126630117 实验内容:在windows系统中实现银行家算法程序。

实现银行家算法所用的数据结构:假设有5个进程3类资源,则有如下数据结构:1.MAX[5,3] 5个进程对3类资源的最大需求量。

2.A V AILABLE[3]系统可用资源数。

3.ALLOCATION[5,3]5个进程已经得到3类资源的资源量。

4.NEED[5,3]5个进程还需要3类资源的资源量。

银行家算法:设进程1提出请求Request[N],则银行家算法按如下规则进行判断。

(1)如果Request[N]<=NEED[1,N],则转(2);否则,出错。

(2)如果Request[N]<=A V ALIABLE,则转(3);否则,出错。

(3)系统试探非配资源,修改相关数据。

A V ALIABLE=A V ALIABLE-REQUESTALLOCATION=ALLOCA TION+REQUESTNEED=NEED-REQUEST(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。

安全性检查:(1)设置两个工作向量WORK=A V AILABLE;FINISH[M]=FALSE.(2)从晋城集合中找到一个满足下述条件的进程,FINISH[i]=FALSENEED<=WORK如找到,执行(3);否则,执行(4)。

(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。

WORK=WORK+ALLOCATIONFINISH[i]=TRUEGOTO(2)(4)如所有进程FINISH[M]=TRUE,则表示安全;否则系统不安全。

1.用init()函数对于数据的初始化关键代码:#define M 5#define N 3void init(){cout<<"请输入5个进程对3类资源最大资源需求量:"<<endl;for(int i=0;i<M;i++){for(int j=0;j<N;j++){cin>>MAX[i][j];}//cout<<endl;}cout<<"请输入系统可用的资哩源数:"<<endl;for(int j=0;j<N;j++){cin>>AVAILABLE[j];}cout<<"请输入5个进程已经-的到的3类资源的资源量:"<<endl;for(int i=0;i<M;i++){for(int j=0;j<N;j++){cin>>ALLOCATION[i][j];}//cout<<endl;}cout<<"请?输?入?5个?进?程ì还1需è要癮3类え?资哩?源′的?资哩?源′量?:"<<endl;for(int i=0;i<M;i++){for(int j=0;j<N;j++){cin>>NEED[i][j];}//cout<<endl;}}// Stack around the variable 'AVAILABLE' was corrupted.显示数据详细信息进行测试输入一号进程号,并给需要申请资源设定为{1,0,2}检验错误输入时候的报错信息检验当再次申请0号资源并申请资源数目为{0,2,0}时,系统提示系统不安全申请不成功。

操作系统的死锁避免

操作系统的死锁避免

操作系统的死锁避免操作系统是计算机系统中负责管理和控制各种软硬件资源的核心组件。

在多任务环境下,操作系统需要合理地分配和管理资源,以确保系统的高效运行。

然而,由于资源的有限性和多任务并发执行的特点,死锁问题成为操作系统设计中需要解决的重要挑战之一。

一、死锁的定义和原因探究1. 死锁概述死锁是指多个进程在争夺系统资源时,由于彼此之间的资源相互独占和相互等待,导致程序无法继续执行的状态。

在死锁状态下,无论如何分配资源,都无法满足所有进程的资源需求。

因此,死锁会导致系统的停滞和资源的浪费。

2. 死锁的原因死锁产生的根本原因是进程的资源争夺和资源等待。

在多任务环境中,进程可能会同时请求多个资源,并且在等待某个资源满足条件时可能会主动释放已获取的资源。

然而,如果不加限制和控制,进程可能会陷入相互等待的死循环,导致死锁的发生。

二、死锁避免的方法和策略为了解决死锁问题,操作系统设计中采用了多种避免死锁的方法和策略。

下面介绍几种常见的死锁避免方法:1. 资源分配策略操作系统可以通过限制资源的分配数量、调整调度策略以及实施优先级控制等方式,来避免死锁的发生。

例如,可以采用银行家算法来预测进程的资源需求,只有在分配资源后仍然能够满足所有进程的需求时才进行分配。

2. 进程资源申请策略操作系统可以要求进程一次性申请所有资源,充分利用资源的可重用性,并在资源不足时进行等待,以避免死锁。

这种策略可以有效减少进程的等待时间,提高系统的吞吐量。

3. 死锁检测与恢复策略操作系统设计中的死锁检测和恢复策略可以帮助系统及时发现死锁的存在,并采取相应措施进行恢复。

一种常见的策略是使用资源分配图来进行死锁检测,如果存在环路则表示死锁的发生,操作系统可以通过抢占资源或终止进程等方式解除死锁。

4. 死锁预防策略操作系统可以通过改变资源分配的策略和限制条件,从根本上预防死锁的发生。

例如,可以引入资源剥夺策略,即在进程使用资源时,如果该资源被其他进程请求,则操作系统可以强制剥夺该资源并分配给其他请求进程。

实验报告(死锁的避免)

实验报告(死锁的避免)
允许进程动态地申请资源和释放资源,系统按进程的申请动态地分配资源。程序能够在进程提出资源申请后判断系统是否处于安全状态,如果安全则打印资源分配表和安全序列;如果不安全则输出不能分配的提示。
三、程序设计和说明
1.算法描述
2.算法实现
四、实课程实验报告
实验名称:死锁的避免
姓名:
学号:
专业:
五邑大学计算机学院
一、实验目的
加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
二、实验内容
编写一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用银行家算法有效地避免死锁的发生。实验要求设计一个有三类资源A、B、C的系统,它们的资源总量分别为10、5、7,资源由五个进程p0、p1、p2、p3、p4共享。假设当前的资源分配状态为:

实验五 死锁避免的算法

实验五  死锁避免的算法

实验五 死锁避免的算法【实验目的】1、 了解死锁避免的原理。

2、 研究银行家算法的实现方法。

【实验内容】编程实现银行家算法。

【实验报告】1、 列出调试通过程序的清单,并附上文档说明。

2、 总结上机调试过程中所遇到的问题和解决方法及感想。

【实验相关资料】一、死锁概念多个并发进程,每个进程占有部分资源,又都等待其它进程释放所占资源,造成均不能向前推进的现象。

二、死锁的避免死锁避免原理就是使系统始终处于安全状态。

安全状态:所谓安全状态是指能够找到一个安全序列,系统能够按照这个安全序列依次为进程分配资源,使所有进程都能执行完毕,如果找不到这样的安全序列,系统就处于不安全状态。

三、银行家算法银行家算法要求每个进程的最大资源需求,其基本思想是:始终保持系统处于安全状态,当进程提出资源请求时,系统先进行预分配,再判断系统分配后是否仍然处于安全状态。

如果仍然处于安全状态,就进行实际分配;如果处于不安全状态,则拒绝该进程的资源请求。

四、银行家算法相关数据结构1. 最大需求矩阵:d (t)=⎪⎪⎪⎪⎪⎭⎫ ⎝⎛⋅⋅⋅⋅nm n n m m d d d d d d d d d .........212222111211 其中,行表示进程,列表示资源,如:d ij =5表示第 i 个进程最多需要j 类资源5个。

2. 资源分配矩阵:a(t)=⎪⎪⎪⎪⎪⎭⎫ ⎝⎛⋅⋅⋅⋅nm n n m m a a a a a a a a a .........212222111211 元素a ij =8表示分配给第 i 进程8个j 类资源。

3. 需求矩阵:b(t)=⎪⎪⎪⎪⎪⎭⎫ ⎝⎛⋅⋅⋅⋅nm n n m m b b b b b b b b b .........212222111211 元素b ij =3表示第i 类进程还需要3个j 类资源。

最大需求矩阵=分配矩阵+需求矩阵,即d(t)=a(t)+b(t)。

操作系统与死锁避免

操作系统与死锁避免操作系统是现代计算机系统中至关重要的组成部分,它负责管理和协调计算机硬件和软件资源,保障计算机系统正常运行。

在操作系统的设计与实现中,解决死锁问题是一个非常重要的议题。

一、什么是死锁?死锁是指在多个进程或线程竞争有限的资源时出现的一种阻塞状态,每个进程都在等待其他进程释放所需的资源,从而陷入无法继续执行的僵局。

二、死锁产生的原因1. 资源竞争:当多个进程同时请求相同的资源时,若这些资源只能被一个进程占用,则有可能发生死锁。

2. 进程推进顺序不当:若进程在申请资源时不按照预定的顺序申请,也可能导致死锁的发生。

3. 资源分配不足:系统的资源总量不能满足所有进程的需求,没有足够的资源分配给每个进程,也是死锁发生的原因之一。

三、死锁避免的方法1. 银行家算法:银行家算法是一种经典的死锁避免方法,它通过对资源分配进行安全性检查,确保分配资源后不会导致死锁的发生。

当进程请求资源时,系统根据银行家算法判断资源分配是否安全,如果安全就分配资源,否则让进程等待。

2. 预防死锁:在系统设计阶段采取一些策略来预防死锁的发生,如避免使用不可抢占的资源、避免使用资源循环等待、合理规划资源的分配等。

3. 检测与解除死锁:通过死锁检测算法,周期性地检测系统是否处于死锁状态。

一旦检测到死锁的存在,可以采取解除死锁的策略,如剥夺某些进程已占用的资源、进行进程终止等。

四、操作系统中的死锁避免实例以银行家算法为例,假设有三个进程(P1、P2、P3)和三个资源(R1、R2、R3),进程对资源的最大需求如下:```进程最大需求P1 (3, 2, 1)P2 (2, 4, 3)P3 (1, 1, 2)```系统中当前资源的分配情况如下:```资源可用量R1 2R2 2R3 2```根据银行家算法,先进行安全性检查,判断当前资源分配是否安全。

假设按照以下顺序分配资源:P1→P3→P2。

分配过程如下:1. 进程P1申请资源,需求为(3, 2, 1)。

预防死锁的三种方法

预防死锁的三种方法
死锁是多任务操作系统中常见的问题,它会导致系统资源无法释放,进而影响系统的正常运行。

因此,预防死锁是非常重要的。

下面我们将介绍三种常见的方法来预防死锁。

第一种方法是加锁顺序。

加锁顺序是指在对多个资源进行加锁时,要按照统一的顺序来加锁,而不是随意加锁。

这样可以避免不同的进程因为加锁的顺序不同而导致死锁的发生。

通过规定加锁的顺序,可以降低死锁的概率,提高系统的稳定性。

第二种方法是加锁超时。

在进行资源的申请时,可以规定一个超时时间,如果在规定的时间内无法获得所需的资源,就放弃当前的资源申请,避免进程长时间等待而导致死锁的发生。

这种方法可以有效地减少死锁的发生,同时也能够提高系统的响应速度。

第三种方法是死锁检测与解除。

系统可以通过监控资源的分配情况,及时发现潜在的死锁情况,并采取相应的措施来解除死锁。

这种方法可以在死锁已经发生时及时解决问题,保证系统的正常运行。

综上所述,预防死锁是多任务操作系统中非常重要的问题。

通过合理的加锁顺序、加锁超时和死锁检测与解除等方法,可以有效地预防死锁的发生,提高系统的稳定性和可靠性。

希望大家能够重视预防死锁这一问题,从而保证系统的正常运行。

操作系统中的死锁避免策略

操作系统中的死锁避免策略在操作系统中,死锁是指由于资源竞争而导致进程无法继续执行的现象。

为了解决这个问题,操作系统采用了多种死锁避免策略。

本文将介绍其中的几种常见策略,并分析其优缺点。

1. 死锁预防死锁预防是一种常见的死锁避免策略,它通过限制进程对资源的申请,防止死锁的发生。

其核心思想是破坏死锁的四个必要条件:互斥、占有并等待、不可抢占和循环等待。

具体措施包括:- 互斥条件:对于某些资源,可以将其设置为非互斥的,允许多个进程同时访问。

- 占有并等待条件:要求进程在开始执行之前一次性申请所需的所有资源,避免占有部分资源后再申请其他资源。

- 不可抢占条件:当进程获取到某些资源后,不允许被其他进程抢占。

- 循环等待条件:对系统中所有资源进行全局排序,进程按照顺序申请资源,避免形成循环等待。

2. 资源剥夺资源剥夺是另一种常见的死锁避免策略,它通过剥夺进程当前占有的资源来避免死锁的发生。

当系统检测到死锁的可能时,可以选择抢占进程的资源,分配给其他需要的进程。

资源的选择原则可以采用优先级、等待时间等因素来确定。

3. 死锁检测与恢复死锁检测与恢复是一种被广泛使用的死锁避免策略。

系统周期性地检测死锁的发生,并在检测到死锁时采取相应的恢复措施。

具体流程包括:- 构建资源分配图:将进程和资源之间的关系表示为一个图,根据该图判断是否存在环路。

- 检测死锁:通过遍历资源分配图查找环路,如果存在环路则判断为死锁。

- 恢复操作:一旦检测到死锁,系统可以采取多种策略进行恢复,如终止部分或全部进程、剥夺资源等。

以上是操作系统中常见的死锁避免策略。

每种策略都有其优缺点,具体选择应根据系统需求和性能要求而定。

在实际应用中,多数操作系统会综合运用以上策略以提高死锁避免能力。

总结:操作系统中的死锁是一种由于资源竞争导致的进程无法继续执行的现象。

为了解决死锁问题,操作系统采用了多种死锁避免策略,如死锁预防、资源剥夺和死锁检测与恢复。

每种策略都有其优缺点,必须根据具体情况选择适合的策略。

操作系统实验三报告预防进程死锁的银行家算法.doc

操作系统实验三报告预防进程死锁的银行家算法操作系统实验报告实验三预防进程死锁的银行家算法学号班级姓名【实验目的】通过这次实验,加深对进程死锁的理解,进一步掌握进程资源的分配、死锁的检测和安全序列的生成方法。

【实验内容】问题描述设计程序模拟预防进程死锁的银行家算法的工作过程。

假设有系统中有n个进程P1, ,Pn,有m类可分配的资源R1, ,Rm,在T0时刻,进程Pi分配到的j类资源为Allocationij个,它还需要j类资源Need ij个,系统目前剩余j类资源Workj个,现采用银行家算法进行进程资源分配预防死锁的发生。

程序要求如下1)判断当前状态是否安全,如果安全,给出安全序列;如果不安全给出理由。

2)对于下一个时刻T1,某个进程Pk会提出请求RequestR1, ,Rm,判断分配给P k进程请求的资源之后。

3)输入进程个数n,资源种类m,T0时刻各个进程的资源分配情况(可以运行输入,也可以在程序中设置);4)输出如果安全输出安全的进程序列,不安全提示信息。

实现提示用C语言实现提示1)程序中进程调度时间变量描述如下int Available[MaxNumber]; intMax[MaxNumber][MaxNumber]; int Allocation[MaxNumber][MaxNumber]; int Need[MaxNumber][MaxNumber]; int Request[MaxNumber]; int SafeOrder[MaxNumber]; 2)进程调度的实现过程如下Ø 变量初始化;Ø 接收用户输入n,m,(输入或者默认的)Allocationij,Need ij;Ø 按照银行家算法判断当前状态安全与否,安全给出安全序列,不安全给出提示;Ø 如果安全,提示用户输入下一时刻进程Pk的资源请求RequestR1, ,Rm;Ø 如果不安全或者无新请求则退出。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

操作系统实验(二) 死锁的避免1、实验内容使用C++实现模拟随机算法与银行家算法2、实验目的(1)了解死锁的产生原因(随机算法)(2)理解死锁的解决办法(银行家算法)3、实验题目使用随机算法与银行家算法设计程序4、程序流程图主要过程流程图银行家算法流程图安全性算法流程图5、程序代码与运行结果#include <stdio、h>#include<stdlib、h> typedef struct{int A;int B;int C;}RES;#define false 0#define true 1//系统中所有进程数量#define PNUMBER 3//最大需求矩阵RES Max[PNUMBER];//已分配资源数矩阵RES Allocation[PNUMBER];//需求矩阵RES Need[PNUMBER];//可用资源向量RES Available={0,0,0};//安全序列int safe[PNUMBER];void setConfig(){int i=0,j=0;printf("================开始手动配置资源==================\n"); //可分配资源printf("输入可分配资源\n");scanf("%d%d%d",&Available、A,&Available、B,&Available、C);//最大需求矩阵MAXprintf("输入最大需求矩阵%dx%d\n",PNUMBER,PNUMBER );for (i=0;i<PNUMBER;i++){scanf("%d%d%d",&Max[i]、A,&Max[i]、B,&Max[i]、C);}//已分配矩阵Allocprintf("输入已分配矩阵%dx%d\n",PNUMBER,PNUMBER);for (i=0;i<PNUMBER;i++){scanf("%d%d%d",&Allocation[i]、A,&Allocation[i]、B,&Allocation[i]、C);}//需求矩阵printf("输入需求矩阵%dx%d\n",PNUMBER,PNUMBER);for (i=0;i<PNUMBER;i++){scanf("%d%d%d",&Need[i]、A,&Need[i]、B,&Need[i]、C);}printf("================结束配置资源==================\n");}void loadConfig(){FILE *fp1;if ((fp1=fopen("config、txt","r"))==NULL){printf("没有发现配置文件,请手动输入!!!\n");setConfig();}else{int i=0;printf("发现配置文件,开始导入、、\n");//可分配资源fscanf(fp1,"%d%d%d",&Available、A,&Available、B,&Available、C);//最大需求矩阵MAXfor (i=0;i<PNUMBER;i++){fscanf(fp1,"%d%d%d",&Max[i]、A,&Max[i]、B,&Max[i]、C);}//已分配矩阵Allocfor (i=0;i<PNUMBER;i++){fscanf(fp1,"%d%d%d",&Allocation[i]、A,&Allocation[i]、B,&Allocation[i]、C);}//需求矩阵for (i=0;i<PNUMBER;i++){fscanf(fp1,"%d%d%d",&Need[i]、A,&Need[i]、B,&Need[i]、C);}}}//试探分配void ProbeAlloc(int process,RES *res){Available、A -= res->A;Available、B -= res->B;Available、C -= res->C;Allocation[process]、A += res->A;Allocation[process]、B += res->B;Allocation[process]、C += res->C;Need[process]、A -= res->A;Need[process]、B -= res->B;Need[process]、C -= res->C;}//若试探分配后进入不安全状态,将分配回滚void RollBack(int process,RES *res){Available、A += res->A;Available、B += res->B;Available、C += res->C;Allocation[process]、A -= res->A;Allocation[process]、B -= res->B;Allocation[process]、C -= res->C;Need[process]、A += res->A;Need[process]、B += res->B;Need[process]、C += res->C;}//安全性检查bool SafeCheck(){RES Work;Work、A = Available、A;Work、B = Available、B;Work、C = Available、C;bool Finish[PNUMBER] = {false,false,false};int i;int j = 0;for (i = 0; i < PNUMBER; i++){//就是否已检查过if(Finish[i] == false){//就是否有足够的资源分配给该进程if(Need[i]、A <= Work、A && Need[i]、B <= Work、B && Need[i]、C <= Work、C){//有则使其执行完成,并将已分配给该进程的资源全部回收Work、A += Allocation[i]、A;Work、B += Allocation[i]、B;Work、C += Allocation[i]、C;Finish[i] = true;safe[j++] = i;i = -1; //重新进行遍历}}}//如果所有进程的Finish向量都为true则处于安全状态,否则为不安全状态for (i = 0; i < PNUMBER; i++){if (Finish[i] == false){return false;}}return true;}//资源分配请求bool request(int process,RES *res){//request向量需小于Need矩阵中对应的向量if(res->A <= Need[process]、A && res->B <= Need[process]、B && res->C <= Need[process]、C){//request向量需小于Available向量if(res->A <= Available、A && res->B <= Available、B && res->C <= Available、C){//试探分配ProbeAlloc(process,res);//如果安全检查成立,则请求成功,否则将分配回滚并返回失败if(SafeCheck()){return true;}else{printf("安全性检查失败。

原因:系统将进入不安全状态,有可能引起死锁。

\n");printf("正在回滚、、、\n");RollBack(process,res);}}else{printf("安全性检查失败。

原因:请求大于可利用资源。

\n");}}else{printf("安全性检查失败。

原因:请求大于需求。

\n");}return false;}//输出资源分配表void PrintTable(){printf("===================================资源分配表==================================\n");printf("Process Max Allocation Need Available\n");printf(" A B C A B C A B C A B C\n");printf("P0 %2d %2d %2d %2d %2d %2d %2d %2d %2d %2d %2d %2d\n",Max[0]、A,Max[0]、B,Max[0]、C,Allocation[0]、A,Allocation[0]、B,Allocation[0]、C,Need[0]、A,Need[0]、B,Need[0]、C,Available、A,Available、B,Available、C);printf("P1 %2d %2d %2d %2d %2d %2d %2d %2d %2d \n",Max[1]、A,Max[1]、B,Max[1]、C,Allocation[1]、A,Allocation[1]、B,Allocation[1]、C,Need[1]、A,Need[1]、B,Need[1]、C);printf("P2 %2d %2d %2d %2d %2d %2d %2d %2d %2d \n",Max[2]、A,Max[2]、B,Max[2]、C,Allocation[2]、A,Allocation[2]、B,Allocation[2]、C,Need[2]、A,Need[2]、B,Need[2]、C);printf("======================================================== =======================\n");}//银行家算法分配void banker(){char ch;//判断输入的就是否就是安全状态PrintTable();printf("先检查初始状态就是否安全。

相关文档
最新文档