银行家算法,c++实现

来源:互联网 发布:栗山千明知乎 编辑:程序博客网 时间:2024/05/18 02:03
在这个银行家算法里面:
1.进程有初始资源data1
2.进程有最大需求资源data2
3.系统有未分配资源Idata
4.当进程需要的最大资源被满足,资源会被立刻回收
5.进程数不会更新
本次的代码仅满足上面的要求
如果需要其他的要求,请适当修改代码
改进方面:
1.可以修改未vector的数组形式
2.如果进程数是会实时改变,请添加新的函数更新数组data1,data2,然后调用函数处理data3即可
//bm.h/////#include #include #include using namespace std;#define M 5///////定义结构////////////struct Idata{int id;int key;};////////////   函数   /////////////初始化数据集void setdata(int da[][M], int da2[][M], int da3[][M]);//初始化资源集void setIdata(Idata *item);//排序资源数void sortidata(Idata *idata, queue  &ind);void quicksort(Idata *item, int m, int n);//处理满足需求的事务bool getdata(int d3[][M], Idata *idata, queue  &ind, queue  &fu);//回收资源void freedata(Idata *item, int d1[][M], queue  &fu, stack  &st);//处理原有数据void cleardata(int d1[][M], int d2[][M], int d3[][M], stack  &fu, bool *&fl);//需要处理的进程数void dep(bool *fl, queue  &ind);//循环void dg(int d1[][M], int d2[][M], int d3[][M], Idata *Id1, bool *f, queue  inde, queue  fu, stack  st);///////////预处理/////void setarray1(bool *item);bool flg(bool *f);bool change(bool t1, bool t2);void dshow(Idata *item);void ddshow(int da[][M]);//bm.cpp////#include "bm.h"//初始化数据集void setdata(int d1[][M], int d2[][M], int d3[][M]){cout << "输入已分配的资源数\n";/*for (int i = 0; i < M; i++){for (int j = 0; j < M; j++){cin >> d1[i][j];}}*/cout << "输入须分配的总资源数\n";/*for (int i = 0; i < M; i++){for (int j = 0; j < M; j++){cin >> d2[i][j];}}*/for (int i = 0; i < M; i++){for (int j = 0; j < M; j++){d3[i][j] = d2[i][j] - d1[i][j];}}cout << "以初始化已分配的资源!\n";return;}//初始化资源集void setIdata(Idata *idata){cout << "输入未分配的资源数\n";for (int i = 0; i < M; i++){idata[i].id = i;cin >> idata[i].key;}cout << "已初始化未分配资源!\n";return;}//排序资源数void sortidata(Idata *idata, queue  &ind){Idata l[M];for (int i = 0; i < M; i++){l[i] = idata[i];}quicksort(l, 0, M - 1);for (int i = 0; i < M; i++){ind.push(l[i].id);//cout << l[i].id << "+"<a&&item[b].key >= c.key) b--;//从后面往前面遍历,直到找到比头 标准r 小的 item[a] = item[b];while (a &ind, queue  &fu){bool t1 = true;fu.push(-1);while (!ind.empty()){while (fu.front() != -1){if (d3[fu.front()][ind.front()] <= idata[ind.front()].key){//int f = fu.front(); fu.push(f);fu.push(fu.front());}fu.pop();}fu.pop();if (!fu.empty()){fu.push(-1);}else {t1 = false;return t1;}ind.pop();}/*queue  test = fu;while (!test.empty()){cout << test.front();test.pop();}*/return t1;}//回收资源void freedata(Idata *item, int d1[][M], queue  &fu, stack  &st){while (fu.front() != -1){st.push(fu.front());for (int i = 0; i < M; i++){item[i].key += d1[fu.front()][i];}fu.pop();}fu.pop();//if (fu.empty())cout << "yes";return;}//处理原有数据void cleardata(int d1[][M], int d2[][M], int d3[][M], stack  &st, bool *&fl){//st.pop();int x;while (!st.empty()){x = st.top();fl[x] = false;for (int i = 0; i < M; i++){d1[x][i] = d2[x][i] = d3[x][i] = 0;}st.pop();}return;}//需要处理的进程数void dep(bool *fl, queue  &ind){for (int i = 0; i < M; i++){if (fl[i]){ind.push(i);}}return ;}/////递归实现 ////////void dg(int d1[][M], int d2[][M], int d3[][M], Idata *Id1, bool *f, queue  inde, queue  fu,stack  st){bool ff = true,t1,t2;while (ff){sortidata(Id1, inde);dep(f, fu); //cout << "进程可选模式\n";t1=getdata(d3, Id1, inde, fu);// cout << "已获得可分配的进程\n";t2 = flg(f);ff = change(t1, t2);if (ff == false) return;freedata(Id1, d1, fu, st);// cout << "已回收资源\n";cleardata(d1, d2, d3, st, f); //cout << "已清除数据集\n";//ddshow(d1);//dshow(Id1);}return;}/////预处理////void setarray1(bool *item){for (int i = 0; i < M; i++)item[i] = true;return;}bool flg(bool *f){bool t2 = false;for (int i = 0; i < M; i++){if (f[i] == true) t2 = true;//else t2 = false;}return t2;}bool change(bool t1, bool t2){if (t1 + t2 == 2) return true;else{if (t1 == false && t2 == true){cout << "不安全模式!";return false;}else if (t2==false){cout << "安全模式"; return false;}}}void dshow(Idata *item){for (int i = 0; i < M; i++)cout << item[i].key << " ";}void ddshow(int da[][M]){for (int i = 0; i < M; i++){for (int j = 0; j < M; j++)cout << da[i][j] << " ";cout << endl;}}//main///#include "bm.h"int main(){int data1[M][M] = { { 0, 2, 1, 1, 0 }, { 1, 2, 0, 0, 0 }, { 1, 2, 2, 0, 1 }, { 1, 1, 0, 0, 2 }, { 1, 1, 1, 1, 1 } };int data2[M][M] = { { 0, 2, 3, 2, 0 }, { 3, 3, 1, 1, 0 }, { 3, 2, 3, 1, 1 }, { 2, 2, 0, 1, 2 }, { 2, 2, 2, 2, 2 } };//安全模式//int data2[M][M] = { { 0, 2, 3, 2, 0 }, { 3, 13, 1, 1, 0 }, { 3, 2, 3, 1, 1 }, { 2, 2, 0, 1, 2 }, { 2, 2, 2, 2, 2 } };//不安全模式int data3[M][M];Idata Id[M];//可用检验实例 1 2 2 1 1bool flage[M];queue  indeed;queue  full;stack  st;////////////////////////////////setarray1(flage);setdata(data1, data2, data3);setIdata(Id);//////////dg(data1, data2, data3, Id, flage,indeed, full, st);/////////system("pause");return 0;}

原创粉丝点击