




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
銀行家算法代碼1交互層的實現交互層被直接設計成main函數:intmain(){ _Resourcer; r.init(); _Controlc(r); vector<_Process>p; boolis=false; while(true){ intx; cout<<endl; cout<<"1.創建進程"<<endl; cout<<"2.執行一個進程"<<endl; cout<<"3.退出"<<endl; while(true){/*輸入數據合法性檢查*/ cin>>x; if(cin.fail()){ cout<<"您輸入的數據不合法,請重新輸入!"<<endl; cin.clear(); cin.sync(); continue; } else{ if(x<=0) { cout<<"您輸入的數據不合法,請重新輸入!"<<endl; cin.clear(); cin.sync(); continue; } cin.clear(); cin.sync(); break; } } switch(x){ case1:p=create(r,c),is=true;break; case2:if(is)run(p,r,c);else{cout<<"您還未創建進程!"<<endl;}break; case3:exit(0); default:cout<<"輸入數據不合法,請重新輸入!"<<endl; } //輸出各矩陣的狀態 out(p,r,c); } return0;}2交互邏輯層的實現1. vector<_Process>create(_Resource&r,_Control&c)(創建進程)的實現。 vector<_Process>create(_Resource&r,_Control&c){ cout<<"請輸入需要創建的進程數目:"<<endl; inti; while(true){ /*輸入數據合法性檢查*/ cin>>i; if(cin.fail()){ cout<<"您輸入的數據不合法,請重新輸入!"<<endl; cin.clear(); cin.sync(); continue; } else{ if(i<=0){ cout<<"您輸入的數據不合法,請重新輸入!"<<endl; cin.clear(); cin.sync(); continue; } cin.clear(); cin.sync(); break; } } vector<_Process>p; //進程初始化 _Processaaa; for(intj=0;j<i;j++){ p.push_back(aaa); } intx=0; for(vector<_Process>::iteratoriter=p.begin();iter!=p.end();iter++){ cout<<"P"<<x<<"初始化"<<endl; (*iter).init(r); x++; } //添加進程 for(vector<_Process>::size_typeindex=0;index!=p.size();index++){ c.add_Process(p[index],r); } //初始安全態檢查 if(c.safeChecked(r)){;} else{ cout<<"系統初始狀態不安全!"<<endl; system("pause"); exit(0); } returnp;}2. voidrun(vector<_Process>&p,_Resource&r,_Control&c)(執行進程)的實現 voidrun(vector<_Process>&p,_Resource&r,_Control&c){ inti; cout<<"請輸入需要執行的進程號:"<<endl; while(true){ /*輸入數據合法性檢查*/ cin>>i; if(cin.fail()){ cout<<"您輸入的數據不合法,請重新輸入!"<<endl; cin.clear(); cin.sync(); continue; } else{ if(i<0){ cout<<"您輸入的數據不合法,請重新輸入!"<<endl; cin.clear(); cin.sync(); continue; } cin.clear(); cin.sync(); break; } } cout<<"初始化第"<<i<<"個進程的請求向量:"<<endl; //置進程的資源請求向量 for(vector<int>::size_typesz=0;sz!=p[i].Request.size();sz++){ cout<<"請輸入請求向量的第"<<sz<<"個值:"<<endl; intk; while(true){/*輸入數據合法性檢查*/ cin>>k; if(cin.fail()) { cout<<"您輸入的數據不合法,請重新輸入!"<<endl; cin.clear(); cin.sync(); continue; } else{ if(k<=0){ cout<<"您輸入的數據不合法,請重新輸入!"<<endl; cin.clear(); cin.sync(); continue; } cin.clear(); cin.sync(); break; } } p[i].Request[sz]=k; } c.run_Process(p[i],i,r);}3. voidout(vector<_Process>&p,_Resource&r,_Control&c)的實現。 voidout(vector<_Process>&p,_Resource&r,_Control&c){ //輸出Available矩陣 cout<<"Available:"<<endl; for(vector<int>::size_typesz=0;sz!=r.Available.size();sz++){ cout<<r.Available[sz]<<""; } cout<<endl; //輸出Max矩陣 cout<<"Max:"<<endl; for(vector<Max_row>::size_typei=0;i<r.Max.size();i++){ for(vector<int>::size_typesz=0;sz<r.Max[i].size();sz++){ cout<<r.Max[i][sz]<<""; } cout<<endl; } //Allocation矩陣 cout<<"Allocation:"<<endl; for(vector<Allocation_row>::size_typei=0;i<r.Allocation.size();i++){ for(vector<int>::size_typesz=0;sz<r.Allocation[i].size();sz++){ cout<<r.Allocation[i][sz]<<""; } cout<<endl; } //輸出需求矩陣 cout<<"Need:"<<endl; for(vector<Need_row>::size_typei=0;i<r.Need.size();i++){ for(vector<int>::size_typesz=0;sz<r.Need[i].size();sz++){ cout<<r.Need[i][sz]<<""; } cout<<endl; }}3控制層的實現_Control類的實現。1. voidadd_Process(_Process&p,_Resource&r)方法的實現。 voidadd_Process(_Process&p,_Resource&r){ N++; //進程數加1 //置最大需求矩陣 Max_rowmr; for(vector<int>::iteratoriter=p.Request.begin();iter!=p.Request.end();iter++){ mr.push_back(*iter); } r.Max.push_back(mr); //置分配矩陣 Allocation_rowar; for(inti=0;i<r.getM();i++){ ar.push_back(0); } r.Allocation.push_back(ar); //置需求矩陣 Need_rownr; for(vector<int>::iteratoriter=p.Request.begin();iter!=p.Request.end();iter++){ nr.push_back(*iter); } r.Need.push_back(nr);}2. intrun_Process(_Process&p,intn,_Resource&r)(銀行家算法)的設計如圖4.6所示。intrun_Process(_Process&p,intn,_Resource&r){ //先判斷Request<=Need booltemp_1=true; for(vector<int>::size_typeindex=0;index!=p.Request.size();index++){ if(p.Request[index]>r.Need[n][index]){ cout<<"請求出錯!因為進程所需要的資源數已超過它所宣布的最大值。"<<endl; return1; } } //再判斷Request<=Available for(vector<int>::size_typeindex=0;index!=p.Request.size();index++){ if(p.Request[index]>r.Available[index]) { cout<<"系統中尚無足夠的資源,P"<<n<<"必須等待!"<<endl; return2; } } //進行試分配 _Resourcer_1=r; vector<int>::iteratoriter_2=r_1.Available.begin(); vector<int>::iteratoriter_3=r_1.Allocation[n].begin(); vector<int>::iteratoriter_4=r_1.Need[n].begin(); for(vector<int>::iteratoriter_1=p.Request.begin();iter_1!=p.Request.end();iter_1++){ //Available:=Available-Request *iter_2=*iter_2-*iter_1; //Allocation:=Allocation+Request *iter_3=*iter_3+*iter_1; //Need:=Need-Request *iter_4=*iter_4-*iter_1; //迭代器移向下一個元素 iter_2++; iter_3++; iter_4++; } //執行安全性檢查 if(safeChecked(r_1)){ r=r_1; //判斷此進程是否獲得所有資源,若獲得,則讓其執行完畢后釋放 booltemp=true; for(inti=0;i<r.getM();i++) { if(r.Need[n][i]!=0){ temp=false; break; } } if(temp){ //置最大需求矩陣 for(inti=0;i<r.getM();i++){ r.Max[n][i]=0; } //且置可利用資源向量 for(inti=0;i<r.getM();i++){ r.Available[i]+=r.Allocation[n][i]; r.Allocation[n][i]=0; } cout<<"進程P"<<n<<"執行完畢,已釋放資源!"<<endl; } return0; } else{ cout<<"系統不處于安全態,P"<<n<<"進程需要等待"<<endl; return3; }}3. boolsafeChecked(_Resource&r_2)(安全性算法)的實現。 bool_Control::safeChecked(_Resource&r_2){ vector<int>Work; //初始化工作向量 for(vector<int>::iteratoriter=r_2.Available.begin();iter!=r_2.Available.end();iter++){ Work.push_back(*iter); } vector<bool>Finish; for(vector<Need_row>::iteratoriter=r_2.Need.begin();iter!=r_2.Need.end();iter++){ Finish.push_back(false); } //找出Finish[i]=false且Need<=Work的項step2: for(vector<int>::size_typei=0;i!=r_2.Need.size();i++){ if(!Finish[i]){ booltemp=false; for(vector<int>::size_typeindex=0;index!=Work.size();index++){ if(r_2.Need[i][index]<=Work[index]){ temp=true; } else{ temp=false; break; } } if(temp){ vector<int>::iteratoriter_2=r_2.Allocation[i].begin(); for(vector<int>::iteratoriter_1=Work.begin();iter_1!=Work.end();iter_1++){ *iter_1=*iter_1+*iter_2; iter_2++; } cout<<"P"<<i<<""; Finish[i]=true; gotostep2; //本來不應該使用goto語句,但由于在此使用goto語句更顯方便,故破例用之 } } } //判斷所有進程Finish是否都為true,是則返回true,否則返回false for(vector<bool>::size_typeindex=0;index!=Finish.size();index++){ if(Finish[index]); else returnfalse; } returntrue;}3進程層的實現類_Process的設計voidinit(_Resource&r)方法的實現。voidinit(_Resource&r){ for(inti=0;i<r.getM();i++){ inttemp; while(true){ /*輸入數據合法性檢查*/ cout<<"請輸入第"<<i+1<<"類資源的需求量:"<<endl; cin>>temp; if(cin.fail()){ cout<<"您輸入的數據不合法,請重新輸入!"<<endl; cin.clear(); cin.sync(); continue; } else{ if(temp<=0){ cout<<"您輸入的數據不合法,請重新輸入!"<<endl; cin.clear(); cin.sync(); continue; } cin.clear(); cin.sync(); break; } } Request.push_back(temp)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025合同模板-星河圖書館場地借用協議(星河)
- 2025中學設施設備采購合同范本
- 2025年柔性制造單元(FMC)項目建議書
- 2025年腸外營養藥項目合作計劃書
- 2025年瑪麗珍鞋合作協議書
- 2025勞動合同終止不想續約需提交辭職申請
- 2025自動化設備維護、修理合同
- 2025年殺蟲殺螨混劑項目建議書
- 2025年聚砜及其合金合作協議書
- 2025年鍍錫板卷(馬口鐵)合作協議書
- 2022全國高考真題化學匯編:專題 烴 鹵代烴
- GB/T 25742.4-2022機器狀態監測與診斷數據處理、通信與表示第4部分:表示
- 特殊感染手術的配合與術后處理
- 蕭紅《呼蘭河傳》課件
- 腦血管病介入診療并發癥及其處理課件
- 機動車駕駛人考試場地及其設施設置規范
- 大學生三生教育主題班會
- 2023年宜昌市中醫醫院醫護人員招聘筆試題庫及答案解析
- 內部控制建設課件
- 水塘排水、清淤質量檢驗記錄表
- 上海龍之夢麗晶大酒店客房預訂單
評論
0/150
提交評論