在这个银行家算法里面: 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 1 bool 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; }