銀行家算法-課程設(shè)計_第1頁
銀行家算法-課程設(shè)計_第2頁
銀行家算法-課程設(shè)計_第3頁
銀行家算法-課程設(shè)計_第4頁
銀行家算法-課程設(shè)計_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

操作系統(tǒng)課程設(shè)計進程管理死鎖避免算法設(shè)計姓名:學號:系別:計算機科學與工程專業(yè):計算機科學與技術(shù)年級:指導(dǎo)教師:2021年5月16日

一、課程設(shè)計項目介紹(含項目介紹及設(shè)計目的)項目介紹:1、前言介紹:在多道程序系統(tǒng)中,雖可借助于多個進程的并發(fā)執(zhí)行,來改善系統(tǒng)的資源利用提高吞吐量,但可能發(fā)生一種危險——死鎖。當進程處于這種僵持狀態(tài)時,若無外力作用,他們都無法再向前推進。在操作系統(tǒng)的資源分配也有類似的問題,如果資源分配不得當就會發(fā)生進程循環(huán)等待資源,就會出現(xiàn)死鎖的現(xiàn)象。而最有代表性的避免死鎖的算法就是銀行家算法。銀行家算法是避免死鎖的一種重要方法,本次課程設(shè)計用C語言編寫和調(diào)試一個簡單的銀行家算法程序,用銀行家算法檢查是否允許分配資源給進程,避免死鎖。2、設(shè)計內(nèi)容:內(nèi)容:實現(xiàn)教材3.6.3節(jié)中所描述的銀行家避免死鎖算法。

要求:可自定義進程數(shù)目、資源類型和每種類型資源的數(shù)目;

可輸入每個進程對每種資源的最大需求、已經(jīng)獲得的數(shù)量;

當某進程發(fā)起某種資源請求時,計算系統(tǒng)狀態(tài)是否安全。設(shè)計目的:1、加深我們對了解有關(guān)資源申請、避免死鎖等概念,提高了我們分析、解決問題的能力。2、通過課程設(shè)計深入理解避免死鎖的原理,并加深我們對銀行家算法理解。二、總體設(shè)計(含系統(tǒng)的總體結(jié)構(gòu)、原理框圖或各模塊介紹等)總體結(jié)構(gòu):1、初始化進程數(shù)以及資源數(shù);2、銀行家算法;3、安全性算法。模塊介紹:1、主函數(shù)main()(1)、確定初始進程數(shù)(2)、確定初始資源種類數(shù)以及可用資源的數(shù)目(3)、確定初始各進程所需最大的資源數(shù)以及目前已分配的資源數(shù)目(4)、調(diào)用其他模塊2、銀行家算法Bank()(1)、如果Request<=NEED,則轉(zhuǎn)向(2);否則,出錯(2)、如果Request<=ALLOCATION,則轉(zhuǎn)向(3),否則等待(3)、系統(tǒng)嘗試分配資源給進程(4)、系統(tǒng)執(zhí)行安全性算法3、安全性算法chkerr()(1)、設(shè)置兩個向量工作向量:WORK=AVAILABLE(表示系統(tǒng)可提供給進程繼續(xù)運行所需要的各類資源數(shù)目)FINISH:表示系統(tǒng)是否有足夠資源分配給進程(TRUE表示有;FALSE表示沒有),初始化為FALSE。.(2)、若FINISH[i]=FALSE&&NEED<=WORK,則執(zhí)行3;否則執(zhí)行4(3)、進程P獲得第i類資源,則順利執(zhí)行直至完成!并釋放資源:WORK=WORK+ALLOCATION[i][j];FINISH[i]=TRUE;轉(zhuǎn)2(4)、若所有進程的FINISH[i]=TRUE,則表示系統(tǒng)安全;否則,不安全!三、詳細設(shè)計(含主要的數(shù)據(jù)結(jié)構(gòu)、程序流程圖、關(guān)鍵代碼段及注釋等)數(shù)據(jù)結(jié)構(gòu):1.可利用資源向量AVAILABLE2.分配矩陣ALLOCATION3.需求矩陣NEED程序流程圖:開始開始初始化輸入初始化輸入進程發(fā)出資源請求進程發(fā)出資源請求N試探分配N試探分配系統(tǒng)是否安全系統(tǒng)是否安全YY分配資源分配資源結(jié)束結(jié)束關(guān)鍵代碼段:#include<stdio.h>#defineM50//總進程數(shù)#defineN30//總資源數(shù)#defineFALSE0#defineTRUE1intE,F;//系統(tǒng)可用資源數(shù)intAVAILABLE[N];//可用資源的數(shù)組intALLOCATION[M][N];//已分配到的資源intNEED[M][N];//需求矩陣intRequest[N];//進程請求的資源數(shù)main()//主函數(shù){ inti=0,j=0; intflag=1;//合法的資源申請 voidshowdata();//顯示資源分配情況函數(shù) voidchangdata(int);//更改資源分配函數(shù) voidrstordata(int);//還原預(yù)分配資源函數(shù) voidbank();//銀行家算法函數(shù) intchkerr(int);//安全性算法函數(shù) printf("\n———銀行家算法———\n\n"); printf("***輸入進程總數(shù)E:");scanf("%d",&E);//輸入進程總數(shù)printf("***輸入資源種類總數(shù)F:");scanf("%d",&F); //輸入資源種類數(shù) printf("***輸入已分配資源數(shù):\n"); for(i=0;i<E;i++) for(j=0;j<F;j++) { scanf("%d",&ALLOCATION[i][j]);//輸入以分配資源數(shù) } printf("***輸入還需要的資源數(shù)\n"); for(i=0;i<E;i++) for(j=0;j<F;j++) { scanf("%d",&NEED[i][j]);//輸入還需資源數(shù) } printf("***輸入可利用的資源數(shù)\n"); for(i=0;i<F;i++) scanf("%d",&AVAILABLE[i]);//輸入可利用的資源數(shù) printf("\n"); showdata();//顯示資源分配情況bank();//執(zhí)行銀行家算法return0;}voidbank()//銀行家算法{ inti=0,j=0; intflag=1;//合法的資源申請 voidshowdata(); voidchangdata(int); voidrstordata(int); intchkerr(int); while(flag) { i=-1; while(i<0||i>=E)//輸入不合法進程號的處理 { printf("***請輸入需申請資源的進程號(從0到E-1!):"); scanf("%d",&i); if(i<0||i>=E) printf("————輸入的進程號不存在,重新輸入!————\n"); } printf("***請輸入進程%d申請的資源數(shù)\n",i); for(j=0;j<F;j++) { printf("資源%d:",j); scanf("%d",&Request[j]); if(Request[j]>NEED[i][j])//輸入不合法的資源量的處理 { printf("***進程%d申請的資源量大于還需要%d類資源的資源量!\n",i,j); printf("————申請不合理,出錯!請重新選擇————\n!"); flag=0;//申請不合理 break; } else { if(Request[j]>AVAILABLE[j])//輸入不合法的資源量的處理 { printf("***進程%d申請的資源數(shù)大于系統(tǒng)可用%d類資源的資源量!",i,j); printf("————申請不合理,出錯!請重新選擇!————\n"); flag=0;//申請不合理 break; } } } if(flag) { changdata(i);//更改資源分配數(shù)情況 if(chkerr(i)) { rstordata(i);//系統(tǒng)不安全時還原預(yù)分配的資源 } } else showdata();//顯示資源分配情況 printf("\n"); printf("是否繼續(xù)銀行家算法演示,按1鍵繼續(xù),按0鍵退出演示:\n選擇:"); scanf("%d",&flag); }}voidshowdata()//顯示資源分配情況{ inti,j; printf("***系統(tǒng)可用的資源數(shù)為:\n"); for(j=0;j<F;j++) printf("資源%d:%d",j,AVAILABLE[j]); printf("\n");printf("***各進程已經(jīng)得到的資源量:\n"); for(i=0;i<E;i++) { printf("進程%d:",i); for(j=0;j<F;j++) printf("資源%d:%d",j,ALLOCATION[i][j]); printf("\n"); } printf("\n"); printf("***各進程還需要的資源量:\n");for(i=0;i<E;i++)//輸入各進程還需要的資源量 { printf("進程%d:",i); for(j=0;j<F;j++) printf("資源%d:%d",j,NEED[i][j]); printf("\n");} printf("\n"); }voidchangdata(intk)//修改資源分配情況{ intj; for(j=0;j<F;j++) { AVAILABLE[j]=AVAILABLE[j]-Request[j];//把可用資源數(shù)減去請求資源數(shù)的值賦值給可用資源 ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j];//把已分配資源數(shù)加上請求資源數(shù)賦值給已分配資源 NEED[k][j]=NEED[k][j]-Request[j];//把資源需求數(shù)減去請求資源數(shù)的值賦值給資源需求數(shù) }};voidrstordata(intk)//還原資源分配{ intj; for(j=0;j<F;j++) { AVAILABLE[j]=AVAILABLE[j]+Request[j];//把可用資源數(shù)加上請求資源數(shù)的值賦值給可用資源 ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j];//把已分配資源數(shù)減去請求資源數(shù)賦值給已分配資源 NEED[k][j]=NEED[k][j]+Request[j];//把資源需求數(shù)加上請求資源數(shù)的值賦值給資源需求數(shù) }};intchkerr(ints)//安全性算法{ intWORK;//系統(tǒng)可提供分配的資源數(shù) intFINISH[M];//系統(tǒng)是否有足夠資源分配給進程 inttemp[M];//進程號 inti,j,k=0; for(i=0;i<E;i++) FINISH[i]=FALSE;//將每一個進程的FINISH值初始化為FALSE for(j=0;j<F;j++) { WORK=AVAILABLE[j]; i=s; while(i<E) { if(FINISH[i]==FALSE&&NEED[i][j]<=WORK) { WORK=WORK+ALLOCATION[i][j];//進程獲得資源 FINISH[i]=TRUE;//系統(tǒng)有足夠資源分配給進程 temp[k]=i;//保存進程號 k++; i=0; } else i++; } for(i=0;i<E;i++) if(FINISH[i]==FALSE)//系統(tǒng)沒有足夠資源分配給進程 { printf("\n"); printf("\t————系統(tǒng)不安全!!!本次資源申請不成功!!!————"); printf("\n"); return1; } } printf("\n"); printf("————經(jīng)安全性檢查,系統(tǒng)安全,本次分配成功!————"); printf("\n"); printf("本次安全序列:"); for(i=0;i<E;i++)//輸出安全序列 printf("進程%d",temp[i]); printf("\n"); return0;};四、運行結(jié)果(含運行及測試結(jié)果和用戶使用說明書)(四號宋體)初始化資源分配:進程號不合法:申請資源數(shù)不合法:運行結(jié)果:用戶使用說明書:1、運行環(huán)境:MicrosoftVisualC++6.02、運行步驟:(1)直接打開文件夾"080811140"下的"Debug"下的0.exe,運行080811140.exe.(2)進入程序后按提示初始化資源,初始化結(jié)束后會顯示資源的分配情況,依次輸入進程號及申請的資源數(shù),系統(tǒng)將會計算本次分配是否安全,并顯示結(jié)果。五、課程設(shè)計小結(jié)與心得體會(不小于300字)(四號宋體)這次課程設(shè)計的運行環(huán)境是:MicrosoftVisualC++6.0,相對于其他設(shè)計語言我對C語言比較熟悉,所以我選用了C語言來完成這次的設(shè)計。銀行家算法是避免死鎖的一種重要方法,在課程設(shè)計的過程中,我了解到銀行家算法確實能保證系統(tǒng)時刻都處在安全狀態(tài),但是銀行家算法也有個缺點:它需要不斷檢測各個進程對各類資源的占用情況和申請情況,所以在保證系統(tǒng)安全的情況下要花費較多的時間。為了完成更有效地完成課程設(shè)計,我花了幾天的時間溫習了銀行家算法的內(nèi)容及C語言的知識,鞏固以前的知識。在編寫程序中不斷出現(xiàn)錯誤,在改正錯誤的過程中加深了我對銀行家算法的理解,對資源申請、避免死鎖等概念有了更深入的了解。不斷的改正錯誤提高了我分析問題、解決問題的能力,更好得掌握C語言。六、成績評定指導(dǎo)老師評語:成績評定 指導(dǎo)老師簽名:年月日優(yōu)秀良好中等及格不及格

公司印章管理制度一、目的公司印章是公司對內(nèi)對外行使權(quán)力的標志,也是公司名稱的法律體現(xiàn),因此,必須對印章進行規(guī)范化、合理化的嚴格管理,以保證公司各項業(yè)務(wù)的正常運作,由公司指定專人負責管理。二、印章的種類公章,是按照政府規(guī)定,由主管部門批準刻制的代表公司權(quán)力的印章。專用章,為方便工作專門刻制的用于某種特定用途的印章,如:合同專用章、財務(wù)專用章、業(yè)務(wù)專用章、倉庫簽收章等。3

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論