银行家算法实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
南华大学
计算机学院
实验报告
(2018学年春季学期)
课程名称操作系统实验名称银行家算法
姓名学号
专业网络工程班级1班
地点教师曹军
一、实验题目:
系统中有 m 个同类资源被 n 个进程共享,每个进程对资源的最大需求数分别为S1, S2,…,Sn,且Max(Si)<=m, (i=1,2,…n)。进程可以动态地申请资源和释放资源。编写一个程序,实现银行家算法,当系统将资源分配给某一进程而不会死锁时,就分配之。否则,推迟分配,并显示适当的信息。
二、实验目的:
当系统的总资源数 m 小于或等于所有进程对资源的最大需求S n n i ∑ i −=1 时,就可能产生死锁。死锁会引起计算机系统的瘫痪。银行家算法是在实现资源分配时避免死锁的一个著名算法,该算法是在能确保系统处于安全状态时才把资源分配给申请者。通过本实验进一步理解死锁的概念,并选择一个算法来避免死锁。
进一步理解利用银行家算法避免死锁的问题; 在了解和掌握银行家算法。理解和掌握安全序列、安全性算法。
三、实验内容及要求:
1、设计进程对各类资源最大申请表示及初值的确定。
2、设定系统提供资源的初始状况。
3、设定每次某个进程对各类资源的申请表示。
4、编制程序,依据银行家算法,决定其资源申请是否得到满足。
5、显示资源申请和分配时的变化情况。
四、实验过程:
程序要求:
1. 判断当前状态是否安全,如果安全,给出安全序列;如果不安全给出理由。
2. 对于下一个时刻T1,某个进程Pk会提出请求Request(R1, … ,Rm),判断分配给P k进程请求的资源之后是否安全。如果安全,给出安全序列;如果不安全给出理由。
3. 输入:进程个数n,资源种类m,T0时刻各个进程的资源分配情况(可以运行输入,也可以在程序中设置)。
4. 输出:如果安全输出安全的进程序列,不安全提示信息。
进程调度的实现过程:
1. 变量初始化;
2. 接收用户输入n,m,(输入或者默认的)Allocationij,Need ij;
3. 按照银行家算法判断当前状态安全与否,安全给出安全序列,不安全给出提示;
4. 如果安全,提示用户输入下一时刻进程Pk的资源请求Request(R1, … ,Rm);
5. 如果不安全或者无新请求则退出。
源代码:
#include
#include
#include
#include
#include
using namespace std;
#define MaxNumber 20
static int n;
static int m;
static int Available[MaxNumber];
static int Max[MaxNumber][MaxNumber];
static int Allocation[MaxNumber][MaxNumber];
static int Need[MaxNumber][MaxNumber];
static int Request[MaxNumber];
static int SafeOrder[MaxNumber];
static bool Finish[MaxNumber];
static bool isDisplayAvaliable = true;
static char sourceName[] = {'A','B','C','D','E','F','G','H','I','J','K'}; //资源名称
void input();
bool isSystemSafe();
void bankerAlgorithm();
void display();
int main()
{
input();
bankerAlgorithm();
system("pause");
return 0;
}
void input()
{
//int n=6;
//int m=3;
ifstream inData;
inData.open("C:/476.txt");
//读取数据
inData>>n;
inData>>m;
for (int i=0;i { inData>>Available[i]; } for (int i=0;i { for (int j=0;j { inData>>Allocation[i][j]; } } for (int i=0;i { for (int j=0;j { inData>>Need[i][j]; } } for (int i=0;i { for (int j=0;j { Max[i][j] = Need[i][j] + Allocation[i][j]; } } cout<<"*****************************程序开始*******************************"< display(); } bool isSystemSafe() { int work[MaxNumber]; for (int i=0;i { work[i] = Available[i]; } for (int i=0;i { Finish[i] = false; SafeOrder[i] = -1; //初始化安全序列 } int FinishNumebr = 0; int isSafe;