设置两个工作向量 Work 记录系统当前可用资源量,初值为Available; finish 记录所有进程是否已被执行, 初值为长度为n,值均为False的向量。
从进程集合中找到一个满足下述条件的进程, finish == False; Need <= Work; 如找到,执行3;否则,执行4。
假设进程获得资源,可顺利执行,直至完成,从而释放资源。 Work += Allocation; Finish=True; 执行2
如所有的进程finish= True,则表示安全;否则系统不安全。
算法流程图
具体设计
首先,将需要的变量定义为全局变量
1 2 3 4 5 6 7 8 9 10 11 12 13
int n; //进程数 int m; //资源类数 int *Available; //可使用资源向量 int **Max; //最大需求矩阵 int **Allocation; //分配矩阵 int **Need; //需求矩阵 bool safe = False; typedefstruct { int id; //进程ID int *req_src; //进程此次申请资源 }Request; Request* new_request;
如上,用到了Bool型变量,因此要定义
1 2 3
#define True 1 #define False 0 typedefintbool;
下面列出了我们将要写的函数:
1 2 3 4 5 6 7 8
voidinitial(); //初始化n,m,Available等的函数 voidrequest(); //提出请求 voidprocess(); //处理 boolsafe_detect(); //安全性检测 /*向量运算函数*/ boolvector_compare(int *a, int *b, int len); voidvector_add(int *a, int *b, int len); voidvector_sub(int *a, int *b, int len);
首先给出几个向量运算函数的定义: 定义a和b为两个等长向量, a >= b 表示 a 中的每个元素都大于相应位置上的 b 的元素; a += b 表示 a 中的每个元素增加相应位置上的 b 的元素的值; a -= b 表示 a 中的每个元素都大于相应位置上的 b 的元素的值; 例: a = [1,2,3]; b = [1,1,1]; 则 a >= b; a += b; //a=[2,3,4] a -= b; //a=[0,1,2]
boolvector_compare(int *a, int *b, int len)// If vector a >= vector b, return True { int i = 0; while(i<len) { if(*(a+i)<*(b+i)) return False; i++; } return True; }
voidvector_add(int *a, int *b, int len)//vector a += vector b { int i = 0; while(i<len) { *(a+i) += *(b+i); i++; } }
voidvector_sub(int *a, int *b, int len)//vector a -= vector b { int i = 0; while(i<len) { *(a+i) -= *(b+i); i++; } }
int n; //进程数 int m; //资源类数 int *Available; //可使用资源向量 int **Max; //最大需求矩阵 int **Allocation; //分配矩阵 int **Need; //需求矩阵 bool safe = False; typedefstruct { int id; int *req_src; }Request; Request* new_request;
voidinitial(); voidrequest(); voidprocess(); boolsafe_detect(); boolvector_compare(int *a, int *b, int len); voidvector_add(int *a, int *b, int len); voidvector_sub(int *a, int *b, int len); voidshow(int *a, int len);
voidshow(int *a, int len) { int i = 0; while(i<len) { printf(" %d",*(a+i)); i++; } printf("\n"); }
boolvector_compare(int *a, int *b, int len)// If vector a >= vector b, return True { int i = 0; while(i<len) { if(*(a+i)<*(b+i)) return False; i++; } return True; }
voidvector_add(int *a, int *b, int len)//vector a += vector b { int i = 0; while(i<len) { *(a+i) += *(b+i); i++; } }
voidvector_sub(int *a, int *b, int len)//vector a -= vector b { int i = 0; while(i<len) { *(a+i) -= *(b+i); i++; } }
voidinitial() { int i; int j;
printf("请输入进程数:\n"); scanf("%d",&n);
printf("请输入资源类数:\n"); scanf("%d",&m);
printf("请输入可使用资源向量:\n"); Available = (int*)malloc(sizeof(int)*m); for(i=0; i<m; i++) scanf("%d",&Available[i]);