操作系统课程设计银行家算法 下载本文

内容发布更新时间 : 2024/3/29 10:32:18星期一 下面是文章的全部内容请认真阅读。

银行家算法的模拟实现

1 课设简介:

1.1 课程设计题目

银行家算法的模拟实现 1.2 课程设计目的

1.2.1了解进程产生死锁原因,了解为什么要进行死锁的避免。

1.2.2掌握银行家算法的数据结构,了解算法的执行过程,加深对银行家算法的理解。

1.3 课程设计内容

设计一个n 个并发进程共享m 个系统资源的系统。进程可动态申请资源和释放资源,系统按各进程的申请动态的分配资源。要求采用银行家算法实现。 2 实验原理分析: 2.1 整个银行家算法的思路

先对用户提出的请求进行合法性检查,再进行预分配,利用安全性检查算法进

行安全性检查。

2.2 算法用到的主要数据结构和C语言说明。

2.2.1可利用资源向量 INT AVAILABLE[M] M为资源的类型。

2.2.2最大需求矩阵 INT MAX[N][M] N为进程的数量。 2.2.3已分配矩阵 INT ALLOCATION[N][M] 2.2.4还需求矩阵 INT NEED[N][N] 2.2.5申请各类资源数量int Request[x]; 2.2.6工作向量 int Work[x];

2.2.7 int Finish[y]; //是否有足够的资源分配给进程,0为否,非0为是 2.3 银行家算法主程序

2.3.1系统初始化。调用函数 chushihua(),输入进程数量,资源种类,各资源可用数量,各进程已分配、最大需求各资源数量等 2.3.2安全性算法调用函数safe()检查当前资源分配状态。

2.3.3调用bank()函数,输入用户的请求三元组(I,J,K),为进程I申请K个J类资源。

2.3.4检查用户请求是否小于还需求量,条件是K<=NEED[I,J]。如果条件不符则提示重新输入,即不允许索取大于需求量

2.3.5检查用户的请求是否小于系统中的可利用资源数量,条件是

K<=AVALIABLE[I,J]。如果条件不符则申请失败,阻塞该进程,重新进行进程动态资源申请(使用goto语句跳转) 2.3.6进行资源的预分配,语句如下: AVALIBLE[I][J]= AVALIBLE[I][J]-K; ALLOCATION[I][J]= ALLOCATION[I][J]+K; NEED[I][J]=NEED[I][J]-K;

2.3.7系统调用安全性检查算法(safe()函数)进行检查,如果检查不安全,则进行回收,进程资源申请失败进入等待。否则不用回收,并检查该进程是否已获得所有需要资源,如是则进行其拥有资源释放,语句如下:

Available[j]=Available[j]+Allocation[k][j]; Allocation[k][j]=0;

2.3.8 do{?}while 循环输入字符Y/N判断是否继续进行资源申请。 2.4 安全性检查算法(safe()函数) 2.4.1设置两个临时变量:

FINISH[N]记录进程模拟执行的结束状态,初值为0,如果可以模拟执行结束,则可设为1。

WORK[M]记录模拟执行中资源的回收情况,初值为AVAILABLE[M]的值。 2.4.2在进程中查找符合以下条件的进程。 条件1:FINISH[I]=0

条件2:NEED[I][J]〈=WORK[J]

2.4.3如果查找成功则存储安全序列并进行资源的模拟回收,语句如下:

FINISH[I]=1

WORK[J]=WORK[J]+ALLOCATION[I][J];

2.4.4如查找不成功,则根据不同地方的调用情况进行相应判断处理。

3 程序结构分析: 3.1 程序流程图 3.2 程序模块划分

本程序共有以下六个模块:

3.2.1、字符判断模块:判断输入的字符是否为数字,如果不是则提示出错并重新输入,主要处理输入为非数字时程序出现运行错误现象。此模块功能由数字判断函数( int shuzi(int sz); )实现。

3.2.2、程序初始化模块:用于程序开始进行初始化输入数据:进程数量、资源种类、各种资源可利用数量、各进程的各种资源已分配数量、各进程对各类资源最大需求数等。此模块功能在系统初始化函数(void chushihua(); )中实现。

3.2.3、当前安全性检查模块:用于判断当前状态安全性,根据不同地方的调用提示处理不同,在安全性算函数(void safe(); )中实现。

3.2.4、银行家算法模块:进行银行家算法模拟实现的模块,调用其他各个模块进行银行家算法模拟过程,在银行家算法函数(void bank();)中实现。 3.2.5、显示分配模块:显示当前资源分配详细情况,包括:各种资源的总数量(all)、系统目前各种资源可用的数量、各进程已经得到的资源数量、各进程还需要的资源量,在显示分配情况函数(void showdata(); )中实现。 3.2.6、签名模块:用于程序结束时显示程序版权声明签名等,在签名函数(void sign(); )中实现。 4 数据结构分析

本程序所使用的主体数据结构如下: 4.1定义全局变量

const int x=50,y=100; //定义常量,便于修改 int Available[x]; //各种资源可利用的数量

int Allocation[y][y]; //各进程当前已分配的资源数量 int Max[y][y]; //各进程对各类资源的最大需求数 int Need[y][y]; //还需求矩阵 int Request[x]; //申请各类资源的数量