操作系统课程设计-银行家算法(流程图+源代码+设计报告)
一、实验目的:
熟悉银行家算法,理解系统产生死锁的原因及避免死锁的方法,加深记意。
二、实验要求:
用高级语言编写和调试一个描述银行家算法的程序。
三、实验内容:
1、设计一个结构体,用于描述每个进程对资源的要求分配情况。包括:进程名--name[5],要求资源数目--command[m](m类资源),还需要资源数目--need[m],已分配资源数目--allo[m]。
2、编写三个算法,分别用以完成:①申请资源;
②显示资源;③释放资源。(动态完成)
四、程序流程图
五、源程序:最新版本:bk5.c
/*bk2.c::可以自定义进程及资源数目,可选择读文件或创建新文件,但不超过10,5*/
/*可修改# define NP 10*/
/* # define NS 5 */ /*资源种类*/
/*bk3.c::可以继续分配资源(〉2)*/
/*bk4.c::可保存分析结果*/
/*bk5.c::除以上功能外,对暂时不能分配的可以进行另外一次尝试,并恢复已分配的资源*/ /*四、程序流程图:
五、源程序:最新版本:bk5.c
/*bk2.c::可以自定义进程及资源数目,可选择读文件或创建新文件,但不超过10,5*/
/*可修改# define NP 10*/
/* # define NS 5 */ /*资源种类*/
/*bk3.c::可以继续分配资源(〉2)*/
/*bk4.c::可保存分析结果*/
/*bk5.c::除以上功能外,对暂时不能分配的可以进行另外一次尝试,并恢复已分配的资源*/ #include  "string.h"
#include  "stdio.h"
#include "dos.h"
#include "conio.h"
#define MOVEIN 1
#define GUIYUE 2
#define ACC 3
#define OK 1
#define ERROR 0
#define MAXSH 7
#define MAXSHL 10
#define MAXINPUT 50
#define  maxsize  100
int act;
int ip=0;
int  line=0;  /*line为要写的行号,全局变量*/
int writeok;
int right;
char wel[30] = {"Welcome To Use An_Li System"};
char ente[76]={" 警告:未经作者同意不得随意复制更改!"};
char rights[40]={"Copyright (c) 2002"};
struct date today;
struct time now;
typedef struct
{int data[maxsize];
int top;
}stack;
int emptystack(stack *S)
{if(S->top==48&&S->data[S->top]==35)return(1);  /*35 is '#'*/  else return(0);
}
int push(stack *S,int x)
{if(S->top>=maxsize-1)return(-1);
else{S->top++;
S->data[S->top]=x;
return(0);
}
}
int gettop(stack *S)
{return S->data[S->top];
}
int pop(stack *S)
{if(emptystack(S)){
printf("the stack is empty\n");
exit(1);}
else S->top--;
return S->data[S->top+1];
}
void initstack(stack *S)
{int i;
S->top=0;S->data[S->top]=35;
}
/*****模拟打字机的效果*********/
delay_fun()
{
int i;
void music();
for(i=0;;i++)
{
if(wel!='\0')
{
delay(1000);
textcolor(YELLOW);
gotoxy(26+i,8);
cprintf("%c",wel);
printf("谢谢");
printf("网络 ");
music(1,60);
}
else break;
}
delay(500000);
for(i=0; ; i++)
{
if(ente!='\0')
{
delay(1000);
textcolor(RED);/*显示警告及版权*/          gotoxy(2+i,11);
cprintf("%c",ente);
music(1,60);
}
else break;
}
delay(40000);
for(i=0;;i++)
{
if(rights != '\0')
{
delay(1000);
textcolor(YELLOW);
gotoxy(30+i,14);
cprintf("%c",rights);
music(1,60);
}
else
break;
}
getch();
}
/
*********登陆后的效果**********/
logined()
{  int i;
clrscr();
gotoxy(28,10);
textcolor(YELLOW);
cprintf("程序正在载入请稍候.....");
gotoxy(35,12);
for(i=0;i<=50;i++)
{
gotoxy(40,12);
delay(8000);
cprintf("%02d%已完成",i*2);
gotoxy(i+15,13);
cprintf("\n");
cprintf("|");
}
main0();
}
/*********对PC扬声器操作的函数****/
void music(int loop,int f)  /* f为频率*/
{  int i;
for(i=0;i<30*loop;i++)
{
sound(f*20);
delay(200);}
nosound();
}
int analys(int s,int a)
{int hh,pos;
switch(a)
{case (int)'i':hh=0;break;
流程图转换为ns图
case (int)'+':hh=1;break;
case (int)'*':hh=2;break;
case (int)'(':hh=3;break;
case (int)')':hh=4;break;
case (int)'#':hh=5;break;
case (int)'E':hh=6;break;
case (int)'T':hh=7;break;
case (int)'F':hh=8;break;
default:{printf(" \n analys()分析发现不该有的字符 %c !(位置:%d)",a,ip+1); writeerror('0',"\n............分析出现错误!!!");
writeerror(a,"\n 错误类型: 不该有字符 ");
printf("谢谢");
printf("网 ");
return ERROR;
}
}
pos=(s-48)*10+hh;
switch(pos)
{case 3:
case 43:
case 63:
case 73:act=4;return MOVEIN;
case 0:
case 40:
case 60:
case 70:act=5;return MOVEIN;
case 11:
case 81: act=6;return MOVEIN;
case 92:
case 22:act=7;return MOVEIN;
case 84:act=11;return MOVEIN;
/*-------------------------------------------*/ case 91:
case 94:
case 95:
act=1;return GUIYUE;
case 21:
case 24:
case 25:
act=2;return GUIYUE;
case 101:
case 102:
case 104:
case 105:act=3;return GUIYUE;
case 31:
case 32:
case 34:
case 35:act=4;return GUIYUE;
case 111:
case 112:
case 114:
case 115:act=5;return GUIYUE;
case 51:
case 52:
case 54:
case 55:act=6;return GUIYUE;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。