银行家算法的实现,有关进程资源分配的算法

来源:互联网 发布:仓库管理php源码 编辑:程序博客网 时间:2024/05/18 18:46
<pre name="code" class="cpp">#include<iostream>#include<vector>#include<fstream>using namespace std;typedef struct{//进程号int numberOfThread;//该进程对每个资源的需求量int countOf_A, countOf_B;int countOf_C;//该进程是否完成bool isFinish;}infor;//在银行家算法中,总共需要4个向量//每个资源拥有的剩余资源数量vector<int>avliable;//每个资源已经分配的,最大需求,和需要的vector<infor>allocation;vector<infor>max;vector<infor>need;void getInforOfThread();void getNeed();void getReslut();int main(int argc, char argv[]){getInforOfThread();getNeed();cout << "获取分配资源后剩余资源数:" << endl;for (int i = 0; i < 3; i++){int num;cin >> num;avliable.push_back(num);}getReslut();return 0;}void getReslut(){int countNum[3];auto iterOfAvliable = avliable.begin();int i = 0;for (; iterOfAvliable != avliable.end(); iterOfAvliable++){countNum[i++] = *iterOfAvliable;}int j = 0;int count = 0;bool flag = false;int length = need.size();while (j < length){if (count < length){auto iterOfNeed = need.begin();auto iterOfMax = max.begin();for (; iterOfNeed != need.end(); iterOfNeed++){if (countNum[0] >= iterOfNeed->countOf_A&&countNum[1] >= iterOfNeed->countOf_B&&countNum[2] >= iterOfNeed->countOf_C&&iterOfNeed->isFinish == false){//当前拥有资源数量满足该进程所需要的数量 //打印出当前每个资源的剩余个数for (int i = 0; i < 3; i++){cout << i << "类资源: " << countNum[i] << "   ";}cout << endl;//打印出当前可以被执行的进程所需要的资源数cout << "当前可执行进程号:" << iterOfNeed->numberOfThread << "  A:" << iterOfNeed->countOf_A << "  B:" << iterOfNeed->countOf_B << "  C:" << iterOfNeed->countOf_C << endl;iterOfNeed->isFinish = true;cout << "进程p" << iterOfNeed->numberOfThread << endl;for (; iterOfMax != max.end(); iterOfMax++){if (iterOfMax->numberOfThread == iterOfNeed->numberOfThread&&iterOfMax->isFinish == false)break;}countNum[0] += iterOfMax->countOf_A;countNum[1] += iterOfMax->countOf_B;countNum[2] += iterOfMax->countOf_C;iterOfMax->isFinish = true;count++;break;}}}else{flag = true;break;}j++;}if (flag){cout << "系统不安全" << endl;exit(true);}}void getInforOfThread(){//获得每个进程所需的资源最大量,和每个进程已经分配的数量ifstream cin("test.txt");int numberOfThread, count_A, count_B, count_C;int alloc_A, alloc_B, alloc_C;infor str, ptr;while (!cin.eof()){cin >> numberOfThread >> count_A >> count_B >> count_C >> alloc_A >> alloc_B >> alloc_C;str.numberOfThread = numberOfThread;str.countOf_A = count_A;str.countOf_B = count_B;str.countOf_C = count_C;str.isFinish = false;max.push_back(str);ptr.numberOfThread = numberOfThread;ptr.countOf_A = alloc_A;ptr.countOf_B = alloc_B;ptr.countOf_C = alloc_C;ptr.isFinish = false;allocation.push_back(ptr);}cin.close();}void getNeed(){//计算每个进程剩余所需资源的数量auto iterOfAllocation = allocation.begin();auto iterOfMax = max.begin();infor temp;for (; iterOfAllocation != allocation.end(), iterOfMax != max.end(); iterOfAllocation++, iterOfMax++){temp.numberOfThread = iterOfAllocation->numberOfThread;temp.countOf_A = iterOfMax->countOf_A - iterOfAllocation->countOf_A;temp.countOf_B = iterOfMax->countOf_B - iterOfAllocation->countOf_B;temp.countOf_C = iterOfMax->countOf_C - iterOfAllocation->countOf_C;temp.isFinish = false;//temp.countOf_D = iterOfMax->countOf_D - iterOfAllocation->countOf_D;need.push_back(temp);}}
<img src="http://img.blog.csdn.net/20160627164659075?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
<img src="http://img.blog.csdn.net/20160627164743716?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />


                                             
0 1