7-1 银行家算法--安全性检查 (20 分)(思路+详解+知识分析)宝 你今天 AC了吗
一:前言
停更一周了,在這一周里,我每時(shí)每刻都在 想這我這 29個(gè)粉絲,慶幸教師資格證終于結(jié)束了,貼心杰又可以天天更新博客了
哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈,I am come back;
二:題目:
輸入N個(gè)進(jìn)程(N<=100),以及M類資源(M<=100),初始化各種資源的總數(shù),T0時(shí)刻資源的分配情況。判斷T0時(shí)刻是否安全。例如: 假定系統(tǒng)中有5個(gè)進(jìn)程{P0,P1,P2,P3,P4}和三類資源{A,B,C},各種資源的數(shù)量分別為10、5、7,在T0時(shí)刻的資源分配圖如下:
輸入格式:
第一行輸入進(jìn)程數(shù)量N,第二行輸入資源類數(shù)M,第三行輸入M類資源個(gè)類資源的總數(shù),以下N行分別輸入每個(gè)進(jìn)程的名字,該進(jìn)程對(duì)M類資源的最大需求以及已分配資源。
輸出格式:
輸出T0時(shí)刻系統(tǒng)的狀態(tài)。若安全,輸出“找到安全序列,處于安全狀態(tài)。”否則,輸出“找不到安全序列,處于不安全狀態(tài)。”
輸入樣例:
在這里給出一組輸入。例如:
輸出樣例:
在這里給出相應(yīng)的輸出。例如:
三:思路
思路:
1.首先我們進(jìn)行安全性算法是為了預(yù)防死鎖,再解釋一下死鎖 比如
1>:在系統(tǒng)中有兩個(gè)進(jìn)程p1,p2 和兩個(gè)資源r1(掃描儀),r2(刻錄機(jī))
p1和p2都需要將掃描的文檔通過刻錄機(jī)刻錄到CD盤上,
2>:進(jìn)程p1先請(qǐng)求資源r1成功,進(jìn)程p2請(qǐng)求資源r2成功,那么接下來,
p1又申請(qǐng)了r2資源 p2申請(qǐng)了r1資源,那么此時(shí)p1和p2都在等對(duì)方
釋放資源那么就會(huì)發(fā)生死鎖,兩個(gè)進(jìn)程都無法進(jìn)行下去
2.那么安全性算法就是使系統(tǒng)在分配資源時(shí)候一直處在安全的狀態(tài)(即不會(huì)發(fā)生死鎖)
那么我們?cè)诜峙滟Y源的時(shí)候就有了算法,即最終分配給各個(gè)進(jìn)程的資源,都不會(huì)影響到
整個(gè)系統(tǒng)的安全狀態(tài),這時(shí)會(huì)出現(xiàn)一個(gè)進(jìn)程的執(zhí)行序列
3.具體解釋算法過程
1>:幾個(gè)變量
Max:一個(gè)進(jìn)程所需的最大資源量
Allocation:系統(tǒng)已經(jīng)給其分配了多少資源
Need:這個(gè)進(jìn)程還需要多少資源
Available:這個(gè)系統(tǒng)還剩多少資源
2>:剛開始設(shè)置work = Available 將所有進(jìn)程設(shè)置為 finish = false (相當(dāng)于定義一個(gè)flag)
5>:思考如何判定此時(shí)的系統(tǒng)狀態(tài)是安全還是不安全的
安全:如果 3>的條件不滿足 即此時(shí)的所有進(jìn)程的 finsh = true 說明了所有的進(jìn)程已經(jīng)完成
不安全: 我們已經(jīng)判斷了所有的finish = false 的進(jìn)程,但是仍未找到滿足條件的
need < work 那么可以判定此狀態(tài)為 不安全的狀態(tài)
4.處理數(shù)據(jù)
1>:這里我們選取的數(shù)據(jù)結(jié)構(gòu)是結(jié)構(gòu)體數(shù)組因?yàn)橐粋€(gè)進(jìn)程他對(duì)應(yīng)好多屬性,所以選取的是結(jié)構(gòu)體
在結(jié)構(gòu)體的屬性當(dāng)中 我們?cè)O(shè)置一個(gè) max[] 和 allocation[] 目的是存放多個(gè)不同類型資源
2>:關(guān)于node[i].a[j],node[i].b[j],node[i].c[j]的理解,就是3個(gè)二維數(shù)組 就是這樣的
四:先說坑
1.這個(gè)題無語了簡直了真是,不,應(yīng)該是PTA這個(gè)平臺(tái)讓我真的無語了,我定義了一個(gè)變量 cnt 但我并未初始化為0 ,我在DEV-C中測(cè)試了好多數(shù)據(jù)其實(shí)也無妨正確結(jié)果,但是在PTA中提交一直顯示答案錯(cuò)誤,而且測(cè)試樣例一直輸出 找不到安全序列,真的一上午我真的想砸電腦,什么呀!! 最后堅(jiān)持不懈,不信邪,終于讓我發(fā)現(xiàn)一個(gè)大毛病,原來在PTA上變量必須初始化,否則系統(tǒng)自動(dòng)給你賦值一個(gè)很大數(shù) ,但在DEV-C上卻沒有任何問題
2.這個(gè)題還需要的是無論 是否可以得到安全序列,其都必須將其系統(tǒng)中各個(gè)進(jìn)程的狀態(tài)輸出來
五:上碼
/**思路:1.首先我們進(jìn)行安全性算法是為了預(yù)防死鎖,再解釋一下死鎖 比如1>:在系統(tǒng)中有兩個(gè)進(jìn)程p1,p2 和兩個(gè)資源r1(掃描儀),r2(刻錄機(jī))p1和p2都需要將掃描的文檔通過刻錄機(jī)刻錄到CD盤上, 2>:進(jìn)程p1先請(qǐng)求資源r1成功,進(jìn)程p2請(qǐng)求資源r2成功,那么接下來,p1又申請(qǐng)了r2資源 p2申請(qǐng)了r1資源,那么此時(shí)p1和p2都在等對(duì)方釋放資源那么就會(huì)發(fā)生死鎖,兩個(gè)進(jìn)程都無法進(jìn)行下去2.那么安全性算法就是使系統(tǒng)在分配資源時(shí)候一直處在安全的狀態(tài)(即不會(huì)發(fā)生死鎖)那么我們?cè)诜峙滟Y源的時(shí)候就有了算法,即最終分配給各個(gè)進(jìn)程的資源,都不會(huì)影響到整個(gè)系統(tǒng)的安全狀態(tài),這時(shí)會(huì)出現(xiàn)一個(gè)進(jìn)程的執(zhí)行序列3.具體解釋算法過程1>:幾個(gè)變量Max:一個(gè)進(jìn)程所需的最大資源量Allocation:系統(tǒng)已經(jīng)給其分配了多少資源Need:這個(gè)進(jìn)程還需要多少資源Available:這個(gè)系統(tǒng)還剩多少資源2>:剛開始設(shè)置work = Available 將所有進(jìn)程設(shè)置為 finish = false (相當(dāng)于定義一個(gè)flag)3>:找一個(gè)進(jìn)程滿足下列的條件 finish = falseneed <= work(需要的資源得比系統(tǒng)剩余的要少)4>:如果 3>的條件滿足的話,我們就需要 將work += Allocation (每個(gè)進(jìn)程執(zhí)行完后需要釋放資源)finish = true (代表該進(jìn)程完成)返回步驟 3>繼續(xù)尋找滿足上訴條件的進(jìn)程 5>:思考如何判定此時(shí)的系統(tǒng)狀態(tài)是安全還是不安全的 安全:如果 3>的條件不滿足 即此時(shí)的所有進(jìn)程的 finsh = true 說明了所有的進(jìn)程已經(jīng)完成不安全: 我們已經(jīng)判斷了所有的finish = false 的進(jìn)程,但是仍未找到滿足條件的need < work 那么可以判定此狀態(tài)為 不安全的狀態(tài) ,否則那么就是說明該系統(tǒng)處在不安全的狀態(tài)(即會(huì)發(fā)生死鎖)4.處理數(shù)據(jù) 1>:這里我們選取的數(shù)據(jù)結(jié)構(gòu)是結(jié)構(gòu)體數(shù)組因?yàn)橐粋€(gè)進(jìn)程他對(duì)應(yīng)好多屬性,所以選取的是結(jié)構(gòu)體 在結(jié)構(gòu)體的屬性當(dāng)中 我們?cè)O(shè)置一個(gè) max[] 和 allocation[] 目的是存放多個(gè)不同類型資源 2>:關(guān)于node[i].a[j],node[i].b[j],node[i].c[j]的理解,就是3個(gè)二維數(shù)組 就是這樣的 */ #include<bits/stdc++.h> using namespace std;struct Node{string processName;//進(jìn)程名 int a[100];//Max int b[100];//allocation int c[100];//need bool finish;}node[1000];//關(guān)于重寫 sort方法中的兩個(gè)參數(shù) 都表示是一個(gè)結(jié)構(gòu)體(即我們需要用兩個(gè)結(jié)構(gòu)體當(dāng)中的數(shù)據(jù)進(jìn)行比較) bool sort_c(Node node1,Node node2){return node1.c[0] < node2.c[0]; }int main(){int N,M;int cnt = 0;//用于記進(jìn)程完成的個(gè)數(shù) vector<int>v1;//存總的資源總量 vector<int>v2;//存need需要的資源 vector<int>v3;//記錄最后需要輸出的Available cin >> N >> M;for(int i = 0; i < M; i++){int resources;cin >> resources;v1.push_back(resources); }for(int i = 0; i < N; i++){cin >> node[i].processName;//輸入Max for(int j = 0; j < M; j++){cin >> node[i].a[j];}//輸入allocation for(int j = 0; j < M; j++){cin >> node[i].b[j]; v1[j] -= node[i].b[j];//這里是每次減去分配的資源 那么剩下的最后就是 available }//求取needfor(int j = 0; j < M; j++){node[i].c[j] = node[i].a[j] - node[i].b[j];} node[i].finish = false;//將每個(gè)進(jìn)程初始狀態(tài)設(shè)為 false } for(int i = 0; i < M; i++){v3.push_back(v1[i]);} // sort(node,node+N,sort_c);//算法核心部分 for(int i = 0; i < N; i++){int count = 0;for(int j = 0; j < M; j++){if(node[i].c[j] <= v1[j]){count++;}else{break;//只要有一個(gè)不合適就 break 出去 } }if(node[i].finish == false && count == M) {//count == M說明剩余的各個(gè)資源總量大于該進(jìn)程的所需要的 for(int j = 0; j < M; j++){v1[j] += node[i].b[j];//那么此時(shí)剩余的資源總量為原來的加上 該進(jìn)程釋放其占有的資源} node[i].finish = true; cnt++;//記錄完成進(jìn)程的個(gè)數(shù) // cout << node[i].processName << ' ';//此處牛逼之處在于 只要我們找到滿足條件的就從-1開始繼續(xù)尋找滿足條件的 i = -1; } }// cout << endl;int flag = 0;cout << "name max allocation need available" << endl;for(int i = 0; i < N; i++){cout << node[i].processName << ' ';for(int j = 0; j < M; j++){cout << node[i].a[j] << ' '; } cout << "| ";for(int j = 0; j < M; j++){cout << node[i].b[j] << ' '; }cout << "| ";for(int j = 0; j < M; j++){cout << node[i].c[j] << ' '; }cout << "|";if(flag == 0){for(int j = 0; j < M; j++){if(j == 0)cout << ' ' <<v3[j];elsecout << ' ' <<v3[j] ; } flag = 1; } cout << endl; }if(cnt == N){ cout << "找到安全序列,處于安全狀態(tài)。";}else{cout << "找不到安全序列,處于不安全狀態(tài)。";} // for(int i = 0; i < M; i++){ // cout << v1[i] << ' '; // } // 驗(yàn)證數(shù)據(jù) // for(int i = 0; i < N; i++){ // // cout << node[i].processName << ' '; // // for(int j = 0; j < M; j++){ // // cout << node[i].c[j] << ' '; // } // cout << endl; // }}//name max allocation need available //P0 7 5 3 | 0 1 0 | 7 4 3 | 3 3 2 //P1 3 2 2 | 2 0 0 | 1 2 2 | //P2 9 0 2 | 3 0 2 | 6 0 0 | //P3 2 2 2 | 2 1 1 | 0 1 1 | //P4 4 3 2 | 0 0 2 | 4 3 0 | //找到安全序列,處于安全狀態(tài)。//5 //3 //10 5 7 //P0 8 6 3 0 1 0 //P1 3 2 2 2 0 0 //P2 9 0 2 3 0 2 //P3 2 2 2 2 1 1 //P4 4 3 2 0 0 2//5 //3 //6 3 5 //P0 7 5 3 0 1 0 //P1 3 2 2 2 0 0 //P2 9 0 2 3 0 2 //P3 2 2 2 2 1 1 //P4 4 3 2 0 0 2//5 //4 //3 14 12 12 //p0 0 0 1 2 0 0 1 2 //p1 1 7 5 0 1 0 0 0 //p2 2 3 5 6 1 3 5 4 //p3 0 6 5 2 0 6 3 2 //p4 0 6 5 6 0 0 1 4
最后 再嘮叨一句 ,記得加油寶!! 我們共勉 共同進(jìn)步!!!
總結(jié)
以上是生活随笔為你收集整理的7-1 银行家算法--安全性检查 (20 分)(思路+详解+知识分析)宝 你今天 AC了吗的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高蛋白、低碳水减肥法的危害是什么
- 下一篇: 7-2 银行家算法--申请资源 (30