版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、課 程 設(shè) 計 報 告課程名稱 操作系統(tǒng) 課題名稱 銀行家算法 專 業(yè) 班 級 學(xué) 號 姓 名 指導(dǎo)教師 2013年7 月 5 日湖南工程學(xué)院課 程 設(shè) 計 任 務(wù) 書課程名稱 操作系統(tǒng) 課 題 銀行家算法 專業(yè)班級 學(xué)生姓名 學(xué) 號 指導(dǎo)老師 審 批 任務(wù)書下達日期 2013 年 6 月 24 日任務(wù)完成日期 2013年 7 月5日一、設(shè)計內(nèi)容與設(shè)計要求1設(shè)計內(nèi)容:課題1:銀行家算法 編制銀行家算法通用程序,并檢測所給狀態(tài)的系統(tǒng)安全性。假設(shè)有n個進程m類資源,則有如下數(shù)據(jù)結(jié)構(gòu):(1) 可利用資源向量Available。這是一個含有m個元素的數(shù)組,其中的每一個元素代表一類可利用的資源數(shù)目,其初
2、始值是系統(tǒng)中所配置的該類全部可用資源的數(shù)目,其數(shù)值隨該類資源的分配和回收而動態(tài)地改變。Availablej=K,則表示系統(tǒng)中現(xiàn)有Rj 類資源K個。(2) 最大需求矩陣Max。這是一個n*m的矩陣,它定義了系統(tǒng)中n個進程中的每一個進程對m類資源的最大需求。如果Maxi,j=K,則表示進程i需要Rj類資源的最大數(shù)目為K。(3) 分配矩陣Allocation。這也是一個n*m的矩陣,它定義了系統(tǒng)中每一類資源當(dāng)前已分配給每一進程的資源數(shù)。如果Allocationi,j=K,則表示進程i當(dāng)前已分得Rj類資源的數(shù)目為K。(4) 需求矩陣Need。這也是一個n*m的矩陣,用以表示每一個進程尚需的各類資源數(shù)。
3、如果Needi,j=K,則表示進程i還需要Rj類資源K個,方能完成其任務(wù)。上述三個矩陣存在如下關(guān)系:Needi,j= Maxi,j- Allocationi,j。設(shè)進程I提出請求RequestN,則銀行家算法按如下規(guī)則進行判斷:(1)如果RequestN<=NEEDI,N,則轉(zhuǎn)(2);否則,出錯。 (2)如果RequestN<=AVAILABLE,則轉(zhuǎn)(3);否則,出錯。 (3)系統(tǒng)試探分配資源,修改相關(guān)數(shù)據(jù): AVAILABLE=AVAILABLE-REQUEST ALLOCATION=ALLOCATION+REQUEST NEED=NEED-REQUEST (4)系統(tǒng)執(zhí)行安全性
4、檢查,如安全,則分配成立;否則試探險性分配作廢,系統(tǒng)恢復(fù)原狀,進程等待。課題2:模擬操作系統(tǒng)中進程調(diào)度過程。要求設(shè)計一個程序,該程序可模擬對10個以上的進程進行FCFS、SJF、HRP的方式進行調(diào)度。( 1) 設(shè)計進程控制塊PCB,進程控制塊至少包括進程號、到達時間和要求服務(wù)時間; (2) 動態(tài)或靜態(tài)創(chuàng)建多個(10)進程;(3) 實現(xiàn)FCFS、SJF、HRP調(diào)度算法;(4) 調(diào)度所創(chuàng)建的進程并顯示調(diào)度結(jié)果。課題3:模擬短進程優(yōu)先(SJF)調(diào)度要求:(1) 每一個進程有一個PCB,PCB的內(nèi)容可以根據(jù)具體情況設(shè)定;(2) 可以由用戶界面設(shè)定互斥資源(包括兩種:輸入設(shè)備和輸出設(shè)備)的數(shù)目;(3)
5、進程數(shù)、進入內(nèi)存的時間和要求服務(wù)時間可以由用戶界面設(shè)定,程序應(yīng)檢查其合理性;(4) 進程之間存在一定的同步與互斥關(guān)系,可以通過界面進行設(shè)定,其表示方法如下:進程的服務(wù)時間由四段組成:I2C10O5C5(表示進程的服務(wù)時間由2個時間片的輸入,10個時間片的計算,5個時間片的輸出,5個時間片的計算組成);進程間的同步關(guān)系用一個段表示:W2,表示該進程先要等待P2進程執(zhí)行結(jié)束后才可以運行,因此,進程間的同步與互斥關(guān)系、服務(wù)時間可以統(tǒng)一用五段表示為:I2C10O5C5W2;(5) 可以在運行中顯示各進程的狀態(tài):就緒、阻塞、執(zhí)行;(6)采用可視化界面,可以在進程調(diào)度過程中隨時暫停調(diào)度,查看當(dāng)前進程的狀態(tài)
6、以及相應(yīng)的阻塞隊列;(7) 具有一定的數(shù)據(jù)容錯性;(8) 模擬6個以上短進程優(yōu)先調(diào)度的程序。界面用VC中的MFC框架結(jié)構(gòu)寫。課題4:利用多線程模擬實現(xiàn)生產(chǎn)者/消費者問題。生產(chǎn)者/消費者問題是一個多線程同步問題的經(jīng)典案例。該問題描述了兩個共享固定大小緩沖區(qū)的線程即所謂的“生產(chǎn)者”和“消費者”在實際運行時會發(fā)生的問題。生產(chǎn)者的主要作用是生成一定量的數(shù)據(jù)放到緩沖區(qū)中,然后重復(fù)此過程。與此同時,消費者也在緩沖區(qū)消耗這些數(shù)據(jù)。該問題的關(guān)鍵就是要保證生產(chǎn)者不會在緩沖區(qū)滿時加入數(shù)據(jù),消費者也不會在緩沖區(qū)中空時消耗數(shù)據(jù)。要解決該問題,就必須讓生產(chǎn)者在緩沖區(qū)滿時休眠,等到下次消費者消耗緩沖區(qū)中的數(shù)據(jù)的時候,生產(chǎn)
7、者才能被喚醒,開始往緩沖區(qū)添加數(shù)據(jù)。同樣,也可以讓消費者在緩沖區(qū)空時進入休眠,等到生產(chǎn)者往緩沖區(qū)添加數(shù)據(jù)之后,再喚醒消費者。通常采用進程間通信的方法解決該問題,如采用信號量方法。如果解決方法不夠完善,則容易出現(xiàn)死鎖的情況。出現(xiàn)死鎖時,兩個線程都會陷入休眠,等待對方喚醒自己。課題5:模擬實現(xiàn)讀者寫者問題讀者寫者問題是一個經(jīng)典的并發(fā)程序設(shè)計問題,是經(jīng)常出現(xiàn)的一種同步問題。所謂讀者寫者問題,是指保證一個writer進程必須與其他進程互斥地訪問共享對象的同步問題。讀者寫者問題可以這樣的描述,有一群寫者和一群讀者,寫者在寫同一本書,讀者也在讀這本書,多個讀者可以同時讀這本書,但是,只能有一個寫者在寫書,
8、并且,讀者比寫者優(yōu)先,也就是說,讀者和寫者同時提出請求時,讀者優(yōu)先。當(dāng)讀者提出請求時需要有一個互斥操作,另外,需要有一個信號量S來當(dāng)前是否可操作。課題6:分析LINUX內(nèi)核中進程調(diào)度部分源代碼從LINUX官網(wǎng)/上載LINUX源代碼,將其解壓后,分析其中includelinux sched.h 和kernel/sched/core.c及相關(guān)源文件,了解其進程控制塊結(jié)構(gòu),分析LINUX進程調(diào)度策略及過程。課題7:分析LINUX中信號量實現(xiàn)部分源代碼從LINUX官網(wǎng)/上載LINUX源代碼,將其解壓后,分析其中incl
9、udelinuxsemaphore.h和 kernel/sched/ semaphore.c及相關(guān)源文件,分析LINUX中信號量的定義及其相應(yīng)操作的實現(xiàn)。2 選題方案:所選題目根據(jù)學(xué)號確定,學(xué)號模7加1,即(學(xué)號%7+1)。如你的學(xué)號為9,則所選題目號為:9%7+1(題目3)。3設(shè)計要求:3.1 課程設(shè)計報告規(guī)范(1)需求分析a.程序的功能。b.輸入輸出的要求。(2)概要設(shè)計a.程序由哪些模塊組成以及模塊之間的層次結(jié)構(gòu)、各模塊的調(diào)用關(guān)系;每個模塊的功能。b.課題涉及的數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)庫結(jié)構(gòu);即要存儲什么數(shù)據(jù),這些數(shù)據(jù)是什么樣的結(jié)構(gòu),它們之間有什么關(guān)系等。(3)詳細設(shè)計a.采用C語言定義相關(guān)的數(shù)據(jù)
10、類型。b 寫出各模塊的類C碼算法。c.畫出各函數(shù)的調(diào)用關(guān)系圖、主要函數(shù)的流程圖。(4)調(diào)試分析以及設(shè)計體會a.測試數(shù)據(jù):準(zhǔn)備典型的測試數(shù)據(jù)和測試方案,包括正確的輸入及輸出結(jié)果和含有錯誤的輸入及輸出結(jié)果。b.程序調(diào)試中遇到的問題以及解決問題的方法。c.課程設(shè)計過程經(jīng)驗教訓(xùn)、心得體會。(5)使用說明用戶使用手冊:說明如何使用你編寫的程序,詳細列出每一步的操作步驟。(6)書寫格式a.設(shè)計報告要求用A4紙打印成冊:b.一級標(biāo)題用3號黑體,二級標(biāo)題用四號宋體加粗,正文用小四號宋體;行距為22。(7)附錄源程序清單(帶注釋)3.2 考核方式指導(dǎo)老師負(fù)責(zé)驗收程序的運行結(jié)果,并結(jié)合學(xué)生的工作態(tài)度、實際動手能力
11、、創(chuàng)新精神和設(shè)計報告等進行綜合考評,并按優(yōu)秀、良好、中等、及格和不及格五個等級給出每位同學(xué)的課程設(shè)計成績。具體考核標(biāo)準(zhǔn)包含以下幾個部分:(1)平時出勤 (占10%)(2)系統(tǒng)需求分析、功能設(shè)計、數(shù)據(jù)結(jié)構(gòu)設(shè)計及程序總體結(jié)構(gòu)合理與否(占10%)(3)程序能否完整、準(zhǔn)確地運行,個人能否獨立、熟練地調(diào)試程序(占40%)(4)設(shè)計報告(占30%)注意:不得抄襲他人的報告(或給他人抄襲),一旦發(fā)現(xiàn),成績?yōu)榱惴?。?)獨立完成情況(占10%)。3.3 課程驗收要求(1)運行所設(shè)計的系統(tǒng)。(2)回答有關(guān)問題。(3)提交課程設(shè)計報告。(4)提交軟盤(源程序、設(shè)計報告文檔)。(5)依內(nèi)容的創(chuàng)新程度,完善程序情況及
12、對程序講解情況打分。二、 進度安排第 19 周:星期一 8:0012:00 上機 星期二 8:0012:00 上機星期三 14:3018:30 上機 一、課題的主要功能1.程序的功能 編寫銀行家算法通用程序,并檢測所給狀態(tài)的系統(tǒng)安全性,可利用資源向量Available。這是一個含有N個元素的數(shù)組,其中的每一個元素代表一類可利用的資源數(shù),其初始值是系統(tǒng)中所配置的該類全部可用資源的數(shù)目,其數(shù)值隨該類資源的分配和回收而動態(tài)地改變。 最大需求矩陣Max這是一個M*N的矩陣,它定義了系統(tǒng)中M個進程中的每一個進程對N類資源的最大需求。如果Maxij=K,則表示進程i需要Rj類資源的最大數(shù)目為K。 分配矩陣
13、Allocation。這也是一個n*m的矩陣,它定義了系統(tǒng)中每一類資源 當(dāng)前已分配給沒一進程的資源數(shù)。如果Allocationij=K,則表示 進程i當(dāng)前已分得Rj類資源的數(shù)目為K。 需求矩陣Need。這也是一個M*N的矩陣,用以表示每一個進程尚需的各類資源數(shù)。如果Needij= Maxij- Allocationij,則表示i個進程對j類資源需求量,方能完成其任務(wù)。 設(shè)Requesti 是進程Pi的請求向量,如果Requestij=K,表示進程Pi需要K個Rj類型的資源。當(dāng)Pi發(fā)出資源請求后,系統(tǒng)按下述步驟進行檢查:如果Requestij<= Needij,便轉(zhuǎn)向步驟2;否則認(rèn)為出錯,
14、因為它所需要的資源數(shù)已超過它所宣布的最大值,不能進行資源分配。2.輸入輸出的要求(1)以鍵盤輸入的方式輸入進程的數(shù)量,資源種類數(shù),各種資源可利用的數(shù)量 Available,各進程已分配的資源數(shù)量Allocation和各進程對各類資源的最大需求Max; (2)輸出顯示當(dāng)前系統(tǒng)的狀態(tài);(3)如果預(yù)分配后,系統(tǒng)處于安全狀態(tài),則修改系統(tǒng)的資源分配情況,并予以顯示;(4)如果預(yù)分配后,系統(tǒng)處于不安全狀態(tài),則提示不能滿足請求,并恢復(fù)預(yù)分配前的數(shù)據(jù)。2、 課題的功能模塊的劃分1. 各功能模塊(1) 字符判斷模塊:由數(shù)字判斷函數(shù)( int shuzi(int sz); )實現(xiàn)。判斷輸入的字符是否為數(shù)字,如果不
15、是則提示出錯并重新輸入,主要處理輸入為非數(shù)字時程序出現(xiàn)運行錯誤現(xiàn)象。(2)程序初始化模塊:由初始化函數(shù)(void chushihua(); )實現(xiàn),用于程序開始進行初始化輸入數(shù)據(jù):進程數(shù)量、資源種類、各種資源可利用數(shù)量Available、各進程的各種資源已分配數(shù)量Allocation、各進程對各類資源最大需求數(shù)Max等。(3)安全算法模塊:由安全算法函數(shù)(void safe(); )實現(xiàn),用于判斷當(dāng)前狀態(tài)安全性,根據(jù)不同地方的調(diào)用提示不同處理。(4)銀行家算法模塊:由銀行家算法函數(shù)(void bank();)實現(xiàn),進行銀行家算法實現(xiàn)的模塊,調(diào)用其他各個模塊進行銀行家算法過程。(5)分配模塊:由
16、分配顯示函數(shù)(void showdata(); )實現(xiàn),顯示當(dāng)前資源分配詳細情況,包括:各種資源的總數(shù)量(all)、系統(tǒng)目前各種資源可用的數(shù)量Available、各進程已經(jīng)得到的資源數(shù)量Allocation、各進程還需要的資源量Need。2.數(shù)據(jù)結(jié)構(gòu)2.1 全局變量const int x=50,y=100; /定義常量,便于修改int Availablex; /各種資源可利用的數(shù)量int Allocationyy; /各進程當(dāng)前已分配的資源數(shù)量int Maxyy; /各進程對各類資源的最大需求數(shù)量int Needyy; /需求資源矩陣int Requestx; /申請各類資源的數(shù)量int Wo
17、rkx; /工作向量,表示系統(tǒng)可提供給進程運行所需各類資源數(shù)量int Finishy; /表示系統(tǒng)是否有足夠的資源分配給進程,0為否,1為是int py; /存儲安全序列int i,j; /全局變量,主要用于循環(huán)語句中int n,m; /n為進程的數(shù)量,m為資源種類數(shù)int l=0,counter=0;2.2 函數(shù)聲明int shuzi(int sz); /數(shù)字判斷函數(shù)void chushihua(); /系統(tǒng)初始化函數(shù)void safe(); /安全性算法函數(shù)void bank(); /銀行家算法函數(shù)void showdata(); /輸出顯示當(dāng)前資源分配情況2.3 主函數(shù)結(jié)構(gòu) int ma
18、in() cout<<endl<<endl; chushihua(); /初始化函數(shù)調(diào)用 cout<<endl; showdata(); /輸出初始化后的狀態(tài) safe(); /安全性算法函數(shù)調(diào)用 if (l<n) cout<<"n當(dāng)前狀態(tài)不安全,無法申請,程序退出!"<<endl; cout<<endl; system("pause"); return 0; Else int i; l=0; /局部變量 cout<<"n安全的狀態(tài)!"<&
19、lt;endl; cout<<"安全序列為: " cout<<endl<<"進程"<<"("<<p0<<")" /輸出安全序列 for (i=1; i<n; i+) cout<<"=>>"<<"進程"<<"("<<pi<<")" for (i=0; i<n; i+) Finishi=
20、0; /所有進程變?yōu)槲捶峙錉顟B(tài) cout<<endl<<endl; bank(); /銀行家算法函數(shù)調(diào)用 return 0; / break; 3、 主要功能的實現(xiàn)1.程序流程圖 銀行家算法bank() 初始化Init() 請求資源request i Requesti <=needi 錯誤Request i<=available iAvailablei=availablei-requestiAllocationi=allocationi+requestiNeedi=need i-requestiSafe( )輸出提問:同意分配請求是否再次進行分配錯誤輸出提示
21、:你的請求被拒絕Availablei=availablei-requestiAllocationi=allocationi+requestiNeedi=need i-requesti退出程序銀行家算法bank()結(jié)束falsefalsetruetruefalsefalsetruetruefalse 圖1 程序流程圖2. 字符判斷模塊此模塊判斷輸入的字符是否為數(shù)字,如果不是則提示出錯并重新輸入,主要處理輸入為非數(shù)字輸入時,程序出現(xiàn)的錯誤現(xiàn)象。int shuzi(int sz) /輸入數(shù)據(jù)并判斷是否為數(shù)字 char *temp; temp=new char; /臨時指針,存放輸入字符 int le
22、n; /存儲取字符的長度 sz=0 ; /清零 char s; / do /輸入賭注,只能輸入數(shù)字 / gets(temp); /getline(cin,temp) cin>>temp; len=strlen(temp); /取字符長度 for(int i=0;i<len;i+) s= *(temp+i); if(s<'0' | s>'9') cout<<" 輸入的數(shù)字有誤,請重新輸入! nn" cout<<"請重新輸入:" break; while(s<'
23、;0' | s>'9'); for(int i=0;i<len;i+) /輸入字符串轉(zhuǎn)化為整形數(shù)字 int t=1; for(int j=1;j<len-i;j+) t*=10; sz+=(*(temp+i)-48)*t; return sz;3. 程序初始化模塊此模塊在程序開始時輸入相關(guān)數(shù)據(jù):進程數(shù)量、資源種類、各種資源可利用數(shù)量Available、各進程的各種資源已分配數(shù)量Allocation、各進程對各類資源最大需求數(shù)Max等。 void chushihua() /系統(tǒng)初始化函數(shù) cout<<" =歡迎進入銀行家算法= &q
24、uot;<<endl; cout<<"="<<endl<<endl; cout<<"請輸入進程的數(shù)量: " /輸入相關(guān)數(shù)據(jù) n=shuzi(n); cout<<"請輸入資源種類數(shù): " m=shuzi(m); cout<<endl<<"請輸入各種資源可利用的數(shù)量( "<<m<<" 種): "<<endl; cout<<endl; for (j=0; j&
25、lt;m; j+) cout<<" 輸入資源 "<<j<<" 可利用的數(shù)量Available"<<j<<": " Availablej=shuzi(Availablej); Workj=Availablej; /初始化Workj cout<<endl; cout<<"請輸入各進程當(dāng)前已分配的資源數(shù)量Allocation"<<n<<""<<m<<": &qu
26、ot;<<endl<<endl; for (i=0; i<n; i+) for (j=0; j<m; j+) cout<<" 請輸入進程 "<<i<<" 當(dāng)前已分配的資源 "<<j<<" 數(shù)量: " Allocationij=shuzi(Allocationij); cout<<endl; Finishi=0;/初始化Finishi cout<<endl; cout<<"請輸入各進程對各類資源的
27、最大需求數(shù)Max"<<n<<""<<m<<": "<<endl<<endl; for (i=0; i<n; i+) for (j=0; j<m; j+) cout<<" 請輸入進程 "<<i<<" 對資源 "<<j<<" 的最大需求數(shù): " Maxij=shuzi(Maxij); if(Maxij>=Allocationij) / Nee
28、dij = Maxij-Allocationij; /計算還需求量 else Needij=0; /判斷是否還需要分配資源 cout<<endl; cout<<"% 初始化完成! %"<<endl;4. 安全算法模塊 此模塊用于判斷當(dāng)前系統(tǒng)安全性,根據(jù)不同地方的調(diào)用提示不同處理。void safe() l=0; for (i=0; i<n;)if (Finishi=0) /尋找Finishi=0的進程 counter=0; /記數(shù)器 for (j=0; j<m; j+) if (Workj>=Needij); /可用大于
29、等于需求 elsecounter=1; break; if(counter!=1) Workj>=Needij /進程的每類資源量都符合條件 pl=i; /存儲安全序列 Finishi=1; /標(biāo)志為可分配 for (j=0; j<m;j+) Workj=Workj+Allocationij; /釋放資源 l=l+1; /記數(shù),當(dāng)L=N時說明滿足安全序列 i= -1; /從第一個進程開始繼續(xù)尋找滿足條件一二的進程 i+; /for循環(huán)繼續(xù)尋找 5. 銀行家算法模塊 進行銀行家算法實現(xiàn)的模塊,調(diào)用其他各個模塊進行銀行家算法過程。void bank() cout<<&quo
30、t;% 以下開始為進程進行資源分配申請 %"<<endl<<endl;/申請資源 int k=0; /用于輸入進程編號 bool r=false; / 初值為假,輸入Y繼續(xù)申請則置為真 do cout<<"請輸入申請資源的進程編號(輸入0-"<<n-1<<"之間): " /輸入請求 k=shuzi(k); cout<<endl; while(k>n-1) cout<<endl<<"您輸入了錯誤的進程號,請重新輸入!"<
31、<endl; /輸入異常處理 cout<<endl<<"請輸入申請資源的進程編號(輸入0-"<<n-1<<"之間): " k=shuzi(k); cout<<endl; cout<<endl<<"請輸入該進程申請各類資源的數(shù)量: "<<endl; for (j=0; j<m; j+) do cout<<"進程 "<<k<<" 申請資源"<<j
32、<<"的數(shù)量:" /循環(huán)判斷申請輸入的情況 Requestj=shuzi(Requestj); cout<<endl;if(Requestj>Needkj) cout<<"申請大于需要量!"<<endl; /申請大于需求量時出錯 cout<<"您申請資源"<<j<<"的數(shù)量為"<<Requestj<<",大于進程"<<k<<"對該資源需求量"
33、;<<Needkj<<"。"<<endl; cout<<"請重新輸入!"<<endl; else /先判斷是否申請大于需求量,再判斷是否申請大于可利用量 if(Requestj>Availablej)/申請大于可利用量 cout<<"n沒有那么多資源,目前可利用資源"<<j<<"數(shù)量為"<<Availablej<<",本次申請不成功,進程等待!"<<endl;
34、 Finishk=0; /該進程等待 goto ppp; /goto語句 跳轉(zhuǎn),結(jié)束本次申請 while(Requestj>Needkj); /Requestj>Availablej| /改變Avilable、Allocation、Need的值 for (j=0; j<m; j+) Availablej = Availablej-Requestj; Allocationkj = Allocationkj+Requestj; Needkj = Needkj-Requestj; Workj = Availablej; /判斷當(dāng)前狀態(tài)的安全性 safe(); /調(diào)用安全性算法函數(shù)
35、if (l<n) l=0; cout<<"n當(dāng)前狀態(tài)不安全,不予分配!"<<endl; /恢復(fù)數(shù)據(jù) for (j=0; j<m; j+) Availablej = Availablej+Requestj; Allocationkj = Allocationkj-Requestj; Needkj = Needkj+Requestj; Workj = Availablej; for (i=0; i<n; i+) Finishi=0; /進程置為未分配狀態(tài) else l=0; cout<<"n申請資源成功!"
36、;<<endl; for(j=0;j<m;j+) if(Needkj=0); else /有一種資源還沒全部申請到,則該進程不可執(zhí)行,不能釋放擁有的資源 l=1; /置l為1,作為判斷標(biāo)志 break; if(l!=1) /進程可以執(zhí)行,則釋放該進程的所有資源 for (j=0;j<m;j+) Availablej=Availablej+Allocationkj; Allocationkj=0; cout<<"該進程已得到所有需求資源,執(zhí)行后將釋放其所有擁有資源!"<<endl; l=0; /歸零 cout<<&q
37、uot;n安全的狀態(tài)!"<<endl; cout<<"安全序列為: " cout<<endl<<"進程"<<"("<<p0<<")" /輸出安全序列,考慮顯示格式,先輸出第一個 Finish0=0; for (i=1; i<n; i+) cout<<"=>>"<<"進程"<<"("<<pi<&
38、lt;")" Finishi=0; /所有進程置為未分配狀態(tài) cout<<endl<<endl; showdata(); /顯示當(dāng)前狀態(tài) ppp: /申請大于可利用量, 應(yīng)該阻塞等待,結(jié)束本次資源申請,GOTO 語句跳轉(zhuǎn)至此 cout<<endl<<"是否繼續(xù)申請資源(y/n) ?" char* b=new char; /輸入y/n,判斷是否繼續(xù)申請 <<endl cin>>b; cout<<endl; cout<<"="<<e
39、ndl<<endl; cout<<endl; if(*b='y'|*b='Y') r=true; else r=false; /輸入非 Y 則令 R =false / system("cls"); / /在sign() 里調(diào)用 while (r=true);6. 分配模塊此模塊用于顯示當(dāng)前資源分配詳細情況,包括:各種資源的總數(shù)量(all)、系統(tǒng)目前各種資源可用的數(shù)量Available、各進程已經(jīng)得到的資源數(shù)量Allocation、各進程還需要的資源量Need。void showdata() /函數(shù)showdata,輸出
40、當(dāng)前資源分配情況 int i,j; /局部變量 int Ally; /各種資源的總數(shù)量 int l2; /局部變量 l cout<<"="<<endl; cout<<endl<<"% 系統(tǒng)當(dāng)前狀態(tài)如下:%"<<endl; cout<<"% 各種資源的總數(shù)量(all):"<<endl; for (j=0;j<m;j+) cout<<" 資源"<<j<<": " Allj=A
41、vailablej; /初始化 先賦值加上可利用量 for (i=0;i<n;i+) Allj+=Allocationij; /再加上每個進程已分配量計算J類資源總量 cout<<Allj<<" " if (j+1)%5=0 ) cout<<endl; /每行顯示五個 && j!=0 cout<<endl<<endl; cout<<"% 系統(tǒng)目前各種資源可用的數(shù)為(available):"<<endl; for (j=0;j<m;j+) cou
42、t<<" 資源"<<j<<": "<<Availablej<<" " if(j+1)%5=0) cout<<endl; /每行最多顯示五個 && j!=0 cout<<endl<<endl; cout<<"% 各進程已經(jīng)得到的資源量(allocation): "<<endl; for(i=0;i<=m/5;i+) /設(shè)計每行最多顯示五種資源 for (j=i*5;j<i
43、*5+5 && j<m;j+)cout<<" 資源"<<j; cout<<endl; for(l2=0;l2<n;l2+) cout<<"進程"<<l2<<":" for (j=i*5;j<i*5+5 && j<m;j+)cout<<Allocationl2j<<" " cout<<endl; cout<<endl; cout<<
44、"% 各進程還需要的資源量(need):"<<endl; for(i=0;i<=m/5;i+) /設(shè)計每行顯示五種資源 for (j=i*5;j<i*5+5 && j<m;j+)cout<<" 資源"<<j; cout<<endl; for(l2=0;l2<n;l2+) cout<<"進程"<<l2<<":" for (j=i*5;j<i*5+5 && j<m;j+
45、)cout<<Needl2j<<" " cout<<endl; cout<<endl; cout<<endl; system("pause"); / 暫停4、 程序調(diào)試 圖2 各類資源輸入 當(dāng)進入銀行家算法界面后,輸入進程信息和各類資源,包括:進程數(shù)量、資源種類、各種資源可利用數(shù)量Available、各進程的各種資源已分配數(shù)量Allocation、各進程對各類資源最大需求數(shù)Max。圖3 當(dāng)前資源狀態(tài)及安全序列通過輸入相關(guān)信息后,利用顯示函數(shù)予以顯示出來,并在此時刻利用安全性算法進行分析,可知存在
46、一個安全序列進程<1>,進程<3>,進程<0>,進程<2>,進程<4>,故此時系統(tǒng)是安全的。 圖4 進程1申請資源 當(dāng)進程1發(fā)出請求向量Request(1,0,2)系統(tǒng)按照銀行家算法進行檢查,再利用安全性算法檢查此時系統(tǒng)是否安全。經(jīng)檢查,找到一個安全序列進程<1>,進程<3>,進程<0>,進程<2>,進程<4>,因此,系統(tǒng)安全,可以將進程1所申請資源分配給它。 圖5 進程0申請資源當(dāng)進程1發(fā)出請求向量Request(1,0,2)系統(tǒng)按照銀行家算法進行檢查,再利用安全性算法檢查
47、此時系統(tǒng)是否安全。此時,可利用資源Available(2,1,0)已不能滿足任何進程的需要,故若實施分配系統(tǒng)將進入不安全狀態(tài),此時系統(tǒng)不分配資源。5、 總結(jié) 通過本次課程設(shè)計,使我基本懂得了操作系統(tǒng)教程的基礎(chǔ)理論知識和設(shè)計方法,同時在課設(shè)時遇到了不少的問題,通過查閱相關(guān)書籍或請教老師同學(xué)獲得了不少的幫助,在此期間也學(xué)到了不少的知識,提升了知識層面的容量,擴寬了設(shè)計的道路。 由于在課設(shè)中也遇到了關(guān)于銀行家算法的相關(guān)問題,但也比較輕松的解決了,同時也學(xué)習(xí)到了在實踐時的不同知識,真的讓我獲益良多。課程設(shè)計中需要自我的耐心和解決問題的勇氣,正好讓我體驗了一把,沒有足夠的耐心只會感覺到它的枯燥乏味,而沒
48、有體會到實踐帶來的動手能力的提高,這是在以后工作中不可缺少的能力之一,在此感謝辛勤的老師和幫助過我的同學(xué),希望我們一起提高和進步。我們不知道我們接下來的學(xué)期里會有多少課程設(shè)計,但我們已經(jīng)有足夠面對它的勇氣,從中學(xué)會的有關(guān)做事情的一些態(tài)度和方法,將對我們終身受用,以便我們能在社會里創(chuàng)造更好的成就,為社會做出更多的貢獻,所以真心的感謝所有老師,是你們讓我有了體驗的機會,讓我懂得了做事不可能一蹴而就,需要有耐心和毅力,當(dāng)然這也是當(dāng)前社會追求人才所要求的。六、附件#include <iostream.h>#include <stdio.h>#include <stdlib
49、.h> #include <conio.h>#include <string.h>/=定義全局變量=const int x=50,y=100; /定義常量,便于修改int Availablex; /各種資源可利用的數(shù)量int Allocationyy; /各進程當(dāng)前已分配的資源數(shù)量int Maxyy; /各進程對各類資源的最大需求數(shù)int Needyy; /還需求矩陣int Requestx; /申請各類資源的數(shù)量int Workx; /工作向量,表示系統(tǒng)可提供給進程繼續(xù)運行所需的各類資源數(shù)量int Finishy; /表示系統(tǒng)是否有足夠的資源分配給進程,0為否,
50、非0為是int py; /存儲安全序列int i,j;int n,m; /n為進程的數(shù)量,m為資源種類數(shù)int l=0,counter=0;/函數(shù)聲明int shuzi(int sz); /數(shù)字判斷函數(shù) 或者使用 void shuzi(int& sz); 方式void chushihua(); /系統(tǒng)初始化函數(shù)void safe(); /安全性算法函數(shù)void bank(); /銀行家算法函數(shù)void showdata(); /函數(shù)showdata,輸出當(dāng)前資源分配情況/=數(shù)字判斷函數(shù)=int shuzi(int sz) /輸入數(shù)據(jù)并判斷是否為數(shù)字 char *temp; temp=n
51、ew char; /臨時指針,存放輸入字符 int len; /存儲取字符的長度 sz=0 ; /清零 char s; / do /輸入賭注,只能輸入數(shù)字 / gets(temp); /getline(cin,temp) cin>>temp; len=strlen(temp); /取字符長度 for(int i=0;i<len;i+) s= *(temp+i); if(s<'0' | s>'9') cout<<" 輸入的數(shù)字有誤,請重新輸入! nn" cout<<"請重新輸入:&
52、quot; break; while(s<'0' | s>'9'); for(int i=0;i<len;i+) /輸入字符串轉(zhuǎn)化為整形數(shù)字 int t=1; for(int j=1;j<len-i;j+) t*=10; sz+=(*(temp+i)-48)*t; return sz;/=系統(tǒng)初始化函數(shù)=void chushihua() /=系統(tǒng)初始化輸入= cout<<" =歡迎進入銀行家算法= "<<endl; cout<<"="<<endl<
53、;<endl; cout<<"請輸入進程的數(shù)量: "/從此開始輸入有關(guān)數(shù)據(jù) n=shuzi(n); cout<<"請輸入資源種類數(shù): " m=shuzi(m); cout<<endl<<"請輸入各種資源可利用的數(shù)量( "<<m<<" 種): "<<endl; cout<<endl; for (j=0; j<m; j+) cout<<" 輸入資源 "<<j<&l
54、t;" 可利用的數(shù)量Available"<<j<<": " Availablej=shuzi(Availablej); Workj=Availablej; /初始化Workj cout<<endl; cout<<"請輸入各進程當(dāng)前已分配的資源數(shù)量Allocation"<<n<<""<<m<<": "<<endl<<endl; for (i=0; i<n; i+) for
55、(j=0; j<m; j+) cout<<" 請輸入進程 "<<i<<" 當(dāng)前已分配的資源 "<<j<<" 數(shù)量: " Allocationij=shuzi(Allocationij); cout<<endl; Finishi=0;/初始化Finishi cout<<endl; cout<<"請輸入各進程對各類資源的最大需求數(shù)Max"<<n<<""<<m<<": "<<endl<<endl; for (i=0; i<n; i+) for (j=0; j<m; j+) cout<<" 請輸入進程 "<<i<<" 對資源 "<<j<&l
溫馨提示
- 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)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 車工實習(xí)報告匯編15篇
- 外科醫(yī)生個人述職報告14篇
- 導(dǎo)游實習(xí)工作報告范文
- 會展考試文檔練習(xí)測試卷
- 小學(xué)二年級語文《三個兒子》說課稿
- 地理學(xué)專業(yè)實習(xí)報告600字
- 2024年度農(nóng)村集體土地流轉(zhuǎn)合同范本3篇
- 棚戶區(qū)改造項目管理與組織結(jié)構(gòu)
- 老舊廠區(qū)改造市場需求分析
- 2024年商務(wù)樓宇停車位租賃與管理協(xié)議3篇
- 廣東省中山市2023-2024學(xué)年高一下學(xué)期期末統(tǒng)考英語試題
- 古典時期鋼琴演奏傳統(tǒng)智慧樹知到期末考試答案章節(jié)答案2024年星海音樂學(xué)院
- 樂山市市中區(qū)2022-2023學(xué)年七年級上學(xué)期期末地理試題【帶答案】
- 兩人合伙人合作協(xié)議合同
- 蘇教版一年級上冊數(shù)學(xué)期末測試卷含答案(完整版)
- 2023年廣東省普通高中數(shù)學(xué)學(xué)業(yè)水平合格性考試真題卷含答案
- DZ/T 0462.5-2023 礦產(chǎn)資源“三率”指標(biāo)要求 第5部分:金、銀、鈮、鉭、鋰、鋯、鍶、稀土、鍺(正式版)
- 生殖與衰老課件
- 注塑車間工作總結(jié)
- 2024春期國開電大本科《城市管理學(xué)》在線形考(形考任務(wù)1至4)試題及答案
- 綜合英語智慧樹知到期末考試答案2024年
評論
0/150
提交評論