操作系统安全状态检查之银行家算法
操作系统安全状态检查之银行家算法:/*author junyisun*/
/*mail:ccnusjy@yahoo.com.cn*/
/*tc3.0调试通过*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define n 10
#define m 10
typedef struct{
int ip;
int able[n];
int visited[n];
int remain[m];
}worknode; /*工作节点*/
/*ass为进程已分配资源,need为最大需求,r为各种资源的个数*/
int ass[n][m],need[n][m],r[m],top=-1,pnum=0,rnum=0;
/*currnet为当前工作节点*/
worknode stack[n],current;
int main(){
int i,ct;
void add(int [],int []); /*进程完成,释放资源*/
int small(int [],int []); /*已有的资源是否能满足最大请求*/
void init(); /*初始化*/
void output(); /*输出堆栈中的一种可能*/
int bankalgo(); /*银行家算法主要部分,回溯法*/
init();
for(i=0;i<pnum;i++)
if(small(need[i],current.remain) )
current.able[++current.ip]=i;
if(current.ip==-1){
printf("it is unsafe\n");
}
else if(ct=bankalgo())
printf("\it is safe,and it has %d solutions\n",ct);
else printf("\nit is unsafe\n");
return 0;
}
void init(){
int i,j,sum=0;
clrscr();
printf("process number:");
scanf("%d",&pnum);
printf("resource number:");
scanf("%d",&rnum);
printf("resource series:");
for(i=0;i<rnum;i++)scanf("%d",&r[i]);
printf("assined matrix:");
for(i=0;i<pnum;i++){
printf("p%d:",i);
for(j=0;j<rnum;j++)
scanf("%d",&ass[i][j]);
}
printf("needed matrix:\n");
for(i=0;i<pnum;i++){
printf("p%d:",i);
for(j=0;j<rnum;j++)
scanf("%d",&need[i][j]);
}
memset(current.visited,0,sizeof(current.visited) );
for(i=0;i<rnum;i++){
for(j=0;j<pnum;j++)
sum+=ass[j][i];
current.remain[i]=r[i]-sum;
sum=0;
}
current.ip=-1;
}
void output(){
int i;
for(i=0;i<=top;i++)
printf("p%d,",stack[i].able[stack[i].ip]);
printf("\n");
}
void add(int x[],int y[]){
int i;
for(i=0;i<rnum;i++)
x[i]+=y[i];
}
int small(int x[],int y[]){
int i;
for(i=0;i<rnum;i++){
if(x[i]>y[i])break;
}
if(i==rnum)return 1;
return 0;
}
int bankalgo(){
int i,ct=0;
while(1){
stack[++top]=current;
current.visited[current.able[current.ip]]=1;
add(current.remain,ass[current.able[current.ip]]);
current.ip=-1;
for(i=0;i<pnum;i++)
if(!current.visited[i] && small(need[i],current.remain) )
current.able[++current.ip]=i;
if(current.ip==-1)
{
if(top==pnum-1){
output();
ct++;
}
else if(top<0)break;
current=stack[top--];
while(current.ip==0)current=stack[top--];
current.ip--;
}
}
return ct;
}
测试结果如下(andrews s.tanenbaum的《现代操统系统》179页)
process number:5
resource number:4
resource series:6 3 4 2
assined matrix:p0:3 0 1 1
p1:0 1 0 0
p2:1 1 1 0
p3:1 1 0 1
p4:0 0 0 0
needed matrix:
p0:1 1 0 0
p1:0 1 1 2
p2:3 1 0 0
p3:0 0 1 0
p4:2 1 1 0
p3-->p4-->p0-->p2-->p1
p3-->p4-->p0-->p1-->p2
p3-->p0-->p4-->p2-->p1
p3-->p0-->p4-->p1-->p2
p3-->p0-->p2-->p4-->p1
p3-->p0-->p2-->p1-->p4
p3-->p0-->p1-->p4-->p2
p3-->p0-->p1-->p2-->p4
it is safe,and it has 8 solutions
作者blog:http://blog.csdn.net/fxsjy/
- · 电子商务系统安全性研究
- · 如何打开注册表
- · 锁定/解除 Windows 注册表编辑器
- · 怎样打开注册表编辑器?
- · 如何修改注册表使开机更快?
- · 请问我的注册表被禁用了,怎样才能打开?
- · 锁定/解除 Windows 注册表编辑器
- · IE首页给强行修改了怎样进注册表改回来 系统安全状态
- · 如何备份注册表?
- · 注册表在哪啊?
- · 电脑注册表修故障
- · 为什么我打开注册表编辑器显示已被管理员停用
- · 注册表被停用
- · windows中的注册表技巧--另类方法导入注册表文件
- · 编译内核的内核是什么
- · 操作系统安全状态检查之银行家算法
- · ie内核的软件都出问题,怎么修复了
- · Linux内核升级
- · Linux内核编程实战经验谈
- · linux内核编译详解
- · 关于超线程和双内核 系统安全状态
- · TCP 445端口是什么?
- · 怎样查找打开的端口和如何关闭端口
- · socket连接http 80端口的问题
- · 关于1433端口的安全
- · 为什么我在传输数据时不能打开端口?
- · 怎样理解端口和端口号?
- · 如何更改远程桌面端口?
- · 如何打开端口?
- · 端口设置是什么意思啊
- · 解决USB打印机端口设置故障

