银行家算法

模拟实现银行家算法c语言

萝らか妹 提交于 2019-12-27 01:33:04
因为课设要做银行家算法,就写着记录一下。在网上看了很多,有java也有c。借鉴别人的,自己试着改了一下。 银行家算法: 第一模块:银行家算法中的数据结构 为了实现银行家算法,在系统中必须设置这样四个数据结构,分别用来描述系统中可用的资源,所有进程对资源的最大需求,系统中的资源分配,以及所有的进程话需要多少资源的情况。 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。 4.需求矩阵Need。这也是一个n*m的矩阵,用以表示每一个进程尚需的各类资源数。如果Need[i,j]=K,则表示进程i还需要Rj类资源K个,方能完成任务。 上述三个矩阵间存在下述关系:Need[i,j]=Max[i,j]

银行家算法(详解加代码)

时光怂恿深爱的人放手 提交于 2019-12-26 13:56:15
银行家算法,能戳到这里面的话,想必大家都有了解。 银行家算法的基本思想是:分配资源之前,判断系统是否是安全的;若是,才分配。它是最具有代表性的避免死锁的算法。设进程 process 提出请求request[i],则银行家算法按如下规则进行判断: (1)如果 request[process][i] <= need[process][i],则转(2);否则,出错。 (2)如果 request[process][i] <= available[i],则转(3);否则,等待。 (3)系统试探分配资源,修改相关数据: available [ i ] -= request [ process ] [ i ] ; allocation [ process ] [ i ] += request [ process ] [ i ] ; need [ process ] [ i ] -= request [ process ] [ i ] ; (4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状, 进程等待。 程序流程图: 先初始化资源总数资源; 再初始化各个进程资源情况 查看请求资源是否小于进程所需 查看请求资源是否小于系统所有 进行安全性检查 1)先试分配,检查状态是否安全,找出安全序列 2)如果找到安全序列,则直接修改 3)找不到安全序列,还原修改值。 注意:

银行家算法

霸气de小男生 提交于 2019-12-21 08:37:06
我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。 为保证资金的安全,银行家规定: (1) 当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客; (2) 顾客可以分期贷款,但贷款的总数不能超过最大需求量; (3) 当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款; (4) 当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金. 银行家算法数据结构 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。    4)需求矩阵Need。    这也是一个n×m的矩阵,用以表示每一个进程尚需的各类资源数。如果Need[i,j

银行家算法,C语言程序设计

女生的网名这么多〃 提交于 2019-12-20 00:49:18
银行家算法 原理 死锁会引起计算机工作僵死,因此操作系统中必须防止。本实验的目的在于让学生独立的使用高级语言编写和调试一个系统动态分配资源的简单模拟程序,了解死锁产生的条件和原因,并采用银行家算法有效地防止死锁的发生,以加深对课堂上所讲授的知识的理解。 在银行中,客户申请贷款的数量是有限的,每个客户在第一次申请贷款时要声明完成该项目所需的最大资金量,在满足所有贷款要求时,客户应及时归还。银行家在客户申请的贷款数量不超过自己拥有的最大值时,都应尽量满足客户的需要。在这样的描述中,银行家就好比操作系统,资金就是资源,客户就相当于要申请资源的进程。 银行家算法是一种最有代表性的避免死锁的算法。在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。为实现银行家算法,系统必须设置若干数据结构。 要解释银行家算法,必须先解释操作系统安全状态和不安全状态。 安全序列是指一个进程序列{P1,…,Pn}是安全的,即对于每一个进程Pi(1≤i≤n),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj (j < i )当前占有资源量之和。 安全状态 如果存在一个由系统中所有进程构成的安全序列P1,…,Pn,则系统处于安全状态。安全状态一定是没有死锁发生。 不安全状态 不存在一个安全序列

操作系统实验之“银行家算法”

南楼画角 提交于 2019-12-17 03:02:02
一、前言 银行家算法主要用于判断内存分配是否安全合理。 1、是否合理 主要是看进程的请求是否小于所需值,以及是否小于现有资源量。这个部分比较简单,根据available,need这两个二维矩阵就可以直接判断。 2、是否安全 主要根据安全性检查算法,主要思路是,对于分配后的available,allocation,need三大矩阵,是否能找到一种顺序能使得所有进程都能运行完。步骤如下: (一般描述中使用available的副本work作为剩余资源量,笔者源代码中也是这么做的,但为了叙述清楚,这里还是用available矩阵来描述) (1)在需求矩阵need与可分配矩阵available之间循环比较 如果某进程所有的需要都能被满足,那么就分配给这个进程。等待其运行完后回收其所有资源。 (2) 这样一来,如果能分配,那么我们可用资源只会越来越多。 如果最终所有进程都能运行完,则分配后状态安全; 如果某次循环中没有任何一个进程得到分配,那么我们可以断定下次循环也不会有分配,因此系统会出现死锁,所以系统状态不安全。 二、源代码(带注释) 这里笔者按照ppt上的例子初始化了程序,带有简单的分配界面。 另外由于浅拷贝造成的数据混淆,这里笔者用了两次copy模块中的深拷贝, #coding:gbk import copy def request ( p , r , n , available ,

银行家算法

断了今生、忘了曾经 提交于 2019-12-09 05:53:28
原文地址: https://zh.wikipedia.org/wiki/%E9%93%B6%E8%A1%8C%E5%AE%B6%E7%AE%97%E6%B3%95 背景 在银行中,客户申请贷款的数量是有限的,每个客户在第一次申请贷款时要声明完成该项目所需的最大资金量,在满足所有贷款要求时,客户应及时归还。银行家在客户申请的贷款数量不超过自己拥有的最大值时,都应尽量满足客户的需要。在这样的描述中,银行家就好比操作系统,资金就是资源,客户就相当于要申请资源的进程。 处理程序 Allocation   Max   Available   ABCD  ABCD  ABCD P1 0014  0656  1520  P2 1432  1942  P3 1354  1356 P4 1000  1750 我们会看到一个资源分配表,要判断是否为安全状态,首先先找出它的Need,Need即Max(最多需要多少资源)减去Allocation(原本已经分配出去的资源),计算结果如下: NEED ABCD 0642  0510 0002 0750 然后加一个全都为false的栏位 FINISH false false false false 接下来找出need比available小的(千万不能把它当成4位数 他是4个不同的数) NEED  Available ABCD  ABCD 0642  1520

C语言实现银行家算法

倖福魔咒の 提交于 2019-12-05 17:01:30
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h> // bool 类型 int N = 0; // 进程数目 int M = 0; // 资源数目 int* Available; // 可利用资源向量 M int** Max; // 最大需求矩阵 M * N int** Allocation; // 分配矩阵 M * N int** Need; // 需求矩阵 M * N // 初始化数据结构 void init(); // 销毁数据结构 void destory(); // 安全性检查算法 void security_checks(); int main(int argc, char const *argv[]) { init(); security_checks(); destory(); return 0; } /** * 初始化数据结构 */ void init() { printf("依次输入进程数目和资源类型数目:"); scanf("%d%d", &N, &M); // 分配内存 Available = malloc(sizeof(int*) * N); Max = malloc(sizeof(int*) * N); Allocation = malloc

操作系统——银行家算法(Banker's Algorithm)

邮差的信 提交于 2019-12-05 14:55:46
之前写过一篇关于死锁和银行家算法的详细描述的博客 https://www.cnblogs.com/wkfvawl/p/11598647.html 写这篇博客的目的,主要是详细讲解一下银行家算法以及代码的实现 Dijkstra在1965年提出的银行家算法是著名的死锁避免算法,这个用于一个银行家给多个顾客贷款的算法可以直接用于操作系统给进程分配资源,这时只要把银行家换成操作系统,把顾客换成进程,把资金换成资源,把银行家决定是否放贷时所用的判断过程(即判断顾客是否有信誉和偿还能力)换成操作系统决定是否分配资源时所用的判断过程(即判断进程是否能及时归还资源)即可。为了描述银行家算法,下面先介绍一下系统的安全状态的概念。 一、安全序列 注意: (1)系统在某一时刻的安全状态可能不唯一,但这不影响对系统安全性的判断。 (2)安全状态是非死锁状态,而不安全状态并不一定是死锁状态。即系统处于安全状态一定可以避免死锁,而系统处于不安全状态则仅仅可能进入死锁状态。 二、银行家算法 银行家算法的实质就是 要设法保证系统动态分配资源后不进入不安全状态,以避免可能产生的死锁。 即没当进程提出资源请求且系统的资源能够满足该请求时,系统将判断满足此次资源请求后系统状态是否安全,如果判断结果为安全,则给该进程分配资源,否则不分配资源,申请资源的进程将阻塞。 银行家算法的执行有个前提条件

OS计算题练习

ⅰ亾dé卋堺 提交于 2019-12-04 18:37:12
一、进程同步 1、 设有两个进程 P 、 Q , P 的优先级高于 Q ,同时进入就绪队列。各自运行的程序段如下所示: 进程 P 进程 Q P1 Y=12 Q1 X=18 P2 Y=A+Y Q2 A=X+A P3 P(S1) Q3 V(S1) P4 A=Y+X Q4 X=A+Y P5 V(S2) Q5 P(S2) P6 X=Y+A Q6 A=X-Y 其中 S1 、 S2 为信号量,初值为 0 ;已知 X 、 Y 、 A 为共享变量, X 的初值为 83 , Y 的初值为 35 , A 的初值为 38 ;若调度程序执行的策略为 抢占式优先权原则 ,试问: (1) 执行序列? (2) 变量 X 、 Y 、 A 的运行结果依次是? 解析: (1) 执行序列: P1 P2 P3 Q1 Q2 Q3 P4 P5 P6 Q4 Q5 Q6 (2) 运行结果: X=118 , Y=50 , A=68 执行序列 运行过程 P1 Y=12 P2 Y=A+Y=38+12=50 P3 P(S1),所以S1=-1<0,block Q1 X=18 Q2 A=X+A=18+38=56 Q3 V(S1),所以S1=0 ≤ 0,wake up,P>Q P4 A=Y+X=50+18=68 P5 V(S2),S2=1,go on P6 X=Y+A=50+68=118 Q4 X=A+Y=68+50=118同上 Q5 P

C语言银行家算法

匿名 (未验证) 提交于 2019-12-03 00:21:02
算法简介 银行家算法(Banker’s Algorithm)是一个避免死锁(Deadlock)的著名算法,是由艾兹格・迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的算法。它以银行借贷系统的分配策略为基础,判断并保证系统的安全运行。 算法目的 为了了解系统的资源分配情况,假定系统的任何一种资源在任意时刻只能被一个进程使用,任何进程已经占用的资源只能由进程自己释放,而不能由其他进程抢占,当进程申请的资源不能满足时,必须等待。因此只要资源分配算法能保证进程的资源请求,且不出现循环等待,则系统不会出现死锁。 算法原理 在避免死锁的方法中,所施加的限制条件较弱,有可能获得令人满意的系统性能。在该方法中把系统的状态分为安全状态和不安全状态,只要能使系统始终都处于安全状态,便可以避免发生死锁。 银行家算法的基本思想是分配资源之前,判断系统是否是安全的;若是,才分配。它是最具有代表性的避免死锁的算法。 设进程cusneed提出请求REQUEST [i],则银行家算法按如下规则进行判断。 (1)如果REQUEST [cusneed] [i]<= NEED[cusneed][i],则转(2);否则,出错。 (2)如果REQUEST [cusneed] [i]<= AVAILABLE[i],则转(3);否则,等待。 (3)系统试探分配资源,修改相关数据: AVAILABLE[i]-