超超超超超详细的操作系统课设报告-死锁避免与检验/银行家算法

本次课程设计实现了银行家算法,用于演示死锁避免,通过安全性检测判断系统是否安全。同时,设计了死锁检测算法,展示资源分配图简化过程,以确定是否存在死锁。通过Dev-C++在Windows环境下完成,加深了对操作系统中避免和检测死锁的理解。

死锁避免与检测

摘要:本次课程设计的内容是实现死锁的避免与检验。在操作系统中,由于多个进程对资源的争夺,对系统的安全造成威胁可能造成死锁。而死锁产生的必要条件分别为互斥条件、请求和保持条件、不可抢占条件、循环等待条件。为了解决死锁这一问题,目前处理死锁的方法为:预防死锁、避免死锁、检测死锁、解除死锁。

本次主要设计的是死锁避免和检验的算法实现。死锁避免的主要的内容是银行家算法,它包括对申请进程的预分配以及安全性检测。死锁检验的内容主要是对资源有序图的简化,当且仅当资源分配图是不可简化时,则说明系统存在死锁。

在设计银行家算法时要定义Available(可利用的资源量)、Allocation(已分配的资源量)、Need(所需求的资源量)、Max(最大需求量),还会使用到数组,有利于各个变量矩阵的运算。

死锁避免算法的结果可以动态低显示系统为每个进程分配资源时各个资源矩阵的变化,结果显示为是否处于安全状态,若处于安全状态,则出现安全序列,否则显示系统处于不安全状态。死锁检测算法动态地显示有向边的资源分配图的简化过程,结果显示当前环境不会发生死锁。

关键词:银行家算法; 资源分配图;避免死锁; 操作系统;检测死锁

1 设计任务

1.1设计目的
本次课程设计主要目的是掌握银行家算法,以及加深对避免死锁的方法和死锁检测的理解,推近对死锁更深层次的掌握。

1.2 设计内容

1.2.1 设计一个程序演示死锁避免算法(银行家算法),该演示程序能显示各进程申请和释放资源以及系统动态分配资源的过程,便于用户观察和分析;如果系统不能分配,也应给出系统进入不安全状态”的提示,已随机给出进程和各类共享资源数量、已分配量、申请量。

1.2.2 设计一个程序演示教材P116-117给出的死锁检验算法,该演示程序能显示资源分配图的简化过程,并给出最终检测结果(系统死锁还是不死锁),已随机给出进程和各类共享资源数量、已分配量、申请量。

2 总体设计

2.1 总体结构

2.1.1 死锁避免算法
在这里插入图片描述
2.1.2 死锁检测算法

在这里插入图片描述
2.2 开发环境

Dev-c++ 5.11开发工具、Windows 10系统

3 算法设计

3.1 死锁避免算法设计

3.1.1初始化算法流程图

在这里插入图片描述

3.1.2安全性检测算法流程图

在这里插入图片描述
3.1.3银行家算法流程图

在这里插入图片描述
银行家算法要先给定进程数和资源数,在随机输入符合要求的Allocation,Max,Need矩阵,给出Available向量,完成初始化。当有进程申请资源时要与Need和可用的Available相对,如果满足则进行预分配,再利用安全性算法进行检查。如果系统处于安全状态,则为进程分配资源,否则拒绝为该进程分配资源。

3.2 动态资源分配

定义Allocation,Max,Need矩阵,给出Available,完成初始化,对每个进程进行Need与Available进行比较,循环显示资源动态分配图简化的过程,即进程删边的过程,资源分配图的简化是把进程有向边删完,最后证明该环境是安全的,意味着该资源分配图无环路。

4 系统实现

4.1死锁避免算法

4.1.1 初始化模块实现

在这里插入图片描述4.1.2安全性检查模块实现
在这里插入图片描述4.1.3银行家算法模块的实现

在这里插入图片描述

4.2 动态资源分配

4.2.1初始化算法
在这里插入图片描述

4.2.2检验安全算法

在这里插入图片描述
4.2.3动态显示资源简化算法
在这里插入图片描述

5 系统测试

5.1银行家算法完整代码段和死锁检测完整代码

#include <stdio.h>
#define M 100          // //全局变量定义 
#define N 50          //定义M个进程,N类资源 
void Init();
bool checkSecurity (int);
void show();
int Bank(int);
int Available[M];       //可利用资源数组
int Max[N][M];   //最大需求矩阵
int Allocation[N][M];  //分配矩阵
int Need[N][M];        //需求矩阵
int Request[N][M];     //M个进程还需要N类资源的资源量
bool Finish[N];
int p[N];
int m,n;   //M个进程,N类资源
int main (void)
{
   
    
	int i;
	int Flag0 = 0;
	int Flag1 = 1;
	Init ();
	while(1)
	{
   
   
	 
	printf(" 1 --> 银行家算法。\n");
	printf(" 2 --> 死锁检测。\n") ;
	printf(" 3 --> 退出本次实验。\n");
	printf("   请选择你要进行的操作:");
	
	scanf("%d",&i);
	
	switch(i)
	{
   
   
	case 1:
		Bank(Flag0);
		//checkSecurity (Flag0);
		break;
		
	case 2:
		checkSecurity (Flag1);
		break;
		
	case 3:
		return 0;
		
	}
	}<
设计一个n个并发进程共享m个系统资源的程序以实现银行家算法。要求: 1) 简单的选择界面; 2) 能显示当前系统资源的占用剩余情况。 3) 为进程分配资源,如果进程要求的资源大于系统剩余的资源,不分配并且提示分配不成功; 4) 撤销作业,释放资源。 编写调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用适当的算法,有效地防止避免死锁的发生。 银行家算法分配资源的原则是:系统掌握每个进程对资源的最大需求量,当进程要求申请资源时,系统就测试该进程尚需资源的最大量,如果系统中现存的资源数大于或等于该进程尚需求资源最大量时,就满足进程的当前申请。这样就可以保证至少有一个进程可能得到全部资源而执行到结束,然后归还它所占有的全部资源供其它进程使用。 银行家算法中的数据结构 (1)可利用资源向量Available(一维数组)一个含有m个元素,其中的每一个元素代表一类可利用的资源数目,其初值是系统中所配置的该类全部可用资源数目。如果Available[j]=k, 表示系统中现有Rj类资源k个。 (2)最大需求矩阵Max(二维数组) m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。如果Max(i,j)=k, 表示进程i需要Rj类资源的最大数目为k。 (3)分配矩阵Allocation(二维数组) m的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。如果Allocation(i,j)=k, 表示进程i当前已分得Rj类资源k个。 (4)需求矩阵Need (二维数组)一个含有n*m的矩阵,用以表示每一个进程尚需的各类资源数。如果Need(i,j)=k, 表示进程i还需要Rj类资源k个,方能完成其任务。 Need(i,j)= Max(i,j)-Allocation(i,j)
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值