- 1、本文档共13页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
实验三 模拟银行家算法
一、实验目的
模拟实现银行家算法,用银行家算法实现资源分配和安全性检查。通过本次实验,使学生加深对死锁概念的理解和掌握,并培养学生对操作系统课程的兴趣与高级语言设计的能力。?
二、实验内容及要求
实验内容:用C语言编写程序,模拟实现银行家算法分配过程;
实验要求:
设计五个进程{P0,...P4}共享三类资源{A,B,C}的系统,每一种资源数量为10,5,7。进程可动态的申请和释放资源,系统按各进程的申请动态地分配资源,在T0时刻的资源分配情况如下表:
Name Max Allocation Need Available
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
P4 4,3,3 0,0,2 4,3,1
银行家算法流程
(1) 银行家算法的数据结构
?Resource:一个长度为m向量,表示系统拥有的资源数目。
?Available:一个长度为m向量,表示每类资源的可用数目。
?Max:一个m×n矩阵,定义每个进程的最大资源需求数。
?Allocation:一个m×n矩阵,定义当前分配给每个进程每类资源的数目。
?Need:一个m×n矩阵,表示每个进程还需多少资源。
(2) 实现银行家算法 设:Requesti是进程Pi的请求向量。
当Pi发出资源请求后,系统按如下步骤进行检查:
?如果Request[j] Need[i][j] 则go to 2,否则认为出错。
?如果Request[j] < Available[i][j] 则go to 3,否则表示无足够资源, Pi等待。
?系统进行试探分配,并求该相应数据结构数据
Available:= Available- Requesti
Allocationi:= Allocationi+ Requesti
Needi:= Needi-Requesti
?系统执行安全性算法:安全,把资源分配给Pi,否则, Pi等待。
(3) 实现安全性算法
?设Work 和 Finish是长度分别为m,n的向量
初试值Work =Available ,Finishi = False(所有)
?从进程集合中找到一个能满足下列条件的进程
a. Finishi= False
b. Needi Work 如找到go to 3 否则 go to 4
?当进程Pi 获得资源后,顺利执行,直至完成,并释放分配给它的资源。
Work = Work+ Allocationi
Finishi:= True go to 2
?如果所有进程的Finishi= True 则表示系统安全,否则为不安全。
————————————————
3.参考程序及注释
(注:创建程序源文件的后缀不加.c系统默认生成.cpp文件)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//系统中每种资源的可利用资源数
int available[100] = { 0 };
//进程的最大需求资源数
int max[100][100] = { 0 };
//系统刚开始每个进程已占用资源数
int allocation[100][100] = { 0 };
//每个进程还需要的资源数
int need[100][100] = { 0 };
//判断每个进程是否安全
int Finish[100] = { 0 };
//安全序列号
int safeSeries[100];
//进程请求资源量
int request[100];
//资源计数变量,便于判断安全性
int num;
//系统当前可分配资源量
int work[1000];
//资源种类数和进程数
int resourseType, customerNumber;
//作为是否输入数据的判断变量
int flag = 0;
//函数声明
int isFinish(int row);
void SafeInfo(int* work, int index);
int judSystemSecurity();
int judSystemSecurity_1();
void judRequestSecurity();
void showMenu();
v
文档评论(0)