(完整word版)操作系统 银行家算法
操作系统 银行家算法
操作系统银行家算法1. 简介1.1 定义:银行家算法是一种用于避免死锁的资源分配策略,通过判断当前状态是否安全来决定是否为进程提供所需资源。
1.2 目的:保证系统能够按照合理顺序进行并发执行,并防止出现死锁情况。
2. 死锁概述在多道程序环境下,当两个或更多进程因竞争有限数量的资源而无限等待时就会产生死锁。
常见原因包括互斥、占有和不可剥夺性以及循环等待条件。
3. 资源管理模型操作系统中使用了三类数据结构:- 可利用向量(Avlable):表示每种类型可被分配给各个进程实例数目;- 最大需求矩阵(Maximum):记录每个进程对某类资源最大需要量;- 分配矩阵(Allocation) :描述已经成功地将某些单位从总体汇集转移到具体过渡态;4. 进展与请求检查流程(Safety Algorithm)当一个新任务到达后,在满足以下所有条件之前不能接受它: a)如果存在这样一个i使得Request[i] > Need[i],则拒绝请求;b)如果存在这样一个i使得Request[i] > Avlable,则不接受该进程的资源申请。
5. 安全状态检查流程(Safety Algorithm)当新任务到达后,在满足以下所有条件之前不能接受它:a) 如果有某个j, 且Work[j]<Need_i[j], 则将p加入集合T中;b) 若对于每个p∈ T 都有Allocation[p]+ Work >= Need_p ,将p从T移到Finish,并释放其占用的全部资源。
6. 算法实现步骤1)初始化:定义Avlable、Max和Allocation矩阵以及Need数组;2)判断是否安全:使用银行家算法进行系统当前状态下是否会发生死锁的判断;3)处理用户请求:- 检查用户请求所需资源量与可利用向量(Avlable)比较,如大于可利用向量或者超过最大需求(Maximum),则拒绝分配给该进程;- 分配成功时更新相关数据结构(如Avlable、Allocation等);4)回收已完成进程所占据的资源并重新计算各项指标值。
(完整word版)操作系统课程设计银行家算法
操作系统课程设计报告题目:银行家算法院(系):专业:班级:学生:学号:指导教师:2010年12月操作系统课程设计报告题目:银行家算法院(系):专业:班级:学生:学号:指导教师:2010年12月银行家算法摘要本次的课程设计内容是银行家算法,在操作系统当中,由于竞争非剥夺性资源和进程推进的不当,对系统的安全造成威胁,所以,银行家算法就是为了避免对系统产生死锁而存在的.银行家算法包括对请求资源的试分配和对安全性的考量,当系统的安全性不能够满足的时候,则对系统进行保护。
在编写银行家算法的时候需要定义Need(需求矩阵),Allocation(分配矩阵),Max(最大需求矩阵)以及Available(可利用资源量)。
在实现一系列的功能的时候使用的数组的结构,便于进行矩阵的加减运算,可以提高程序的运行效率.通过编写可以基本上实现银行家算法所要达到的基本目的,在输入正确的情况下能够输出正确的安全序列,在不安全的情况下可以做出提醒,并且恢复原有输入数据。
关键字:银行家算法最大需求矩阵分配矩阵需求矩阵可利用资源量目录摘要 (i)1 绪论 (1)2需求分析.................................................................。
(2)2.1 问题描述.........................................................。
. (2)2.2 产生条件..........................................................。
(2)2.3 运行环境.........................................................。
. (2)2.4 程序功能.........................................................。
(完整word版)银行家算法例题
银行家算法例题假定系统中有五个进程{P0,P1,P2,P3,P4} 和三类资源{A ,B,C},各种资源的数量分别为10、5、7,在T0 时刻的资源分配情况(1)T0时刻的安全性利用安全性算法对T0时刻的资源分配情况进行分析(2)P1请求资源:P1发出请求向量Request1(1,0,2),系统按银行家算法进行检查 ①Request1(1,0,2)≤Need1(1,2,2) ②Request1(1,0,2)≤Available1(3,3,2)③系统先假定可为P1分配资源,并修改Available ,Allocation1和Need1向量,由此形成资源情况进程Max Allocation Need Available A B C A B C A B C A B C P0 7 5 3 0 1 0 7 4 3 3 3 2 P1 3 2 2 2 0 0 1 2 2 P2 9 0 2 3 0 2 6 0 0 P3 2 2 2 2 1 1 0 1 1 P44 3 30 0 24 3 1资源情况 进程Work A B C Need A B C Allocation A B CWork+Allocatio n A B C FinishP1 3 3 2 1 2 2 2 0 0 5 3 2 TRUE P3 5 3 2 0 1 1 2 1 1 7 4 3 TRUE P4 7 4 3 4 3 1 0 0 2 7 4 5TRUE P2 7 4 5 6 0 0 3 0 2 10 4 7 TRUE P010 4 77 4 30 1 010 5 7TRUE的资源变化情况如下图所示。
④再利用安全性算法检查此时系统是否安全。
P1 申请资源时的安全性检查(3)P4请求资源:P4发出请求向量Request4(3,3,0),系统按银行家算法进行检查: ①Request4(3,3,0)≤Need4(4,3,1); ②Request4(3,3, 0)≮Available (2,3,0),让P4等待。
(完整word版)计算机操作系统银行家算法实验报告
计算机操作系统实验报告一、实验名称:银行家算法二、实验目的:银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
三、问题分析与设计:1、算法思路:先对用户提出的请求进行合法性检查,即检查请求是否大于需要的,是否大于可利用的.若请求合法,则进行预分配,对分配后的状态调用安全性算法进行检查。
若安全,则分配;若不安全,则拒绝申请,恢复到原来的状态,拒绝申请。
2、银行家算法步骤:(1)如果Requesti<or =Need,则转向步骤(2);否则,认为出错,因为它所需要的资源数已超过它所宣布的最大值。
(2)如果Request<or=Available,则转向步骤(3);否则,表示系统中尚无足够的资源,进程必须等待.(3)系统试探把要求的资源分配给进程Pi,并修改下面数据结构中的数值:Available=Available—Request[i];Allocation=Allocation+Request;Need=Need-Request;(4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态.3、安全性算法步骤:(1)设置两个向量①工作向量Work。
它表示系统可提供进程继续运行所需要的各类资源数目,执行安全算法开始时,Work=Allocation;②布尔向量Finish。
它表示系统是否有足够的资源分配给进程,使之运行完成,开始时先做Finish[i]=false,当有足够资源分配给进程时,令Finish[i]=true.(2)从进程集合中找到一个能满足下述条件的进程:①Finish[i]=false②Need〈or=Work如找到,执行步骤(3);否则,执行步骤(4)。
(3)当进程P获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:Work=Work+Allocation;Finish[i]=true;转向步骤(2).(4)如果所有进程的Finish[i]=true,则表示系统处于安全状态;否则,系统处于不安全状态。
操作系统之银行家算法
操作系统之银⾏家算法
银⾏家算法
银⾏家算法是解决死锁问题的。
那么怎么解决呢? 死锁的⼀个原因就是互斥资源, 如上图,有A,B,C三个资源,数量分别是
10,5,7,MAX表⽰的是每个进程需要该资源,需要多少,Allocation表⽰现在分配了多少,Need表⽰他们还需要多少,⾃然Max-
Allocation就能算出need。
那么怎样算Available呢?某个资源⼀共有的减去分配了的,就是当前可⽤的。
work表⽰当前可⽤的资源的数⽬,刚开始肯定就是3 3 2,这个表⽰我们的系统中的资源还剩多少,然后判断可以分配给哪个进程,把这个进程的名字写在前⾯,然后need就是这个进程需要的资源数,Allocation是这个进程当前分配了多少,work+Allocation为把两个加起来,意思就是系统执⾏这个进程,完了以后会释放之前分配给他的,然后这个系统中当前有的资源数就是work+Allocation。
执⾏完,最后的work+Allocation应该跟刚
开始系统的资源数相同。
「怎样判断系统是否安全呢?」 如果每个进程都能执⾏,也就是finish都为true,那么这个系统就是安全的,反之就不安全。
P1发出请求向量,是在他原来需要的1 2 2⾥,先要请求1 0 2,所以先要判断请求的向量是不是⽐需要的多,如果多肯定是不对的。
第⼆步,请求的向量需要⽐当前可⽤的少,这两个条件都满⾜以后,我们就把Allocation的向量增加请求向量,把Need向量减少请求向量,然后继续进⾏计算。
计算机操作系统银行家算法
计算机操作系统必考题(银行家算法) 银行家算法( banker's algorithm )由 Dijkstra于1965提出,关键是将死锁的问题演示为一个银行家贷款的模型,由于能用于银行系统的现金贷款而出名。
一个银行家向一群客户发放信用卡,每个客户有不同的信用额度。
每个客户可以提出信用额度内的任意额度的请求,直到额度用完后再一次性还款。
银行家承诺每个客户最终都能获得自己需要的额度。
所谓“最终”,是说银行家可以先挂起某个额度请求较大的客户的请求,优先满足小额度的请求,等小额度的请求还款后,再处理挂起的请求。
这样,资金能够永远流通。
所以银行家算法其核心是:保证银行家系统的资源数至少不小于一个客户的所需要的资源数。
银行家算法是一种最有代表性的避免死锁的算法。
在避免死锁方法中允许进程动态地申请资源,但银行家算法在系统在进行资源分配之前(并不是真的不分配,这样就没法做了,只不过是试探性分配,不满足的话再恢复),应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。
为实现银行家算法,系统必须设置若干数据结构。
要解释银行家算法,必须先解释操作系统安全状态和不安全状态。
安全序列是指存在一个进程序列{P1,…,Pn}是安全的,不会死锁(至少两个线程占有某资源A,但是都不满足,剩余的资源A分配给谁仍然无法满足),安全状态如果存在一个由系统中所有进程构成的安全序列P1,…,Pn,则系统处于安全状态,安全状态一定是没有死锁发生;不安全状态不存在一个安全序列,不安全状态不一定导致死锁。
本算法在理论上是出色的,能非常有效地避免死锁,但从某种意义上说,它缺乏实用价值,因为很少有进程能够在运行前就知道其所需资源的最大值,且进程数也不是固定的,往往在不断地变化(如新用户登录或退出),况且原来可用的资源也可能突然间变成不可用(如打印机、磁带机可能被损坏)。
二.算法原理银行家算法的基本思想是分配资源之前,判断系统是否是安全的;若是,才分配。
操作系统银行家算法
操作系统银⾏家算法是⼀个避免死锁(Deadlock)的著名算法,它以银⾏借贷系统的分配策略为基础,判断并保证系统的安全运⾏。
1).银⾏家算法中的数据结构(1).可利⽤资源向量Available(2).最⼤需求矩阵Max(3).分配矩阵Allocation(4).需求矩阵Need2).银⾏家算法Request请求向量,(1).如果Request[i] <= Need[i][j]转下步,否则它所需要的资源数已超过它所需要的最⼤值(2).如果Request[i] <= Available[i][j]转下步,否则尚⽆⾜够资源,进程需等待(3).系统试分配给进程p,并修改Available,Allocation和NeedAvailable[j] -= Request[j]Allocation[i][j] += Request[j]Need[i][j] -= Request[j](4)系统执⾏安全性算法,检查此次资源分配后系统是否处于安全状态.若安全,才正式分配;否则恢复原来的分配状态,让该进程等待3).安全性算法(1).设置两个向量,⼯作向量Work,在执⾏安全性算法开始时 Work=Available;Finish:表⽰有⾜够的资源分配给进程,使之运⾏完成,Finish[i]=false;当有⾜够资源分配给进程时,再另Finish[i]=false(2).从进程集合中找到⼀个满⾜该条件的进程:Finish[i]=falseNeed[i][j] <= Work[j](3).当进程获得资源后,可顺利执⾏,并修改Work向量和Finsh向量Work[i] += Allocation[i][j]Finish[i]=true(4).如果所有进程的Finish[i]=true说明系统处于安全状态,否则系统处于不安全状态.#include<stdio.h>#include <stdlib.h>#include <string>typedef struct process * proc;typedef struct system * sys;static int cur_resource = 3;struct process{int process_id;int resource_num;int * Max;int * Allocation;int * Need;int * request;int Finish;int flag;};struct system{int resource_num;int * Available;};void scanf_num(int * li,int n){int i;for(i=0;i<n;i++){printf("输⼊第%d类资源数\n",i+1);scanf("%d",li);li ++;}}sys create_system(){system("cls");sys new_sys = (sys)malloc(sizeof(struct system));new_sys->resource_num = cur_resource;new_sys->Available = (int * )malloc((new_sys->resource_num) * sizeof(int));printf("输⼊系统拥有资源\n");scanf_num(new_sys->Available,new_sys->resource_num);return new_sys;}proc create_process(){system("cls");int i;proc new_process = (proc)malloc(sizeof(struct process));printf("输⼊进程编号\n");scanf("%d",&new_process->process_id);new_process->resource_num = cur_resource;new_process->Max = (int * )malloc((new_process->resource_num) * sizeof(int));printf("输⼊进程可执⾏资源数量\n");scanf_num(new_process->Max,new_process->resource_num);new_process->Allocation = (int * )malloc((new_process->resource_num) * sizeof(int)); printf("输⼊进程拥有资源数量\n");scanf_num(new_process->Allocation,new_process->resource_num);new_process->Need = (int * )malloc((new_process->resource_num) * sizeof(int));for(i=0;i<new_process->resource_num;i++){new_process->Need[i] = new_process->Max[i] - new_process->Allocation[i];}new_process->Finish = 0;new_process->flag = 0;new_process->request = (int * )malloc((new_process->resource_num) * sizeof(int)); return new_process;}sys deep_copy_system(sys d1){int i;sys new_sys = (sys)malloc(sizeof(struct system));new_sys->resource_num = d1->resource_num;new_sys->Available = (int * )malloc((new_sys->resource_num) * sizeof(int));for(i=0;i<d1->resource_num;i++){new_sys->Available[i] = d1->Available[i];}return new_sys;}proc deep_copy_process(proc p1){int i;proc new_process = (proc)malloc(sizeof(struct process));new_process->process_id = p1->process_id;new_process->resource_num = p1->resource_num;new_process->Max = (int * )malloc((new_process->resource_num) * sizeof(int));for(i=0;i<p1->resource_num;i++){new_process->Max[i] = p1->Max[i];}new_process->Allocation = (int * )malloc((new_process->resource_num) * sizeof(int)); for(i=0;i<p1->resource_num;i++){new_process->Allocation[i] = p1->Allocation[i];}new_process->Need = (int * )malloc((new_process->resource_num) * sizeof(int));for(i=0;i<new_process->resource_num;i++){new_process->Need[i] = new_process->Max[i] - new_process->Allocation[i];}new_process->Finish = p1->Finish;new_process->flag = p1->flag;new_process->request = (int * )malloc((new_process->resource_num) * sizeof(int)); for(i=0;i<p1->resource_num;i++){new_process->request[i] = p1->request[i];}return new_process;}void show_process_and_system(sys system,proc proc_list[],int process_num){int i,j,k;printf("|----------------------|--------------------------|--------------------------|--------------------------|--------------------------|\n");printf("| 进程名 | MAX | Allocation | Need | available |\n"); for(j=0;j<process_num;j++){printf(" \t P%d \t ",proc_list[j]->process_id);for(k=0;k<3;k++){printf(" ");if(k==0){for(i=0;i<proc_list[j]->resource_num;i++){printf(" %d ",proc_list[j]->Max[i]);}}if(k==1){for(i=0;i<proc_list[j]->resource_num;i++){printf(" %d ",proc_list[j]->Allocation[i]);}}if(k==2){for(i=0;i<proc_list[j]->resource_num;i++){printf(" %d ",proc_list[j]->Need[i]);}}}printf("\n");}printf(" ");for(k=0;k<system->resource_num;k++){printf(" %d ",system->Available[k]);}printf("\n");printf("|----------------------|--------------------------|--------------------------|--------------------------|--------------------------|\n");}void menu(){printf("1:输⼊编号进⾏请求\n");printf("2: \n");printf("0:退出\n");}proc serach_process(proc proc_list[255],int process_num,int proceess_id){int i;for(i=0;i<process_num;i++){if(proc_list[i]->process_id==proceess_id){return proc_list[i];}}return NULL;}bool intchkerr(proc p_test,proc p_test_list[255],int p_num,sys s_test){int i,j;int secure_array[p_num];int secure_count=0;int flag=1;int all_finish=0;int first_flag=0;while(1){for(i=0;i<p_num;i++){if(p_test_list[i]->Finish==0){flag =1;for(j=0;j<p_test_list[i]->resource_num;j++){if(p_test_list[i]->Need[j] <= s_test->Available[j]){flag=1;first_flag=1;}else{flag=0;first_flag=0;break;}}if(flag){for(j=0;j<s_test->resource_num;j++){s_test->Available[j] = s_test->Available[j] + p_test_list[i]->Allocation[j]; }secure_array[secure_count] = p_test_list[i]->process_id;secure_count = secure_count + 1;p_test_list[i]->Finish = 1;}}}//printf("执⾏了");for(i=0;i<p_num;i++){if(p_test_list[i]->Finish==1){all_finish = 1;}else{all_finish = 0;break;}}if(all_finish){printf("安全序列为");for(i=0;i<p_num;i++){printf("P%d -->",secure_array[i]);}printf("\n");return 1;}if(all_finish==0 && first_flag==0){printf("⽆安全序列");printf("\n");return 0;}}}bool Banker(proc p1,proc proc_list[255],int process_num,sys system_mod){ int i;sys system_test;proc process_test;proc temp;proc temp2;proc proc_list_test[255];for(i=0;i<p1->resource_num;i++){if(p1->request[i]>p1->Need[i]){printf("出错所需要的资源超过所宣布的最⼤值\n");return 0;}}for(i=0;i<p1->resource_num;i++){if(p1->request[i]>system_mod->Available[i]){printf("出错尚⽆⾜够资源\n");return 0;}}//printf("开始拷贝");system_test = deep_copy_system(system_mod);process_test = deep_copy_process(p1);for(i=0;i<process_num;i++){temp2 = proc_list[i];temp = deep_copy_process(temp2);proc_list_test[i] = temp;}for(i=0;i<process_test->resource_num;i++){system_test->Available[i] = system_test->Available[i] - process_test->request[i]; process_test->Allocation[i] = process_test->Allocation[i] + process_test->request[i]; process_test->Need[i] = process_test->Need[i] - process_test->request[i];}for(i=0;i<process_num;i++){if(proc_list_test[i]->process_id==process_test->process_id){proc_list_test[i] = process_test;}}//printf("进⾏安全性检查");if(intchkerr(process_test,proc_list_test,process_num,system_test)){return 1;}else{return 0;}}void menu_1(sys system_mod,proc proc_list[255],int process_num){system("cls");show_process_and_system(system_mod,proc_list,process_num);int process_id_in;proc user_serach_proc=NULL;int i;printf("输⼊进程编号\n");scanf("%d",&process_id_in);user_serach_proc = serach_process(proc_list,process_num,process_id_in);if(user_serach_proc){printf("输⼊需要的资源\n");scanf_num(user_serach_proc->request,user_serach_proc->resource_num);if(Banker(user_serach_proc,proc_list,process_num,system_mod)){printf("安全本次分配成功\n");}else{printf("不安全本次资源申请不成功\n");}}else{printf("⽆此进程\n");}system("pause");}int main(){int process_num;int i;int user_input;proc proc_list[255];printf("输⼊资源个数\n");scanf("%d",&cur_resource);sys system_mod = create_system();proc proc1 = NULL;printf("输⼊进程数量\n");scanf("%d",&process_num);for(i=0;i<process_num;i++){proc1 = create_process();proc_list[i] = proc1;}while(1){system("cls");show_process_and_system(system_mod,proc_list,process_num); menu();scanf("%d",&user_input);if(user_input==1){menu_1(system_mod,proc_list,process_num);}else if(user_input==0){break;}else{continue;}}return 0;}。
操作系统大作业 银行家算法
编程验证银行家算法一、实验目的银行家算法是避免死锁的一种重要方法,本设计要求编程实现银行家算法程序。
了解银行家算法运行的规律币,加深对银行家算法的了解。
二、实验原理银行家算法的思路:1)、进程一开始向系统提出最大需求量.2)、进程每次提出新的需求(分期贷款)都统计是否超出它事先提出的最大需求量.3)、若正常,则判断该进程所需剩余剩余量(包括本次申请)是否超出系统所掌握的剩余资源量,若不超出,则分配,否则等待.银行家算法的数据结构.1)、系统剩余资源量A[n],其中A[n]表示第I类资源剩余量.2)、各进程最大需求量,B[m][n],其中B[j][i]表示进程j对i类资源最大需求.3)、已分配资源量C[m][n],其中C[j][i]表示系统j程已得到的第i资源的数量.4)、剩余需求量.D[m][n],其中D[j][i]对第i资源尚需的数目.银行家算法流程:当某时刻,某进程时,提出新的资源申请,系统作以下操作:1)、判定E[n]是否大于D[j][n],若大于,表示出错.2)、判定E[n]是否大于系统剩余量A[n],若大于,则该进程等待.3)、若以上两步没有问题,尝试分配,即各变量作调整.4)、按照安全性推测算法,判断,分配过后,系统是否安全,若安全,则实际分配,否则,撤消分配,让进程等待."安全性检测"算法1)、先定义两个变量,用来表示推算过程的数据.F[n]=A[n],表示推算过程中,系统中剩余资源量的变化.J[n]=False表示推算过程中各进程是否假设"已完成"2)、流程:在"剩余"的进程中(在推算)过程中,一些进程假设已完成,查找D[j][n]<=F[n]的进程,找到后令J[j]=True(假设该进程完成),F[n]+D[j][n](该进程所占资源释放),如此循环执行.若最后,所有的F[n]=True(在推算过程中,所有进程均可以完成),则表示(分配过后)系统是安全的,否则系统是不安全的.三、实验内容在codeblock编译器下编写代码首先现编写一个库文件‘s.h’,定义一个结构体:typedef struct {int A;int B;int C;}RESOURCE;结构体里面的三个域分别表示三种资源的数量。
(完整word版)操作系统银行家算法课设
内容摘要本课设要完成的是编写一程序,能够模拟银行家算法和安全算法来避免死锁的问题。
我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。
操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。
当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。
若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。
关键词银行家算法C语言数据结构课程设计任务书目录:第一章绪论 (4)1.1 综述 (4)1.2设计内容与要求 (5)1.3 设计目的 (5)1.4设计地点 (5)1.5设计环境 (5)第二章程序设计与实现 (6)2 .1详细设计 (6)2.1 .1银行家算法数据结构设计描述 (6)2.1.2银行家算法实现描述 (6)2.1.3 程序流程图 (7)第三章程序调试与运行 (8)3.1运行结果 (8)第四章实验体会 (10)参考文献 (11)附录: (11)第一章绪论1.1 综述操作系统是现代计算机系统中最基本和最重要的系统软件,它是计算机科学与技术专业的一门重要的基础课程。
通过讲授本课程,学生可以全面的了解操作系统的概念,操作系统是一组能有效的组织和管理计算机硬件和软件资源,合理地对各类资源进行调度,以方便用户使用的程序的集合。
其作用是管理好这些设备,提高利用率和系统的吞吐量,为用户和应用程序提供简单的接口,便于用户使用。
学完操作系统,可以更好的搭建学生的专业基础知识。
本次课程设计在本着加强课本知识运用能力的前提下,老师给出银行家算法这个题目。
该题目主要是解决利用银行家算法和安全算法来避免死锁的问题。
操作系统实验之银行家算法
操作系统实验之银行家算法操作系统实验——银行家算法一、实验目的1、理解银行家算法。
2、掌握进程安全性检查的方法与资源分配的方法。
二、实验内容与基本要求编制模拟银行家算法的程序,并以下面给出的例子验证所编写的程序的正确性。
现在系统中A、B、C、D 4类资源分别还剩1、5、2、0个,请按银行家算法回答:1、现在系统是否处于安全状态?2、如果现在进程P1提出需要0、4、2、0个资源的请求,系统能否满足它的请求?三、实验报告内容1、银行家算法和安全性检查算法原理银行家算法:银行家算法最初级原为银行系统设计,以确保银行在发放现金贷款时,不会发生不能满足所有客户需要的情况。
在OS设计中,也可以用它来避免死锁。
为实现银行家算法,每个新进程在进入系统时它必须申明在运行过程中,可能需要的每种资源类型的最大单元数目,其数目不应超过系统所拥有的资源总量。
当某一进程请求时,系统会自动判断请求量是否小于进程最大所需,同时判断请求量是否小于当前系统资源剩余量。
若两项均满足,则系统试分配资源并执行安全性检查算法。
安全性检查算法 :安全性检查算法用于检查系统进行资源分配后是否安全,若安全系统才可以执行此次分配;若不安全,则系统不执行此次分配。
安全性检查算法原理为:在系统试分配资源后,算法从现有进程列表寻找出一个可执行的进程进行执行,执行完成后回收进程占用资源;进而寻找下一个可执行进程。
当进程需求量大于系统可分配量时,进程无法执行。
当所有进程均可执行,则产生一个安全执行序列,系统资源分配成功。
若进程无法全部执行,即无法找到一条安全序列,则说明系统在分配资源后会不安全,所以此次分配失败。
2、程序流程图3、程序及注释#include////////////////////////////////////////////////////////////////////////// //全局变量定义int Available[100]; //可利用资源数组int Max[50][100]; //最大需求矩阵int Allocation[50][100]; //分配矩阵int Need[50][100]; //需求矩阵int Request[50][100]; //M个进程还需要N类资源的资源量int Finish[50];int p[50];int m,n; //M个进程,N类资源///////////////////////////////////////////////////////////////////////// //安全性算法int Safe{int i,j,l=0;int Work[100]; //可利用资源数组for i=0;iWork[i]=Available[i];for i=0;iFinish[i]=0;for i=0;i{if Finish[i]==1continue;else{for j=0;j{if Need[i][j]>Work[j]break;}if j==n{Finish[i]=1;forint k=0;kWork[k]+=Allocation[i][k]; p[l++]=i;i=-1;}else continue;}if l==m{cout<<"系统是安全的"<<'\n'; cout<<"系统安全序列是:\n"; for i=0;i{cout<if i!=l-1cout<<"-->";}cout<<'\n';return 1;}}}////////////////////////////////////////////////////////////////////////////// /////银行家算法int main{int i,j,mi;cout<<"输入进程的数目:\n";cin>>m;cout<<"输入资源的种类:\n";cin>>n;cout<<"输入每个进程最多所需的各类资源数,按照"<for i=0;iforj=0;jcin>>Max[i][j];cout<<"输入每个进程已经分配的各类资源数,按照"<for i=0;i{forj=0;j{cin>>Allocation[i][j];Need[i][j]=Max[i][j]-Allocation[i][j];if Need[i][j]<0{cout<<"你输入的第"<j--;continue;}}}cout<<"请输入各个资源现有的数目:\n";for i=0;icin>>Available[i];Safe;while 1{cout<<"输入要申请的资源的进程号:第一个进程号为0,第二个进程号为1,依此类推\n";cin>>mi;cout<<"输入进程所请求的各个资源的数量\n";for i=0;icin>>Request[mi][i];for i=0;i{if Request[mi][i]>Need[mi][i]{cout<<"所请求资源数超过进程的需求量!\n";return 0;}if Request[mi][i]>Available[i]{cout<<"所请求资源数超过系统所有的资源数!\n"; return 0;}}for i=0;i{Available[i]-=Request[mi][i];Allocation[mi][i]+=Request[mi][i];Need[mi][i]-=Request[mi][i];}if Safecout<<"同意分配请求\n";else{cout<<"SORRY╮╯▽╰╭……你的请求被拒绝…\n"; for i=0;iAvailable[i]+=Request[mi][i];Allocation[mi][i]-=Request[mi][i];Need[mi][i]+=Request[mi][i];}}for i=0;iFinish[i]=0;char Flag; //标志位cout<<"是否再次请求分配?是请按Y/y,否请按N/n"; while 1{cin>>Flag;if Flag=='Y'||Flag=='y'||Flag=='N'||Flag=='n' break;else{cout<<"请按要求重新输入:\n";continue;}}if Flag=='Y'||Flag=='y'continue;else break;}4、运行结果以及结论图示为题目所给定的条件下的程序运行结果。
操作系统大作业-银行家算法
编程验证银行家算法一、实验目的银行家算法是避免死锁的一种重要方法,本设计要求编程实现银行家算法程序。
了解银行家算法运行的规律币,加深对银行家算法的了解。
二、实验原理银行家算法的思路:1)、进程一开始向系统提出最大需求量.2)、进程每次提出新的需求(分期贷款)都统计是否超出它事先提出的最大需求量.3)、若正常,则判断该进程所需剩余剩余量(包括本次申请)是否超出系统所掌握的剩余资源量,若不超出,则分配,否则等待.银行家算法的数据结构.1)、系统剩余资源量A[n],其中A[n]表示第I类资源剩余量.2)、各进程最大需求量,B[m][n],其中B[j][i]表示进程j对i类资源最大需求.3)、已分配资源量C[m][n],其中C[j][i]表示系统j程已得到的第i资源的数量.4)、剩余需求量.D[m][n],其中D[j][i]对第i资源尚需的数目.银行家算法流程:当某时刻,某进程时,提出新的资源申请,系统作以下操作:1)、判定E[n]是否大于D[j][n],若大于,表示出错.2)、判定E[n]是否大于系统剩余量A[n],若大于,则该进程等待.3)、若以上两步没有问题,尝试分配,即各变量作调整.4)、按照安全性推测算法,判断,分配过后,系统是否安全,若安全,则实际分配,否则,撤消分配,让进程等待."安全性检测"算法1)、先定义两个变量,用来表示推算过程的数据.F[n]=A[n],表示推算过程中,系统中剩余资源量的变化.J[n]=False表示推算过程中各进程是否假设"已完成"2)、流程:在"剩余"的进程中(在推算)过程中,一些进程假设已完成,查找D[j][n]<=F[n]的进程,找到后令J[j]=True(假设该进程完成),F[n]+D[j][n](该进程所占资源释放),如此循环执行.若最后,所有的F[n]=True(在推算过程中,所有进程均可以完成),则表示(分配过后)系统是安全的,否则系统是不安全的.三、实验内容在codeblock编译器下编写代码首先现编写一个库文件‘’,定义一个结构体:typedef struct {int A;int B;int C;}RESOURCE;结构体里面的三个域分别表示三种资源的数量。
操作系统 银行家算法
《计算机操作系统》课程设计报告——设计题目:银行家算法学院:专业:班级:学号:姓名:一、实验要求:1.实验目的根据设计题目的要求,充分地分析和理解题目,叙述系统的要求,明确程序要求实现的功能以及限制条件。
明白自己需要用代码实现的功能,清楚编写每部分代码的目的,做到有的放矢,有条理不遗漏的用代码实现银行家算法。
2.题目描述银行家算法是一种最具有代表性的避免死锁的算法。
要解释银行家算法,必须先解释操作系统的安全状态和不安全状态。
所谓安全状态,是指系统能按照某种进程顺序{P1,P2,…,Pn}(称{P1,P2,…,Pn }序列为安全序列),来为每个进程Pi分配其所需资源,直至满足每个进程对资源的最大需求,使每个进程都可以顺利完成。
安全状态一定没有死锁发生。
如果系统无法找到这样一个安全序列,则称系统处于不安全状态。
如果对每一个进程Pi(1<i<n),它以后尚需要的资源量不超过系统当前可利用的资源量与所有的进程Pj(j<n)所占有的资源量之和,则称此进程序列{P1,P2,…,Pn}是安全的,称作安全序列。
3.基本需求(1)可以输入某系统的资源以及T0时刻进程对资源的占用及需求情况的表项,以及T0时刻系统的可利用资源数。
(2)对T0时刻的进行安全性检测,即检测在T0时刻该状态是否安全。
(3)进程申请资源,用银行家算法对其进行检测,分为以下三种情况:A. 所申请的资源大于其所需资源,提示分配不合理不予分配并返回。
B. 所申请的资源未大于其所需资源,但大于系统此时的可利用资源,提示分配不合理不予分配并返回。
C. 所申请的资源未大于其所需资源,亦未大于系统此时的可利用资源,预分配并进行安全性检查:a. 预分配后系统是安全的,将该进程所申请的资源予以实际分配并打印后返回。
b. 与分配后系统进入不安全状态,提示系统不安全并返回。
(4)对输入进行检查,即若输入不符合条件,应当报错并返回重新输入。
二、概要设计:1. 算法步骤:A:银行家算法:设进程cusneed提出请求REQUEST [i],则银行家算法按如下规则进行判断。
(完整word版)操作系统课程设计(银行家算法的模拟实现)剖析
操作系统课程设计(银行家算法的模拟实现)一、设计目的1、进一步了解进程的并发执行。
2、加强对进程死锁的理解。
3、用银行家算法完成死锁检测。
二、设计内容给出进程需求矩阵C、资源向量R以及一个进程的申请序列.使用进程启动拒绝和资源分配拒绝(银行家算法)模拟该进程组的执行情况.三、设计要求1、初始状态没有进程启动.2、计算每次进程申请是否分配,如:计算出预分配后的状态情况(安全状态、不安全状态),如果是安全状态,输出安全序列。
3、每次进程申请被允许后,输出资源分配矩阵A和可用资源向量V。
4、每次申请情况应可单步查看,如:输入一个空格,继续下个申请.四、算法原理1、银行家算法中的数据结构(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]2、银行家算法应用模拟实现Dijkstra的银行家算法以避免死锁的出现,分两部分组成:一是银行家算法(扫描);二是安全性算法。
(1)银行家算法(扫描)设Requesti是进程Pi的请求向量,如果Requesti[j]=K,表示进程Pi需要K个Ri类型的资源.当Pi发出资源请求后,系统按下述步骤进行检查:①如果Requesti[j]<=Need[i,j],便转向步骤②;否则认为出错,因为它所需的资源数已经超过了它所宣布的最大值。
《银行家算法》Word文档
设当前的系统状态如下表所示,系统此时Available=(1,1,2)。
问题:(1)(2) 此时系统是否处于安全状态,为什么?如果安全,则请给出一个安全序列;(3) 当P2发出资源请求向量request2(1,0,1),此时系统能否把资源分配给它?为什么?如果能分配给它,则请给出一个安全序列;(4) 若在P2发出资源请求向量request2(1,0,1)后,若P1发出资源请求向量request1(1,0,1),此时系统能否把资源分配给它?为什么?(5) 若在P1发出资源请求向量request1(1,0,1)后,若P3发出资源请求向量request3(0,0,1),此时系统能否把资源分配给它?为什么?解答:(1) 各个进程还需要的资源数Cki-Aki(2) P3,P4。
(3) 当P2发出资源请求向量request2(1,0,1),此时系统可以把资源分配给它,因为系统是安全的,相应的安全序列为:P2,P1,P3,P4。
(4) 若在P2发出资源请求向量request2(1,0,1)后,若P1发出资源请求向量request1(1,0,1),此时系统不能把资源分配给它,因为此时系统资源不足。
(5) 若在P1发出资源请求向量request1(1,0,1)后,若P3发出资源请求向量request3(0,0,1),此时系统不能把资源分配给它,因为如果分配,系统不安全,会导致死锁。
设系统中A、B、C、D共4种资源,在某时刻进程P0、P1、P2、P3、P4对资源的占有和需求情况如下表所示。
问题:(1) 计算各个进程还需要的资源数Cki-Aki;(2) 此时系统是否处于安全状态,为什么?如果安全,则请给出一个安全序列;(3) 若在P0发出资源请求向量request0(0,0,1,1)后,此时系统把资源分配给它是否安全?如果安全,则请给出一个安全序列;(4) 当P2发出资源请求向量request2(1,2,2,2),此时系统能否把资源分配给它?为什么?(5) 若在P0发出资源请求向量request0(0,0,1,1)后,P4若发出资源请求向量request4(0,6,2,2),此时系统能否把资源分配给它?为什么?(1) 各个进程还需要的资源数Cki-Aki(2) P1,P2。
银行家算法(操作系统)
银行家算法(操作系统)银行家算法(操作系统)一、概述银行家算法是一种用于避免进程死锁的资源分配算法。
在多进程并发执行的系统中,进程需要申请和释放资源,而银行家算法可以通过判断资源申请是否会导致系统陷入死锁状态,从而保证系统的安全性和可靠性。
二、系统资源1. 资源类型系统中的资源可以分为不同类型,比如A、B、C等。
每种资源类型都有固定的数量,例如A类型资源有10个。
不同资源类型之间是独立的,即没有关联性。
2. 可用资源在系统中,每种资源类型都有一定数量的可用资源。
初始情况下,可用资源数目应该与系统中实际可用资源数目相对应。
3. 进程资源申请和释放进程可以通过申请资源来执行运算或操作。
如果系统能够满足进程的资源需求,则满足其资源请求,否则,该进程必须等待直到所需资源变得可用。
当进程完成了对资源的操作后,必须释放这些资源,以便其他进程可以使用。
三、银行家算法原理1. 数据结构银行家算法通过维护以下数据结构来判断系统是否处于安全状态:- Avlable: 一维数组,表示每种资源类型的可用数量。
- Max: 二维数组,表示每个进程对每种资源类型的最大需求量。
- Allocation: 二维数组,表示每个进程已经分配到的资源数量。
- Need: 二维数组,表示每个进程还需要的资源数量。
2. 安全状态系统处于安全状态的条件是:存在一个安全序列,使得该序列中每个进程的资源需求能够被满足。
3. 安全检查银行家算法通过进行安全检查来判断系统是否处于安全状态。
检查过程包括以下步骤:- 初始化Work为Avlable。
- 找到一个进程i,使得Need[i] <= Work。
如果这样的进程不存在,则转到步骤5。
- 分配资源给进程i。
- 执行资源分配后的安全性检查,即临时修改Work和Allocation。
- 如果系统处于安全状态,则转到步骤2;否则,继续进行步骤5。
- 如果所有进程都获得了所需的资源,则系统处于安全状态;否则,系统处于不安全状态。
计算机操作系统的银行家算法
计算机操作系统的银行家算法一、需求分析1、进程的状态有:就绪,等待和完成。
当系统不能满足进程的资源请求时,进程出于等待状态。
资源需求总量表示进程运行过程中对资源的总的需求量。
已占资源量表示进程目前已经得到但还为归还的资源量。
因此,进程在以后还需要的剩余资源量等于资源需要总量减去已占资源量。
陷入每个进程的资源需求总量不应超过系统拥有的资源总量。
2、银行家算法分配资源的原则是:当某个进程提出资源请求时,假定先分配资源给它,然后查找各进程的剩余请求,检查系统的剩余资源量是否由于进程的分配而导致系统死锁。
若能,则让进程等待,否则,让进程的假分配变为真分配。
1查找各进程的剩余请求,检查系统的剩余资源量是否能满足其中一进程,如果能,则转B。
2将资源分配给所选的进程,这样,该进程已获得资源最大请求,最终能运行完成。
标记这个进程为终止进程,并将其占有的全部资源归还给系统。
重复第1步2步,直到所有进程都标记为终止进程,或知道一个死锁发生。
若所有进程都标记为终止进程,则系统的初始状态是安全的,否则为不安全的。
若安全,则正式将资源分配给它,否则,假定的分配作废,让其等待。
二、系统结构设计1、设计分析当某个进程对某类资源提出请求时,假定先分配资源给它,然后查找各进程的剩余请求,检查系统的剩余资源量是否由于进程的分配而导致系统死锁。
若能,则让进程等待,否则,让进程的假分配变为真分配。
2、数据结构1可利用资源向量Available。
这是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可利用资源的数目,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可利用资源的数目,其数值随该类资源的分配和回首而动态的改变,如果Available=K,则代表Rj 类资源K个。
2最大需求矩阵Max。
这是一个n×m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。
(操作系统)银行家算法
(操作系统)银行家算法解析银行家算法(09信管一班 2009970037 许可成)摘要:银行家算法是操作系统中采用避免死锁策略来解决死锁问题的一种算法。
本文以银行家算法为主线,从银行家算法的起源,命名,再到算法的流程,深入解析了银行家算法的根本原理。
关键字:银行家算法,数据结构,死锁避免。
在操作系统中,有一个重要的东西,就是进程,可以说,进程直接关系到了运行的效率,然而,有一个问题也随之产生,那就是死锁问题:多个进程同时占有对方需要的资源而同时请求对方的资源,而它们在得到请求之前不会释放所占有的资源,那么就会导致死锁的发生,也就是进程不能实现同步。
死锁在操作系统中,是一个重要的概念,它不仅在操作系统中有提到,在数据库,以及只要涉及到并发操作的,几乎都提到了这个问题了……很多人为了解决死锁的困扰,也想出了很多办法,其中著名的就“有银行家算法”,以及“安全性检查算法”等等著名算法,这里,我盟就详细的说一下银行家算法。
银行家通过发放贷款而获取利润,要获取利润必须按时收㈦贷款本金和利息,即贷款企业要按时还本付息,而tI有各企业能不断获得所需资金最终完成项目才能还本付息。
要避免的情况是:在某个时刻,备并行推进项目的企业均得到了一部分贷款,要使项目顺利推进还需要贷款,而银行家已经没有多余资金,从而导致各企业问循环等待埘方释放其占有的资金而使项目中断,造成一种僵滞局面,银行家冈收不回贷款而破产。
操作系统的资源分配类似于银行家贷款。
操作系统就像一个银行家,系统临界资源就像银行家的贷款本金,并发进程就像需要贷款的企业。
冈此可把银行家规避风险的算法引入操作系统的资源分配,解决资源分配中的死锁问题。
这就是银行家算法这一名称的由来。
在操作系统的资源分配问题中要解决的是:一组并发进程{P1,P2,⋯,Pn}共享一组临界资源{R1,R2,⋯,Rm},Ri指一类资源。
;'前,有一个进程Pi向操作系统提出了资源请求Requesta=(rl,r2,⋯,rm)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统课程设计银行家算法第一章引言1.1 课程设计目地:操作系统是计算机系统的核心系统软件,它负责控制和管理整个系统的资源并组织用户协调使用这些资源,使计算机高效的工作。
课程设计的目的是综合应用学生所学知识,通过实验环节,加深学生对操作系统基本原理和工作过程的理解,提高学生独立分析问题、解决问题的能力,增强学生的动手能力。
第二章银行家算法描述2.1 银行家算法简介:银行家算法是一种最有代表性的避免死锁的算法。
在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。
要解释银行家算法,必须先解释操作系统安全状态和不安全状态。
安全状态:如果存在一个由系统中所有进程构成的安全序列P1,…,Pn,则系统处于安全状态。
安全状态一定是没有死锁发生。
不安全状态:不存在一个安全序列。
不安全状态不一定导致死锁。
那么什么是安全序列呢?安全序列:一个进程序列{P1,…,Pn}是安全的,如果对于每一个进程Pi(1≤i≤n),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj (j <i )当前占有资源量之和。
2.2 银行家算法描述:我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。
操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。
当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。
若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。
2.3银行家算法原理2.3.1银行家算法的思路先对用户提出的请求进行合法性检查,即检查请求的是不大于需要的,是否不大于可利用的。
若请求合法,则进行试分配。
最后对试分配后的状态调用安全性检查算法进行安全性检查。
若安全,则分配,否则,不分配,恢复原来状态,拒绝申请。
2.3.2 银行家算法中用到的主要数据结构可利用资源向量 int Available[j] j为资源的种类。
最大需求矩阵 int Max[i][j] i为进程的数量。
分配矩阵 int Allocation[i][j]需求矩阵 int need[i][j]= Max[i][j]- Allocation[i][j]申请各类资源数量 int Request i[j] i进程申请j资源的数量工作向量 int Work[x] int Finish[y]2.3.3 银行家算法bank()进程i发出请求申请k个j资源,Request i[j]=k(1)检查申请量是否不大于需求量:Request i[j]<=need[i,j],若条件不符重新输入,不允许申请大于需求量。
(2)检查申请量是否小于系统中的可利用资源数量:Request i[j]<=available[i,j],若条件不符就申请失败,阻塞该进程,用goto语句跳转到重新申请资源。
(3)若以上两个条件都满足,则系统试探着将资源分配给申请的进程,并修改下面数据结构中的数值:Available[i,j]= Available[i,j]- Request i[j];Allocation[i][j]= Allocation[i][j]+ Request i[j];need[i][j]= need[i][j]- Request i[j];(4)试分配后,执行安全性检查,调用safe()函数检查此次资源分配后系统是否处于安全状态。
若安全,才正式将资源分配给进程;否则本次试探分配作废,恢复原来的资源分配状态,让该进程等待。
(5)用do{…}while 循环语句实现输入字符y/n判断是否继续进行资源申请。
2.3.4安全性检查算法(safe()函数)(1)设置两个向量:工作向量Work,它表示系统可提供给进程继续运行所需的各类资源数目,在执行安全性算法开始时,Work= Available。
Finish,它表示系统是否有足够的资源分配给进程,使之运行完成。
开始时先做Finish[i]=0;当有足够的资源分配给进程时,再令Finish[i]=1。
(2)在进程中查找符合以下条件的进程:条件1:Finish[i]=0;条件2:need[i][j]<=Work[j]若找到,则执行步骤(3)否则,执行步骤(4)(3)当进程获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:Work[j]= Work[j]+ Allocation[i][j];Finish[i]=1;goto step 2;(4)如果所有的Finish[i]=1都满足,则表示系统处于安全状态,否则,处于不安全状态。
第三章银行家算法流程图3.1 系统主要过程流程图3.2银行家算法流程图3.3、安全性算法流程图第四章源程序结构分析4.1 程序结构4.1.1初始化chushihua():用于程序开始进行初始化输入数据:进程数量、资源种类、各种资源可利用数量、各进程的各种资源已分配数量、各进程对各类资源最大需求数等。
4.1.2当前安全性检查safe():用于判断当前状态安全性,根据不同地方的调用提示处理不同。
4.1.2 银行家算法bank():进行银行家算法模拟实现的模块,调用其他各个模块进行银行家算法模拟过程。
4.1.4 显示当前状态show():显示当前资源分配详细情况,包括:各种资源的总数量(all)、系统目前各种资源可用的数量、各进程已经得到的资源数量、各进程还需要的资源量。
4.1.5主程序main()逐个调用初始化、显示状态、安全性检查、银行家算法函数,使程序有序的进行。
4.2 数据结构程序使用的全局变量:const int x=10,y=10; //定义常量int Available[x]; //各种资源可利用的数量int Allocation[y][y]; //各进程当前已分配的资源数量int Max[y][y]; //各进程对各类资源的最大需求数int Need[y][y]; //还需求矩阵int Request[x]; //申请各类资源的数量int Work[x]; //工作向量,表系统可提供给进程运行所需各类资源数量int Finish[y]; //表系统是否有足够的资源分配给进程,0为否,1为是int p[y]; //存储安全序列int i,j; //全局变量,主要用于循环语句中int n,m; //n为进程的数量,m为资源种类数int l=0,counter=0;4.3 函数声明void chushihua(); //系统初始化函数void safe(); //安全性算法函数void bank(); //银行家算法函数void show (); //输出当前资源分配情况4.4 主函数main()int main(){cout<<…… //显示程序开始提示信息chushihua(); //初始化函数调用cout<<endl<<endl;showdata(); //输出初始化后的状态//===判断当前状态的安全性===safe(); //安全性算法函数调用if (l<n){cout<<"\n当前状态不安全,无法申请,程序退出!!!!!"<<endl; cout<<endl;system("pause");sign(); //调用签名函数return 0; // break;}else{int i; //局部变量l=0;cout<<"\n安全的状态!!!"<<endl;cout<<"安全序列为: ";cout<<endl<<"进程"<<"("<<p[0]<<")"; //输出安全序列,考虑显示格式,先输出第一个for (i=1; i<n; i++){cout<<"==>>"<<"进程"<<"("<<p[i]<<")";}for (i=0; i<n; i++) Finish[i]=0; //所有进程置为未分配状态cout<<endl<<endl;}bank(); //银行家算法函数调用return 0;}第五章银行家算法代码实现5.1源程序代码:#include <iostream.h>#include <vector>#include <iomanip>using namespace std;#define TRUE 1 //定义 TRUE =1#define FALSE 0 //定义 FLASE=0voidbank(vector<int>,vector<vector<int> >,vector<vector<int> >,int ,int ); //声明bank(应行家算法)int safe(vector<int> Available,vector<vector<int> >Need,vector<vector<int> > Allocation,int n,int m);//声明safe()安全性算法void init();/*************************************主函数main()**************************************************************/void main(){init();int safe(vector<int> Available,vector<vector<int> >Need,vector<vector<int> > Allocation,int n,int m);}/**************************************初始化函数init()*********************************************************/// 下面的是在dos命令下使用的程序void init(){int m; //m资源类数int n; //进程数cout<<"输入资源类数"<<endl;cin>>m;vector<int> Available(m); //动态申请数组Available可用资源向量cout<<"输入各类资源总数:"<<endl;for (int i=0;i<m;i++){cout<<"输入R"<<i<<"类资源总数:";cin>>Available[i];}cout<<"\n输入进程数"<<endl;cin>>n;vector<vector<int> > Max(n, vector<int>(m));{cout<<"输入进程"<<i<<"的最大需求向量";for (int j=0;j<m;j++){cout<<" 输入需要R"<<j<<"类资源的最大数目";cin>>Max[i][j];while (Max[i][j]>Available[j]){cout<<j<<"类资源最大需求超过该类资源总量,重新输入";cin>>Max[i][j];}}}cout<<"输入已分配的Allocation"<<endl;vector<vector<int> > Allocation(n, vector<int>(m));vector<vector<int> > Need(n, vector<int>(m));for ( i=0;i<n;i++){cout<<"输入为进程"<<i<<"的分配向量";for (int j=0;j<m;j++){cout<<" 输入分配R"<<j<<"类资源的数目";cin>>Allocation[i][j];while(Allocation[i][j]>Max[i][j]){cout<<j+1<<"类资源最大需求超过该类需求资源总量,重新输入";cin>>Allocation[i][j];}Need[i][j]=Max[i][j]-Allocation[i][j];Available[j] =Available[j]-Allocation[i][j];}}int safe(vector<int> Available,vector<vector<int> >Need,vector<vector<int> > Allocation,int n,int m);cout<<"此状态安全!"<<endl;bank(Available,Need,Allocation,n,m);//调用银行家算法bank()函数}// 下面的是在文件中导入我们所需的信息/*/void init(){int m; //m资源类数int n; //进程数cout<<"输入资源类数"<<endl;cin>>m;vector<int> Available(m); //动态申请数组Available可用资源向量cout<<"输入各类资源总数:"<<endl;FILE *fp;fp=fopen("Available.txt","r+");cout<<"从Available.txt文件中读入数据,并输出"<<endl;for(int i=0;i<m;i++){fscanf(fp,"%d",&Available[i]);cout<<Available[i]<<'\t';}fclose(fp);cout<<"\n输入进程数"<<endl;cin>>n;vector<vector<int> > Max(n, vector<int>(m));fp=fopen("Max.txt","r+");cout<<"从Max.txt文件中读入数据,并输出"<<endl;for(i=0;i<n;i++){for (int j=0;j<m;j++){fscanf(fp,"%d",&Max[i][j]);cout<<Max[i][j]<<" ";}cout<<endl;}fclose(fp);cout<<"输入已分配的Allocation"<<endl;vector<vector<int> > Allocation(n, vector<int>(m));vector<vector<int> > Need(n, vector<int>(m));fp=fopen("Allocation.txt","r+");cout<<"Allocation.txt从文件中读入数据,并输出"<<endl;for(i=0;i<n;i++){for (int j=0;j<m;j++){fscanf(fp,"%d",&Allocation[i][j]);Need[i][j]=Max[i][j]-Allocation[i][j]; //在初始化Max时,同时初始化Need数组Available[j] =Available[j]-Allocation[i][j]; //在初始化Max时,同时修改Available数组cout<<Allocation[i][j]<<' ';}cout<<endl;}fclose(fp);int safe(vector<int> Available,vector<vector<int> >Need,vector<vector<int> > Allocation,int n,int m);cout<<"此状态安全!"<<endl;bank(Available,Need,Allocation,n,m);//调用银行家算法bank()函数}/*//**************************************银行家算法bank()函数*********************************************************/void bank(vector<int> Available,vector<vector<int> >Need,vector<vector<int> > Allocation,int n,int m){vector<int> Request(m);int all=0;//定义变量all,如果all==0,表示进程已经运行完,如果all>=1,表示还有进程没有运行完for (int i=0;i<n;i++)for(int j=0;j<m;j++)all +=Need[i][j];if (0==all){cout<<"所有进程已经运行完,结束"<<endl;exit(0);}int jc;//任选一个进程char again;all=0;//重新初始化all,while (1){while (all==0){all=0;//如果all==0,表示进程已经运行完,如果all>=1,表示还有进程没有运行完//循环直至all>0,即找到一个未运行完的进程cout<<"任选一个进程作为当前进程0--"<<n-1<<endl;cin>>jc;for (int j=0;j<m;j++){all += Need[jc][j];}if (0==all){cout<<"此进程已经运行,重新输入"<<endl;}}cout<<"输入该进程的请求向量"<<endl;for (i=0;i<m;i++){cin>>Request[i];while(Request[i]>Need[jc][i]||Request[i]>Available[i]){cout<<"请求向量无法满足"<<endl;break;}}///////////////////////////////////////////////////////////////// ///////////系统试探着把资源分配给该进程///////////////////////////////////////////for (i=0;i<m;i++){Available[i]=Available[i]-Request[i];Allocation[jc][i]=Allocation[jc][i]+Request[i];Need[jc][i]=Need[jc][i]-Request[i];}int bb=0;bb=safe(Available,Need,Allocation,n,m);//调用安全性算法,判断此次资源分配后,系统是否处安全状态if (1==bb){cout<<"系统成功分配资源"<<endl;}else{cout<<"系统未能成分配资源,收回预分配资源"<<endl;for (i=0;i<m;i++){Available[i]=Available[i]+Request[i];Allocation[jc][i]=Allocation[jc][i]-Request[i];Need[jc][i]=Need[jc][i]+Request[i];}}cout<<"您还想再次请求分配吗?是请按y/Y,否请按其它键"<<endl;cin>>again;if(again=='y'||again=='Y'){all=0;continue;}break;}}/**************************************安全性算法safe()函数*********************************************************/int safe(vector<int> Available,vector<vector<int> >Need,vector<vector<int> > Allocation,int n,int m){vector<int> Work(m),Finish(n);//申请工作向量work,finish Work=Available;vector<int> count(n); //记录安全序列int len=-1; //记录安全序列的进程个数,如果len==n,即表示所有的finish【i】=true,处于安全状态for(int i=0;i<m;i++)Finish[i]=FALSE;for (i=0;i<n;i++){int needed=1;for (int j=0;j<m;j++){if(Need[i][j]<=Work[j]){needed=needed*TRUE;}else needed=needed*FALSE;}if ((Finish[i]==FALSE)&&needed==1){for (j=0;j<m;j++){Work[j]=Work[j]+Allocation[i][j];}Finish[i]=TRUE;len=len+1;count[len]=i;i=-1;}}if (len==n-1){cout<<"系统是安全的"<<endl;cout<<"安全序列"<<endl;for (i=0;i<=len;i++){cout<<count[i];if (i!=len){cout<<"-->";}}cout<<endl;return TRUE;}else{cout<<"系统是不安全的"<<endl; return FALSE; }}第六章运行结果6.1初始化结果6.1.1通过文本初始化:测试使用的是文本导入信息6.1.2 安全检验6.1.3 dos命令下的手动输入,我们就不做了第七章课程设计总结操作系统的基本特征是并发与共享。