- 相關(guān)推薦
模擬銀行家算法
課程設(shè)計(jì)任務(wù)書(shū)
設(shè)計(jì)題目:編程序模擬銀行家算法
設(shè)計(jì)目的
1、銀行家算法是避免死鎖的一種重要方法,本實(shí)驗(yàn)要求用高級(jí)語(yǔ)言編寫(xiě)和調(diào)試一個(gè)簡(jiǎn)單的銀行家算法程序。加深了解有關(guān)資源申請(qǐng)、避免死鎖等概念,并體會(huì)和了解死鎖和避免死鎖的具體實(shí)施方法。
2、提高學(xué)生的程序設(shè)計(jì)能力、 提高算法設(shè)計(jì)質(zhì)量與程序設(shè)計(jì)素質(zhì) ;
設(shè)計(jì)任務(wù) (在規(guī)定的時(shí)間內(nèi)完成下列任務(wù))
思想:將一定數(shù)量的資金供多個(gè)用戶周轉(zhuǎn)使用,當(dāng)用戶對(duì)資金的最大申請(qǐng)量不超過(guò)現(xiàn)存資金時(shí)可接納一個(gè)新客戶,客戶可以分期借款,但借款總數(shù)不能超過(guò)最大的申請(qǐng)量。銀行家對(duì)客戶的借款可以推遲支付,但是能夠使客戶在有限的時(shí)間內(nèi)得到借款,客戶得到所有的借款后能在有限的時(shí)間內(nèi)歸還。
用銀行家算法分配資源時(shí),測(cè)試進(jìn)程對(duì)資源的最大需求量,若現(xiàn)存資源能滿足最大需求就滿足當(dāng)前進(jìn)程的申請(qǐng),否則推遲分配,這樣能夠保證至少有一個(gè)進(jìn)程可以得到所需的全部資源而執(zhí)行到結(jié)束,然后歸還資源,若OS能保證所有進(jìn)程在有限的時(shí)間內(nèi)得到所需資源則稱系統(tǒng)處于安全狀態(tài)。
1. 需求分析
1.1 課程設(shè)計(jì)題目
編程序模擬銀行家算法
1.2 課程設(shè)計(jì)目的
1、銀行家算法是避免死鎖的一種重要方法,本實(shí)驗(yàn)要求用高級(jí)語(yǔ)言編寫(xiě)和調(diào)試一個(gè)簡(jiǎn)單的銀行家算法程序。加深了解有關(guān)資源申請(qǐng)、避免死鎖等概念,并體會(huì)和了解死鎖和避免死鎖的具體實(shí)施方法。
2、提高自己的程序設(shè)計(jì)能力、 提高算法設(shè)計(jì)質(zhì)量與程序設(shè)計(jì)素質(zhì);
1.3 課程設(shè)計(jì)任務(wù)及要求
思想:將一定數(shù)量的資金供多個(gè)用戶周轉(zhuǎn)使用,當(dāng)用戶對(duì)資金的最大申請(qǐng)量不超過(guò)現(xiàn)存資金時(shí)可接納一個(gè)新客戶,客戶可以分期借款,但借款總數(shù)不能超過(guò)最大的申請(qǐng)量。銀行家對(duì)客戶的借款可以推遲支付,但是能夠使客戶在有限的時(shí)間內(nèi)得到借款,客戶得到所有的借款后能在有限的時(shí)間內(nèi)歸還。
銀行家算法在系統(tǒng)在分配資源時(shí)自始自終地做出正確的選擇,這樣可以避免死鎖的發(fā)生。
用銀行家算法分配資源時(shí),測(cè)試進(jìn)程對(duì)資源的最大需求量,若現(xiàn)存資源能滿足最大需求就滿足當(dāng)前進(jìn)程的申請(qǐng),否則推遲分配,這樣能夠保證至少有一個(gè)進(jìn)程可以得到所需的全部資源而執(zhí)行到結(jié)束,然后歸還資源,若OS能保證所有進(jìn)程在有限的時(shí)間內(nèi)得到所需資源則稱系統(tǒng)處于安全狀態(tài)。
1.4 軟硬件運(yùn)行環(huán)境及開(kāi)發(fā)工具
1.4.1硬件環(huán)境
PC機(jī)一臺(tái),支持WINDOWS XP,和LINUX。
1.4.2軟件環(huán)境
在LINUX下運(yùn)行,在WINDOWS下用WIN-TC 運(yùn)行或在Turbo C for Windows下運(yùn)行。
2. 概要設(shè)計(jì)
2.1 程序流程圖
2.2 設(shè)計(jì)原理及方法
銀行家算法的設(shè)計(jì)思想是:當(dāng)用戶申請(qǐng)一組資源時(shí),系統(tǒng)必須做出判斷;如果把這些資源分出去,系統(tǒng)是否還處于安全裝他。若是,就可以分出這些資源;否則,該申請(qǐng)暫不能滿足。
實(shí)現(xiàn)銀行家算法要有若干數(shù)據(jù)結(jié)構(gòu),它們用來(lái)表示資源分配系統(tǒng)的狀態(tài)。令n表示系統(tǒng)中進(jìn)程的數(shù)目,m表示資源的分類數(shù)。還需要以下數(shù)據(jù)結(jié)構(gòu):
1. Available是一個(gè)長(zhǎng)度為m的向量,它表示每類資源可用的數(shù)量。Available [j]=k,表示rj類資源可用的數(shù)量為k。
2.Max是一個(gè)n×m矩陣,它表示每個(gè)進(jìn)程對(duì)資源的最大需求。Max [i,j]=k,表示進(jìn)程pi至多可以申請(qǐng)k個(gè)rj類資源單位。
3. Allocation是一個(gè)n×m矩陣,它表示當(dāng)前分給每個(gè)進(jìn)程的資源數(shù)目。Allocation [i,j]=k,表示進(jìn)程pi當(dāng)前分到k個(gè)rj類資源。
4. Need是一個(gè)n×m矩陣,它表示每個(gè)進(jìn)程還缺少多少資源。Need[i,j]=k,表示進(jìn)程pi尚需k個(gè)rj類資源才能完成其任務(wù)。顯然Need[i,j]= Max [i,j]- Allocation [i,j]。
這些數(shù)據(jù)結(jié)構(gòu)的大小和數(shù)值隨時(shí)間推移而改變。
系統(tǒng)所執(zhí)行的安全性算法描述如下:
1.設(shè)置2個(gè)向量:工作向量Work:它表示系統(tǒng)可提供給進(jìn)程繼續(xù)運(yùn)行所需的各類資源數(shù)目,它含有m個(gè)元素,在執(zhí)行安全算法開(kāi)始時(shí),Work = Available。
Finish[i] :它表示系統(tǒng)是否有足夠的資源分配給進(jìn)程,使之完成運(yùn)行。開(kāi)始時(shí)先做Finish[i]=true。
2.從進(jìn)程集合中找到一個(gè)滿足下述條件的進(jìn)程:Finish[i]=flase;Need[i,j]≤Work[j];若找到,則執(zhí)行步驟3,否則,執(zhí)行步驟4。
3.當(dāng)進(jìn)程pi獲得資源后,可順利執(zhí)行,直至完成,并釋放分配給它的資源。
4.如果所有進(jìn)程的Finish[i]=true都滿足。則表示系統(tǒng)處于安全狀態(tài);否則,系統(tǒng)處于不安全狀態(tài)。
3. 詳細(xì)設(shè)計(jì)
3.1 程序源代碼
#include "string.h"
#include
#include
#define M 5
#define N 3
#define FALSE 0
#define TRUE 1
/*M個(gè)進(jìn)程對(duì)N類資源最大資源需求量*/
int MAX[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};
/*系統(tǒng)可用資源數(shù)*/
int AVAILABLE[N]={10,5,7};
/*M個(gè)進(jìn)程對(duì)N類資源最大資源需求量*/
int ALLOCATION[M][N]={{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}};
/*M個(gè)進(jìn)程已經(jīng)得到N類資源的資源量 */
int NEED[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};
/*M個(gè)進(jìn)程還需要N類資源的資源量*/
int Request[N]={0,0,0};
void main()
{
int i=0,j=0;
char flag=Y;
void showdata();
void changdata(int);
void rstordata(int);
int chkerr(int);
showdata();
while(flag==Y||flag==y)
{
i=-1;
while(i<0||i>=M)
{
printf("請(qǐng)輸入需申請(qǐng)資源的進(jìn)程號(hào)(從0到");
printf("%d",M-1);
printf(",否則重輸入!):");
scanf("%d",&i);
if(i<0||i>=M)printf("輸入的進(jìn)程號(hào)不存在,重新輸入! ");
}
printf("請(qǐng)輸入進(jìn)程");
printf("%d",i);
printf("申請(qǐng)的資源數(shù) ");
for (j=0;j
{
printf("資源");
printf("%d",j);
printf(":");
scanf("%d",&Request[j]);
if(Request[j]>NEED[i][j])
{
printf("進(jìn)程");
printf("%d",i);
printf("申請(qǐng)的資源數(shù)大于進(jìn)程");
printf("%d",i);
printf("還需要");
printf("%d",j);
printf("類資源的資源量!申請(qǐng)不合理,出錯(cuò)!請(qǐng)重新選擇! ");
flag=N;
break;
}
else
{
if(Request[j]>AVAILABLE[j])
{
printf("進(jìn)程");
printf("%d",i);
printf("申請(qǐng)的資源數(shù)大于系統(tǒng)可用");
printf("%d",j);
printf("類資源的資源量!申請(qǐng)不合理,出錯(cuò)!請(qǐng)重新選擇! ");
flag=N;
break;
}
}
}
if(flag==Y||flag==y)
{
changdata(i);
if(chkerr(i))
{
rstordata(i);
showdata();
}
else
showdata();
}
else
showdata();
printf(" ");
printf("是否繼續(xù)銀行家算法演示,按Y或y鍵繼續(xù),按N或n鍵退出演示: ");
scanf("%c",&flag);
}
}
void showdata()
{
int i,j;
printf("系統(tǒng)可用的資源數(shù)為: ");
printf(" ");
for (j=0;j
printf(" 資源");
printf("%d",j);
printf(":");
printf("%d",AVAILABLE[j]);
printf(" ");
printf("各進(jìn)程還需要的資源量: ");
for (i=0;i
{
printf(" 進(jìn)程");
printf("%d",i);
printf(":");
for (j=0;j
printf("資源");
printf("%d",j);
printf(":");
printf("%d",NEED[i][j]);
/*printf(" ");*/
}
printf(" ");
}
printf("各進(jìn)程已經(jīng)得到的資源量: ");
for (i=0;i
{
printf(" 進(jìn)程");
printf("%d",i);
for (j=0;j
printf("資源");
printf("%d",j);
printf(":");
printf("%d",ALLOCATION[i][j]);
}
printf(" ");
}
}
void changdata(int k)
{
int j;
for (j=0;j
{
AVAILABLE[j]=AVAILABLE[j]-Request[j];
ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j];
NEED[k][j]=NEED[k][j]-Request[j];
}
};
void rstordata(int k)
{
int j;
for (j=0;j
{
AVAILABLE[j]=AVAILABLE[j]+Request[j];
ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j];
NEED[k][j]=NEED[k][j]+Request[j];
}
};
int chkerr(int s)
{
int WORK,FINISH[M],temp[M];
int i,j,k=0;
【模擬銀行家算法】相關(guān)文章:
小小銀行家作文03-12
年假的算法07-11
年假的算法?07-11
我是小小銀行家作文06-03
銀行家屬慰問(wèn)信07-05
小小銀行家作文15篇06-01
焊工的工資算法07-13
關(guān)于年假的算法07-11
算法教學(xué)設(shè)計(jì)05-18
小小銀行家親子活動(dòng)方案04-29