银行家算法设计与实现

一:操作系统中怎样编程实现银行家算法

#include

#include

#include

#define False 0

#define True 1

int Max[100][100]={0};//各进程所需各类资源的最大需求

int Avaliable[100]={0};//系统可用资源

char name[100]={0};//资源的名称

int Allocation[100][100]={0};//系统已分配资源

int Need[100][100]={0};//还需要资源

int Request[100]={0};//请求资源向量

int temp[100]={0};//存放安全序列

int Work[100]={0};//存放系统可提供资源

int M=100;//作业的最大数为100

int N=100;//资源的最大数为100

void showdata()//显示资源矩阵

{

int i,j;

cout<<"系统目前可用的资源[Avaliable]:"<

for(i=0;i

cout<

cout<

for (j=0;j

cout<

cout<

cout<<" Max Allocation Need"<

cout<<"进程名 ";

for(j=0;j<3;j++){

for(i=0;i

cout<

cout<<" ";

}

cout<

for(i=0;i

cout<<" "<

for(j=0;j

cout<

cout<<" ";

for(j=0;j

cout<

cout<<" ";

for(j=0;j

cout<

cout<

}

}

......余下全文>>

二:银行家算法模拟

#include

#include

#include

#define False 0

#define True 1

int Max[100][100]={0};//各进程所需各类资源的最大需求

int Avaliable[100]={0};//系统可用资源

char name[100]={0};//资源的名称

int Allocation[100][100]={0};//系统已分配资源

int Need[100][100]={0};//还需要资源

int Request[100]={0};//请求资源向量

int temp[100]={0};//存放安全序列

int Work[100]={0};//存放系统可提供资源

int M=100;//作业的最大数为100

int N=100;//资源的最大数为100

void showdata()//显示资源矩阵

{

int i,j;

cout<<"系统目前可用的资源[Avaliable]:"<

for(i=0;i

cout<

cout<

for (j=0;j

cout<

cout<

cout<<" Max Allocation Need"<

cout<<"进程名 ";

for(j=0;j<3;j++){

for(i=0;i

cout<

cout<<" ";

}

cout<

for(i=0;i

cout<<" "<

for(j=0;j

cout<

cout<<" ";

for(j=0;j

cout<

cout<<" ";

for(j=0;j

cout<

cout<

}

}

int changdata(int i)//进行资源分配

{

int j;

for (j=0;......余下全文>>

三:操作系统银行家算法题目: 10分

本题主要内容是模拟实现资源分配。同时珐求编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并使用适当的算法,有效的防止和避免死锁的发生。

[基本要求] 具体用银行家算法实现资源分配。要求如下:

(1) 设计一个3个并发进程共享3类不同资源的系统,进程可动态地申请资源和释放资源,系统按各进程的申请动态地分配资源。

(2) 设计用银行家算法和随机分配算法,实现资源分配的两个资源分配程序,应具有显示或打印各进程依次要求申请的资源数以及依次分配资源的情况。

(3) 确定一组各进程依次申请资源数的序列,在相同的情况下分别运行上述两种资源分配程序,观察运行结果。

银行家算法是避免死锁的一种重要方法,本实验要求用高级语言编写和调试一个简单的银行家算法程序。加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。死锁的产生,必须同时满足四个条件,即一个资源每次只能由一个进程占用:第二个为等待条件,即一个进程请求资源不能满足时,它必须等待,但它仍继续保持已得到的所有其他资源:第四个为循环等待条件,系统中存在若干个循环等待的进程,即其中每一个进程分别等待它前一个进程所持有的资源。防止死锁的机构只能确保上述四个条件之一不出现,则系统就不会发生死锁。通过这个算法可用解决生活中的实际问题,如银行贷款等.

通过对这个算法的设计,让学生能够对书本知识有更深的理解,在操作和其它方面有更高的提升.

四:银行家算法

简介

银行家算法是一种最有代表性的避免死锁的算法。在避免死锁方法中允许进程动态地申请资源,但系银行家算法统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。为实现银行家算法,系统必须设置若干数据结构。 要解释银行家算法,必须先解释操作系统安全状态和不安全状态。 安全序列是指一个进程序列{P1,…,Pn}是安全的,如果对于每一个进程Pi(1≤i≤n),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj (j < i )当前占有资源量之和。

安全状态

如果存在一个由系统中所有进程构成的安全序列P1,…,Pn,则系统处于安全状态。安全状态一定是没有死锁发生。

不安全状态

不存在一个安全序列。不安全状态不一定导致死锁。

[编辑本段]银行家算法的数据结构

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〕-Allocation〔i,j〕

[编辑本段]银行家算法原理:

我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。 为保证资金的安全,银行家规定: (1) 当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客; (2) 顾客可以分歧贷款,但贷款的总数不能超过最大需求量; (3) 当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款; (4) 当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金. 操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。 运行平台:Windows XP VS2005 编程语言:C#

[编辑本段]算法的实现

初始化

由用户输入数据,分别对可利用资源向量矩阵AVAILABLE、最大需求矩阵MAX、分配矩阵ALLOCATION、需求矩阵NEED赋值。

银行家算法

在避免死锁的方法中,所施加的限制条件较弱,有可能获得令人满意的系统性能。在该方法中把系统的状态分为安全状态和不安全状态,只要能使系统始终都处于安全状态,便可以避免发生死锁。 银行家算法......余下全文>>

五:求银行家算法的完整程序

是模拟的么?。。用c语言来模拟。。。我也在找呢。。呵呵。。

一分不给还这么多要求。。无奈了。。你觉得会有答案么。。

六:你好,我看到你的提问 设计一个n个并发进程共享m个系统资源的程序以实现银行家算法 这个编程语言还有吗?

没有了.............

七:操作系统银行家算法实验,求高手指导!!!急!!! 25分

很难吗·?

八:操作系统银行家算法 10分

11.5.1 锁的概念

锁(Lock) 是在多用户环境下对资源访问的一种限制。机制当对一个数据源加锁后,此数据源就有了一定的访问限制。我们就称对此数据源进行了“锁定”。在SQL Server中,可以对以下的对象进行锁定:

数据行(Row):数据页中的单行数据;

索引行(Key):索引页中的单行数据,即索引的键值;

页(Page):页是SQL Server 存取数据的基本单位,其大小为8KB;

盘区(Extent):一个盘区由8 个连续的页组成;

表(Table);

数据库(Database)。

11.5.2 锁的类别

在SQL Server 中,锁有两种分类方法。

(1) 从数据库系统的角度来看

锁分为以下三种类型:

独占锁(Exclusive Lock)

独占锁锁定的资源只允许进行锁定操作的程序使用,其它任何对它的操作均不会被接受。执行数据更新命令,即INSERT、 UPDATE 或DELETE 命令时,SQL Server 会自动使用独占锁。但当对象上有其它锁存在时,无法对其加独占锁。独占锁一直到事务结束才能被释放。

共享锁(Shared Lock)

共享锁锁定的资源可以被其它用户读取,但其它用户不能修改它。在SELECT 命令执行时,SQL Server 通常会对对象进行共享锁锁定。通常加共享锁的数据页被读取完毕后,共享锁就会立即被释放。

更新锁(Update Lock)

更新锁是为了防止死锁而设立的。当SQL Server 准备更新数据时,它首先对数据对象作更新锁锁定,这样数据将不能被修改,但可以读取。等到SQL Server 确定要进行更新数据操作时,它会自动将更新锁换为独占锁。但当对象上有其它锁存在时,无法对其作更新锁锁定。

(2)从程序员的角度看

锁分为以下两种类型:

乐观锁(Optimistic Lock)

乐观锁假定在处理数据时,不需要在应用程序的代码中做任何事情就可以直接在记录上加锁、即完全依靠数据库来管理锁的工作。一般情况下,当执行事务处理时SQL Server会自动对事务处理范围内更新到的表做锁定。

悲观锁(Pessimistic Lock)

悲观锁对数据库系统的自动管理不感冒,需要程序员直接管理数据或对象上的加锁处理,并负责获取、共享和放弃正在使用的数据上的任何锁。

11.5.3 隔离级别

隔离(Isolation) 是计算机安全学中的一种概念,其本质上是一种封锁机制。它是指自动数据处理系统中的用户和资源的相关牵制关系,也就是用户和进程彼此分开,且和操 作系统的保护控制也分开来。在SQL Server 中,隔离级(Isolation Level) 是指一个事务 和其它事务的隔离程度,即指定了数据库如何保护(锁定)那些当前正在被其它用户或服务器请求使用的数据。指定事务的隔离级与在SELECT 语句中使用锁定选项来控制锁定 方式具有相同的效果。

在SQL Server 中有以下四种隔离级:

READ COMMITTED

在此隔离级下,SELECT 命令不会返回尚未提交(Committed) 的数据,也不能返回脏数据。它是SQL Server 默认的隔离级。

READ UNCOMMITTED

与READ COMMITTED 隔离级相反,它允许读取已经被其它用户修改但尚未提交确定的数据。

REPEATABLE READ

在此隔离级下,用SELECT 命令读取的数据在整个命令执行过程中不会被更改。此选项会影响系统的效能,非必要情况最好不用此隔离级。

SERIALIZABLE

与DELETE 语句中SERIALIZABLE......余下全文>>

九:一,实验题目:银行家死锁避免算法模拟

package cn.hvcker.utils;

import java.util.ArrayList;

import java.util.List;

import java.util.Map;

import cn.hvcker.domain.Process;

import cn.hvcker.domain.Request;

import cn.hvcker.domain.Resource;

import cn.hvcker.domain.Work;

public class BankUtils {

private BankAlgorithm bankAlgorithm;

public BankUtils() {

super();

bankAlgorithm = new BankAlgorithm();

}

public Process allocation(Process process, Request request) {

// TODO Auto-generated method stub

process.setA_allocation(process.getA_allocation()

+ request.getRequest_A());

process.setB_allocation(process.getB_allocation()

+ request.getRequest_B());

process.setC_allocation(process.getC_allocation()

+ request.getRequest_C());

return process;

}

public Resource allocation(Resource resource, Request request) {

// TODO Auto-generated method stub

Resource res = new Resource();

res.setResource_A(resource.getResource_A() - request.getRequest_A());

res.setResource_B(resource.getResource_B() - request.getRequest_B());

res.setResource_C(resource.getResource_C() - request.getRequest_C());

return res;

}

public boolean isNotOverNeed(Process process, Request request) {

// TODO Auto-generated method stub

boolean flag = false;

if (request.getRequest_A() <= process.getA_need()

&& request.getRequest_B() <= process.getB_need()

&& request.getRequest_C() <= process.getC_need()) {

flag = true;

}

return flag;

}

public boolean isNotOverRe......余下全文>>

十:求一份模拟操作系统银行家算法的代码

#include

#include

#include

#define False 0

#define True 1

int Max[100][100]={0};//各进程所需各类资源的最大需求

int Avaliable[100]={0};//系统可用资源

char name[100]={0};//资源的名称

int Allocation[100][100]={0};//系统已分配资源

int Need[100][100]={0};//还需要资源

int Request[100]={0};//请求资源向量

int temp[100]={0};//存放安全序列

int Work[100]={0};//存放系统可提供资源

int M=100;//作业的最大数为100

int N=100;//资源的最大数为100

void showdata()//显示资源矩阵

{

int i,j;

cout<<"系统目前可用的资源[Avaliable]:"<

for(i=0;i

cout<

cout<

for (j=0;j

cout<

cout<

cout<<" Max Allocation Need"<

cout<<"进程名 ";

for(j=0;j<3;j++){

for(i=0;i

cout<

cout<<" ";

}

cout<

for(i=0;i

cout<<" "<

for(j=0;j

cout<

cout<<" ";

for(j=0;j

cout<

cout<<" ";

for(j=0;j

cout<

cout<

}

}

......余下全文>>

扫一扫手机访问

发表评论