




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、操 作 系 統(tǒng)實驗報告(2)學院:計算機科學與技術學院班級:計091學號:姓名:時間:2011/12/30目 錄1. 實驗名稱32. 實驗目的33. 實驗內(nèi)容34. 實驗要求35. 實驗原理36. 實驗環(huán)境47. 實驗設計47.1數(shù)據(jù)結構設計47.2算法設計67.3功能模塊設計78. 實驗運行結果89. 實驗心得9附錄:源代碼(部分)9一、實驗名稱:用c+實現(xiàn)銀行家算法二、實驗目的:通過自己編程來實現(xiàn)銀行家算法,進一步理解銀行家算法的概念及含義,提高對銀行家算法的認識,同時提高自己的動手實踐能力。各種死鎖防止方法能夠阻止發(fā)生死鎖,但必然會降低系統(tǒng)的并發(fā)性并導致低效的資源利用率。死鎖避免卻與此相
2、反,通過合適的資源分配算法確保不會出現(xiàn)進程循環(huán)等待鏈,從而避免死鎖。本實驗旨在了解死鎖產(chǎn)生的條件和原因,并采用銀行家算法有效地防止死鎖的發(fā)生。三、實驗內(nèi)容:利用c+,實現(xiàn)銀行家算法四、實驗要求:1.完成銀行家算法的設計2.設計有n個進程共享m個系統(tǒng)資源的系統(tǒng),進程可動態(tài)的申請和釋放資源,系統(tǒng)按各進程的申請動態(tài)的分配資源。五、實驗原理:系統(tǒng)中的所有進程放入進程集合,在安全狀態(tài)下系統(tǒng)收到進程的資源請求后,先把資源試探性的分配給它。之后,系統(tǒng)將剩下的可用資源和進程集合中的其他進程還需要的資源數(shù)作比較,找出剩余資源能夠滿足的最大需求量的進程,從而保證進程運行完畢并歸還全部資源。這時,把這個進程從進程集
3、合中刪除,歸還其所占用的所有資源,系統(tǒng)的剩余資源則更多,反復執(zhí)行上述步驟。最后,檢查進程集合,若為空則表明本次申請可行,系統(tǒng)處于安全狀態(tài),可以真正執(zhí)行本次分配,否則,本次資源分配暫不實施,讓申請資源的進程等待。銀行家算法是一種最有代表性的避免死鎖的算法。在避免死鎖方法中允許進程動態(tài)地申請資源,但系統(tǒng)在進行資源分配之前,應先計算此次分配資源的安全性,若分配不會導致系統(tǒng)進入不安全狀態(tài),則分配,否則等待。為實現(xiàn)銀行家算法,系統(tǒng)必須設置若干數(shù)據(jù)結構。要解釋銀行家算法,必須先解釋操作系統(tǒng)安全狀態(tài)和不安全狀態(tài)。安全序列是指一個進程序列p1,pn是安全的,如果對于每一個進程pi(1in),它以后尚需要的資源
4、量不超過系統(tǒng)當前剩余資源量與所有進程pj (j s.r1) return false;if(r2 s.r2) return false;if(r3 s.r3) return false;return true;class data/封裝所有數(shù)據(jù)public:process *p;/進程指針source sum;/總資源量source available;/可獲得量source ask;/請求量int plength;/進程個數(shù)int * ruler;/邏輯尺void clearprocess()/進程currentavail清零for(int i=0;iplength;i+)pi.curren
5、tavail.setsource(0, 0, 0);class datainit/封裝初始化數(shù)據(jù)函數(shù)類private:public:datainit()/構造函數(shù)void initlength(data *db)/設置進程個數(shù)int n;coutn;db-plength = n;db-p = new processn;if(!db-p)coutruler = new intn;if(!db-ruler)coutpdb-ruleri.currentavail.add(db-available);/將當前系統(tǒng)可用資源量賦給該序列的第一個進程if(!db-pdb-ruleri.claim_alloc
6、ation.lower(db-pdb-ruleri.currentavail)/若當前進程currentavail小于該進程需求量(claim-allocation),返回falsereturn false;for(i=1; iplength; i+)/當前進程的可獲得資源量currentavail獲得前一個進程的未釋放資源前可獲得資源量currentavaildb-pdb-ruleri.currentavail.add(db-pdb-ruleri-1.currentavail);/當前進程的可獲得資源量currentavail獲得前一個進程的釋放的資源量db-pdb-ruleri.curre
7、ntavail.add(db-pdb-ruleri-1.allocation);/若當前進程currentavail小于該進程需求量(claim-allocation),返回falseif(!db-pdb-ruleri.claim_allocation.lower(db-pdb-ruleri.currentavail)return false;/若當前進程currentavail大于該進程總資源量,返回falseif(!db-pdb-ruleri.currentavail.lower(db-sum)return false;return true;/該序列進程安全。返回truebool exs
8、itsafelist(data *db)/判斷是否存在安全序列int i = 0;for(i = 0; i plength; i+)/設置邏輯尺的刻度值db-ruleri = i;while(1) /該循環(huán)將檢測邏輯尺刻度值的全排列 if(checklist(db)/找到一個安全序列,返回truereturn true;db-clearprocess();/將所有進程的currentavail清零if(!next_permutation(db-ruler,db-ruler+db-plength)/所有排列完畢后退出生成排列庫函數(shù)的調(diào)用return false;return false;int
9、findsafelist(data *db, int i=0)/尋找安全序列/請求值大于系統(tǒng)當前可用資源值,返回0if(!db-ask.lower(db-available)return 0;/請求值大于當前進程需求資源值,返回1if(!db-ask.lower(db-pi.claim_allocation)return 1;source s(db-pi.allocation);/根據(jù)請求,分配資源值db-available.sub(db-ask);db-pi.allocation.add(db-ask);db-pi.claim_allocation.sub(db-ask);if(!exsit
10、safelist(db)/判斷是否存在安全序列db-available.add(db-ask);/不存在安全序列,回滾,恢復分配前狀態(tài),并返回2db-pi.allocation.sub(db-ask);db-pi.claim_allocation.add(db-ask);return 2;db-ask.setsource(0,0,0);/找到安全序列,將請求資源置零,返回3return 3;3.功能模塊設計class data/封裝所有數(shù)據(jù)class datainit/封裝初始化數(shù)據(jù)函數(shù)類class display/封裝顯示方法class findsafelist/尋找安全序列struct p
11、rocess/進程屬性構成void main() /主函數(shù)8、 實驗運行結果:輸入進程數(shù),及相關資源數(shù)量分配選擇算法完成的操作:1 查看進程情況2 請求分配 2.1分配失敗2.2 分配成功2.3 繼續(xù)分配失敗,退出九、實驗心得:通過此次實驗,我能夠更加深入的理解銀行家算法的執(zhí)行過程,也懂得用銀行家算法去防止發(fā)生死鎖,有效地解決了資源利用率低的問題,保證了系統(tǒng)的安全性。當然在實驗過程中,我也遇到了一些困難,但是我通過及時請教同學,查詢相關資料,及時解決了問題,但仍有不足之處,我將會在今后學習中更加努力。附錄:源代碼(部分)#include#include using namespace std;
12、class source /資源的基本構成以及功能 private:public:int r1;/定義三類類資源int r2;int r3;source(int r1 = 0,int r2 = 0,int r3 = 0)r1=r1;r2=r2;r3=r3;source(source& s)r1=s.r1;r2=s.r2;r3=s.r3;void setsource(int r1 = 0,int r2 = 0,int r3 = 0)/設置各類資源r1=r1;r2=r2;r3=r3;void add(source s)/加法r1=r1+s.r1;r2=r2+s.r2;r3=r3+s.r3;void
13、 sub(source s)/減法r1=r1-s.r1;r2=r2-s.r2;r3=r3-s.r3;bool lower(source s)/比較if(r1 s.r1) return false;if(r2 s.r2) return false;if(r3 s.r3) return false;return true;struct process/進程屬性構成source claim;/進程最大需求量source allocation;/進程占有量source claim_allocation;/進程需求量source currentavail;/進程可獲得量;class data/封裝所有數(shù)
14、據(jù)public:process *p;/進程指針source sum;/總資源量source available;/可獲得量source ask;/請求量int plength;/進程個數(shù)int * ruler;/邏輯尺void clearprocess()/進程currentavail清零for(int i=0;iplength;i+)pi.currentavail.setsource(0, 0, 0);class datainit/封裝初始化數(shù)據(jù)函數(shù)類private:public:datainit()/構造函數(shù)void initlength(data *db)/設置進程個數(shù)int n;co
15、utn;db-plength = n;db-p = new processn;if(!db-p)coutruler = new intn;if(!db-ruler)coutask.setsource(r1,r2,r3);void initsum(data *db)/設置總資源量int r1,r2,r3;coutr1r2r3;db-sum.setsource(r1,r2,r3);void initavail(data *db)/設置可獲得量int r1,r2,r3;cout輸入初始分配 allocation:n;coutr1r2r3;db-available.setsource(r1,r2,r3
16、);void initprocess(data *db)/設置各進程屬性值int r1,r2,r3;cout輸入t0時分配 allocation:n;for(int i=0;iplength;i+)/設置進程pi 的 allocationcoutpir1r2r3;db-pi.allocation.setsource(r1,r2,r3); coutpir1r2r3;db-pi.claim.setsource(r1,r2,r3);r1=db-pi.claim.r1-db-pi.claim.r1;/設置進程pi 的 claim_allocationr2=db-pi.claim.r2-db-pi.cl
17、aim.r2;r3=db-pi.claim.r3-db-pi.claim.r3;db-pi.claim_allocation.setsource(r1, r2, r3);class display/封裝顯示方法private:public:display()/構造函數(shù)void displaysource(source s)/設置基本資源顯示方式couts.r1 s.r2 s.r3;displayavailable(source s)/顯示可獲得資源量displaysource(s);void displayprocess(process *p,int length)/顯示進程基本信息for(i
18、nt i=0; ilength; i+)cout pit;displaysource(pi.claim);couttt;displaysource(pi.allocation);coutendl;coutendl;void displaysafelist(data *db)/顯示安全序列for(int i=0; iplength; i+)cout pruleripdb-ruleri.currentavail);coutpdb-ruleri.claim);coutpdb-ruleri.allocation);coutpdb-ruleri.claim_allocation);cout true;c
19、outendl;void displayaskresult(data *db,int n)/顯示請求資源結果if(n=0)cout不分配,請求量大于當前可獲得量! n;return;if(n=1)cout不分配,請求量大于當前可獲得量!n;return;if(n=2)cout不分配,找不到安全序列! n;return;if(n=3)cout存在安全序列:;for(int i=0;iplength;i+)coutruleri ;coutendl;char c=n;coutc;if(c=y|c=y)coutpdb-ruleri.currentavail.add(db-available);/將當前
20、系統(tǒng)可用資源量賦給該序列的第一個進程if(!db-pdb-ruleri.claim_allocation.lower(db-pdb-ruleri.currentavail)/若當前進程currentavail小于該進程需求量(claim-allocation),返回falsereturn false;for(i=1; iplength; i+)/當前進程的可獲得資源量currentavail獲得前一個進程的未釋放資源前可獲得資源量currentavaildb-pdb-ruleri.currentavail.add(db-pdb-ruleri-1.currentavail);/當前進程的可獲得資
21、源量currentavail獲得前一個進程的釋放的資源量db-pdb-ruleri.currentavail.add(db-pdb-ruleri-1.allocation);/若當前進程currentavail小于該進程需求量(claim-allocation),返回falseif(!db-pdb-ruleri.claim_allocation.lower(db-pdb-ruleri.currentavail)return false;/若當前進程currentavail大于該進程總資源量,返回falseif(!db-pdb-ruleri.currentavail.lower(db-sum)r
22、eturn false;return true;/該序列進程安全。返回truebool exsitsafelist(data *db)/判斷是否存在安全序列int i = 0;for(i = 0; i plength; i+)/設置邏輯尺的刻度值db-ruleri = i;while(1) /該循環(huán)將檢測邏輯尺刻度值的全排列 if(checklist(db)/找到一個安全序列,返回truereturn true;db-clearprocess();/將所有進程的currentavail清零if(!next_permutation(db-ruler,db-ruler+db-plength)/所有排列完畢后退出生成排列庫函數(shù)的調(diào)用return false;return false;int findsafelist(data *db, int i=0)/尋找安全序列/請求值大于系統(tǒng)當前可用資源值,返回0if(!db-ask.lower(db-available)return 0;/請求值大于當前進程需求資源值,返回1if(!db-ask.lower(db-pi.claim_allocation)return 1;source s(db-pi.allocation);/根據(jù)請求,分配資源值db-available.sub(db-ask);db
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 派遣人員終止合同協(xié)議書
- 數(shù)字化浪潮下的2025公路貨運行業(yè):運力整合與產(chǎn)業(yè)鏈協(xié)同報告
- 2025自動化控制系統(tǒng)建設項目合同范本
- 施工合同解除賠償協(xié)議書
- 2025建筑工程施工安全合作協(xié)議合同
- 養(yǎng)殖鮑魚合同協(xié)議書模板
- 2025年雙方協(xié)商解除合同應該如何補償
- 股份電站合同協(xié)議書模板
- 2025-2030中國酒店管理行業(yè)競爭格局分析及投資前景與戰(zhàn)略規(guī)劃研究報告
- 施工合同解約協(xié)議書范本
- 護理科研選題與論文寫作
- 珠寶首飾加工工藝介紹課件
- 淘寶網(wǎng)-信息披露申請表
- 小微型客車租賃經(jīng)營備案表
- 教育培訓機構辦學許可證申請書(樣本)
- 瓷磚業(yè)務員提成方案
- 2022年一級注冊計量師案例分析真題
- “三級”安全安全教育記錄卡
- 愛蓮說-王崧舟
- 小微企業(yè)信用評級標準模板
- 車輛安全設施設備定期檢查臺賬
評論
0/150
提交評論