版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p> 《操作系統(tǒng)》課程設(shè)計報告</p><p> 專業(yè): 計算機科學(xué)與技術(shù) </p><p> 班級: 09計本班 </p><p> 題目名稱: 進程調(diào)度模擬程序 </p><p> 完成日期: 2012年6月20日 </p><p><b> 目
2、錄</b></p><p> 第一章 課程設(shè)計目的3</p><p> 第二章 課程設(shè)計要求3</p><p> 第三章 設(shè)計思想4</p><p> 3.1 基本概念4</p><p> 3.2 進程控制塊5</p><p> 3.3 算法思想5</p
3、><p> 第四章 詳細(xì)設(shè)計6</p><p> 4.1 程序設(shè)計流程圖6</p><p> 4.2 程序各模塊功能介紹6</p><p> 第五章 運行結(jié)果及分析14</p><p> 5.1 程序調(diào)試14</p><p> 5.2 運行結(jié)果15</p>&l
4、t;p> 5.3 結(jié)果分析17</p><p><b> 第六章 總結(jié)17</b></p><p><b> 參考文獻18</b></p><p><b> 進程調(diào)度模擬程序 </b></p><p> 第一章 課程設(shè)計目的</p><
5、p> 深入掌握進程調(diào)度的概念原理和實現(xiàn)方法,理解操作系統(tǒng)進程管理中進行進程調(diào)度的過程和編程方法,掌握先來先服務(wù)調(diào)度算法和最高優(yōu)先數(shù)優(yōu)先的調(diào)度算法,創(chuàng)建進程控制塊PCB。理解進程的狀態(tài)及變化,動態(tài)顯示每個進程的當(dāng)前狀態(tài)及進程的調(diào)度情況。進程調(diào)度是處理機管理的核心內(nèi)容。本次課程設(shè)計用C語言編寫模擬進程調(diào)度程序,以便加深理解有關(guān)進程控制快、進程隊列等概念,并體會最高優(yōu)先數(shù)優(yōu)先與按時間片輪轉(zhuǎn)調(diào)度結(jié)合算法的優(yōu)缺點。</p>
6、<p> 第二章 課程設(shè)計要求</p><p> 編寫一個進程調(diào)度程序,允許多個進程并行執(zhí)行。</p><p> 1、進程調(diào)度算法:采用最高優(yōu)先數(shù)優(yōu)先與按時間片輪轉(zhuǎn)調(diào)度結(jié)合算法。</p><p> 2、每個進程有一個進程控制塊(PCB)表示。進程控制塊可以包含如下信息:進程名、優(yōu)先數(shù)、到達時間、需要運行時間、已用CPU時間、進程狀態(tài)等等。</
7、p><p> 3、進程的優(yōu)先數(shù)及需要的運行時間可在運行時輸入,進程的到達時間為輸入進程的時間。</p><p> 4、進程的運行時間以時間片為單位進行計算。</p><p> 5、每個進程的狀態(tài)可以是就緒 W(Wait)、運行R(Run)、或完成F(Finish)三種狀態(tài)之一。</p><p> 6、就緒進程獲得 CPU后都只能運行一個時
8、間片。</p><p> 7、如果運行一個時間片后,進程的已占用 CPU時間已達到所需要的運行時間,則撤消該進程,如果運行一個時間片后進程的已占用CPU時間還未達所需要的運行時間,也就是進程還需要繼續(xù)運行,此時應(yīng)將進程的優(yōu)先數(shù)減1(即降低一級),然后把它插入就緒隊列等待CPU。</p><p> 8、每進行一次調(diào)度程序都打印一次運行進程、就緒隊列、以及各個進程的 PCB,以便進行檢查。
9、</p><p> 重復(fù)以上過程,直到所要進程都完成為止。</p><p><b> 第三章 設(shè)計思想</b></p><p><b> 3.1 基本概念</b></p><p> 優(yōu)先級調(diào)度算法:按照進程的優(yōu)先級大小來調(diào)度。使高優(yōu)先級進程或線程得到優(yōu)先的處理的調(diào)度策略稱為優(yōu)先級調(diào)度算法。進
10、程的優(yōu)先級可以由系統(tǒng)自動地按一定原則賦給它,也可由系統(tǒng)外部來進行安排。本次課程設(shè)計是自己給定進程的優(yōu)先級。</p><p> 但在許多采用優(yōu)先級調(diào)度的系統(tǒng)中,通常采用動態(tài)優(yōu)先數(shù)策略。即一個進程的優(yōu)先級不是固定的,往往是隨許多因素的變化而變化。尤其隨作業(yè)(進程)的等待時間,已使用的處理器時間或其他系統(tǒng)資源的使用情況而定,以防止低優(yōu)先級進程或線程長期饑餓現(xiàn)象發(fā)生</p><p> 時間片輪
11、轉(zhuǎn)算法: 時間片輪轉(zhuǎn)調(diào)度是一種最古老,最簡單,最公平且使用最廣的算法。每個進程被分配一個時間段,稱作它的時間片,即該進程允許運行的時間。如果在時間片結(jié)束時進程還在運行,則CPU將被剝奪并分配給另一個進程。如果進程在時間片結(jié)束前阻塞或結(jié)束,則CPU當(dāng)即進行切換。調(diào)度程序所要做的就是維護一張就緒進程列表,當(dāng)進程用完它的時間片后,它被移到隊列的末尾。時間片輪轉(zhuǎn)算法主要用于處理器調(diào)度。采用此算法的系統(tǒng),其進程就緒隊列往往按進程到達的時間來排序。
12、進程調(diào)度程序總是選擇就緒隊列中的第一個進程,也就是說按照先進先出原則調(diào)度,但一旦進程占有處理器僅使用一個時間片,在使用完一個時間片后,進程還沒有完成其運行,它也必須釋放出(被搶占)處理器給下一個就緒的進程。而被搶占的進程返回到就緒隊列的末尾重新排隊等候再次運行。</p><p> 進程調(diào)度程序選擇一個就緒狀態(tài)的進程,使之在處理器上運行,每個進程的狀態(tài)信息用數(shù)據(jù)結(jié)構(gòu)(進程控制塊PCB)表示,進程的調(diào)度采用最高優(yōu)先
13、數(shù)優(yōu)先和按時間片輪轉(zhuǎn)相結(jié)合的調(diào)度算法,并且采用動態(tài)優(yōu)先數(shù)策略,選擇進程占用處理器后該進程僅能使用一個時間片,運行完后優(yōu)先數(shù)減1。</p><p><b> 進程的狀態(tài):</b></p><p> 運行狀態(tài)R(Run):進程正在處理器上運行。</p><p> 就緒狀態(tài)W(Wait):一個進程獲得了除處理器外的一切所需資源,一旦得到處理器即
14、可運行。</p><p> 完成狀態(tài)F(Finish):一個進程一旦完成,就停止運行。</p><p><b> 3.2 進程控制塊</b></p><p> 描述進程的狀態(tài)信息,用結(jié)構(gòu)體定義</p><p> typedef struct process </p><p> { ch
15、ar name[10]; //進程名</p><p> int priority; //優(yōu)先數(shù)</p><p> Time ReachTime; //到達時間</p><p> Time NeedTime; //需要運行時間</p><p> Time UsedT
16、ime; //已用時間</p><p> char state; //進程狀態(tài)</p><p> }PCB; //進程控制塊</p><p> 圖1 進程調(diào)度模擬程序模塊圖</p><p><b> 3.3 算法思想</b></p
17、><p> 定義結(jié)構(gòu)體PCB描述進程的進程控制塊,定義數(shù)組PCB pcb[Max]存放進程</p><p> 進程調(diào)度程序調(diào)用face()函數(shù)選擇所要進行的操作。輸入1則增加進程并調(diào)度進程;輸入2則打印進程,輸入0則任務(wù)結(jié)束;增加進程,調(diào)用AddProcess()函數(shù),將輸入的進程存放在數(shù)組pcb[Max]中;打印進程,調(diào)用print()函數(shù),在該函數(shù)中首先調(diào)用sort()函數(shù)對進程按優(yōu)先
18、級和先來先服務(wù)排序,然后顯示輸出排序后的進程。進程調(diào)度,調(diào)用attemper()函數(shù),調(diào)度優(yōu)先級最高的進程分配給CPU使之運行一個時間片,進程優(yōu)先級排序,調(diào)用sort()函數(shù),按照先來先服務(wù)和優(yōu)先級排序,使排序完最優(yōu)先運行的進程存放在pcb[0]中。</p><p><b> 第四章 詳細(xì)設(shè)計</b></p><p> 4.1 程序設(shè)計流程圖</p>
19、<p> 圖2 程序設(shè)計流程圖</p><p> 4.2 程序各模塊功能介紹</p><p> <1> 進程優(yōu)先級排序sort( )函數(shù):函數(shù)用冒泡法排序,首先按到達時間排序,使到達時間最早(即pcb[n].ReachTime最?。┑倪M程被交換到pcb[0]中,再按優(yōu)先級排序,使具有最高優(yōu)先級(即pcb[n].priority最大)的進程被交換到pcb[0]
20、中。相同優(yōu)先級的進程只按到達時間排序 。</p><p><b> 主要代碼如下:</b></p><p> for (i=0;i<n-1;i++) //先按到達時間排序</p><p> { for (j=n-2;j>=i;j--)</p><p> { if (pcb[j+1].
21、ReachTime<pcb[j].ReachTime)</p><p><b> {</b></p><p> temp=pcb[j];</p><p> pcb[j]=pcb[j+1];</p><p> pcb[j+1]=temp;</p><p><b> }<
22、;/b></p><p><b> }</b></p><p><b> }</b></p><p> for (i=0;i<n-1;i++) //再按優(yōu)先級進行排序</p><p> { for (j=n-2;j>=i;j--)</p><
23、p> { if (pcb[j+1].priority>pcb[j].priority)</p><p> { temp=pcb[j];</p><p> pcb[j]=pcb[j+1];</p><p> pcb[j+1]=temp;</p><p><b> }</b></p>
24、<p><b> }</b></p><p><b> } </b></p><p> 進程優(yōu)先級排序Sort()函數(shù)的流程圖如圖3所示。</p><p> 圖3 sort( )函數(shù)流程圖</p><p> <2> 打印進程print( )函數(shù):先調(diào)用sort()排
25、序函數(shù)對進程進行排序,排序完再打印輸出進程</p><p><b> 主要代碼如下: </b></p><p><b> sort();</b></p><p> printf("\n 進程名 優(yōu)先級 到達時間 需要時間 已用時間 進程狀態(tài) \n");</p><p&g
26、t; for (i=0;i<n;i++)</p><p> {printf("%8s%8d%8d%10d%10d%10c\n",pcb[i].name,pcb[i].priority,pcb[i].ReachTime,pcb[i].NeedTime,pcb[i].UsedTime,pcb[i].state);</p><p><b> }</
27、b></p><p> <3> 進程調(diào)入AddProcess()函數(shù):增加進程函數(shù),輸入要添加的進程的進程控制塊的信息,并依次存放在數(shù)組PCB pcb[Max]中,每加入一個進程后判斷是否還要繼續(xù)增加進程,若是則繼續(xù)循環(huán)的執(zhí)行操作</p><p> 主要代碼如下: </p><p><b> do {</b>&l
28、t;/p><p> printf("\n請輸入進程名");</p><p> scanf("%s",pcb[n].name);</p><p> printf("請輸入進程的優(yōu)先級");</p><p> scanf("%d",&pcb[n].prio
29、rity);</p><p> printf("請輸入進程需要的時間");</p><p> scanf("%d",&pcb[n].NeedTime);</p><p> pcb[n].ReachTime=n;</p><p> pcb[n].UsedTime=0;</p>
30、<p> pcb[n].state='W';</p><p><b> n++;</b></p><p> printf("還要繼續(xù)增加進程嗎,是(Y),否(N)");</p><p><b> do { </b></p><p> ch=g
31、etchar();</p><p> } while(ch!='Y'&&ch!='N'&&ch!='y'&&ch!='n');</p><p> }while (ch=='Y'||ch=='y');</p><p>
32、打印進程print( )函數(shù)和進程調(diào)入函數(shù)AddProcess()函數(shù)的流程圖如圖4和圖5所示。</p><p> 圖 4 print( )函數(shù)流程圖 </p><p> 圖 5 AddProcess()函數(shù)流程圖</p><p> <4> 進程調(diào)入attemper( )函數(shù):調(diào)度排完序后
33、存放在pcb[0]中的進程,分配給該進程CPU,使之運行一個時間片,然后比較進程的剩余時間(pcb[0].NeedTime-pcb[0].UsedTime)是否小于時間片的大小pTime,若是,則該進程調(diào)度完成,進程處于完成狀態(tài),若非,則已用時間加上一個時間片,進程處于就緒狀態(tài)繼續(xù)等待運行,然后調(diào)用print( )函數(shù)打印輸出當(dāng)前進程的狀態(tài)并排序,直至所有進程處于完成狀態(tài)后結(jié)束運行。</p><p> 主要代碼
34、如下: </p><p><b> do { </b></p><p> if ((pcb[0].NeedTime-pcb[0].UsedTime)>pTime)</p><p> { pcb[0].UsedTime+=pTime; //已用時間加時間片</p><p> pcb[0].prior
35、ity--;//優(yōu)先級減一</p><p> pcb[0].state='W';</p><p><b> }</b></p><p><b> else</b></p><p> { pcb[0].UsedTime=pcb[0].NeedTime; //已用時間等于需
36、要時間</p><p> pcb[0].priority=-1000;//優(yōu)先級置為零</p><p> pcb[0].state='F';//完成進程,將狀態(tài)置為完成</p><p><b> }</b></p><p><b> print();</b></p>
37、;<p> }while(pcb[0].state!='F');</p><p> 進程調(diào)入attemper( )函數(shù)流程圖如圖6所示。</p><p> 圖6 attemper( )函數(shù)流程圖</p><p> <5> 選擇操作face( )函數(shù):函數(shù)打印所能進行的操作以供選擇。輸入1則是增加進程后調(diào)度進程,輸入
38、2則是打印進程,輸入0則是任務(wù)結(jié)束。</p><p><b> 主要代碼如下:</b></p><p> char choose;</p><p> printf("\n增加進程并調(diào)度進程,請按1");</p><p> printf("\n打印進程,請按2");</
39、p><p> printf("\n任務(wù)結(jié)束, 請按0");</p><p> printf("\n請選擇:");</p><p><b> do{</b></p><p> choose=getchar();</p><p> } while(cho
40、ose!='1'&&choose!='2'&&choose!='0');</p><p> return choose;</p><p><b> } </b></p><p> 選擇操作face( )函數(shù)流程圖如圖7所示。</p><p&
41、gt; 圖7 face( )函數(shù)流程圖</p><p> <6> main( )函數(shù):首先設(shè)置時間片的大小pTime,然后調(diào)用face()函數(shù)選擇要進行的操作,choose='1'則增加進程并調(diào)度,choose='2'則打印進程,choose='0'則任務(wù)結(jié)束。</p><p><b> 主要代碼如下:</
42、b></p><p> char choose;</p><p> n=0; //初始化進程數(shù)為0</p><p> printf("設(shè)置時間片的大小:");</p><p> scanf("%d",&pTime);</p><p> choose=
43、face();</p><p><b> do </b></p><p> { if (choose=='1')</p><p> { AddProcess();</p><p><b> print();</b></p><p> attem
44、per();</p><p><b> }</b></p><p> if (choose=='2')</p><p> { print();</p><p><b> }</b></p><p> if (choose=='0')
45、</p><p> { return;</p><p><b> }</b></p><p> choose=face();</p><p> } while(1);</p><p><b> 函數(shù)間的關(guān)系:</b></p><p> 1
46、)sort( )函數(shù)嵌套在print()函數(shù)中調(diào)用</p><p> 2)調(diào)用AddProcess()函數(shù)前必須先調(diào)用print()函數(shù)對進程進行排序并打印。</p><p> Main()函數(shù)的流程圖如圖8所示。</p><p> 圖8 main( )函數(shù)流程圖</p><p> 第五章 運行結(jié)果及分析</p>&l
47、t;p><b> 5.1 程序調(diào)試</b></p><p> 此次課程設(shè)計進程調(diào)度模擬程序是用C編寫的程序,運行環(huán)境是Microsoft Visual C++6.0。在VC++6.0中的編寫的程序如圖9所示。</p><p> 圖 9 vc++6.0中調(diào)試程序</p><p><b> 5.2 運行結(jié)果</b>
48、;</p><p> 首先設(shè)置時間片大小,然后根據(jù)提示,選擇1創(chuàng)建進程,輸入進程的名稱,該進程的優(yōu)先級,該進程需要的運行時間。然后依次創(chuàng)建三個進程,詳細(xì)信息如圖10所示。</p><p> 圖 10 創(chuàng)建三個進程的詳細(xì)信息</p><p> 點擊回車鍵,運行創(chuàng)建的三個進程,運行過程如圖11所示。</p><p> 圖 11 三個進程的
49、運行過程</p><p> 上述創(chuàng)建的三個進程運行完以后,還可以繼續(xù)創(chuàng)建新的進程繼續(xù)運行。如圖12所示。</p><p> 圖 12 新創(chuàng)建進程的運行過程</p><p><b> 5.3 結(jié)果分析</b></p><p> 運行程序后,首先根據(jù)提示設(shè)置時間片大小為10,然后順序創(chuàng)建三個進程llg,lly,llt
50、,它們的優(yōu)先級依次為5,8,4,需要運行的時間為20,10,16,程序默認(rèn)三個進程到達的時間依次為0,1,2。運行進程,首先比較優(yōu)先級大小,選擇進程lly運行,其進程狀態(tài)為R(運行),其運行一個時間片時間以后,該進程運行完成,優(yōu)先級減變?yōu)?100(程序默認(rèn)),然后其進程狀態(tài)變?yōu)镕(完成);再選擇llg進程運行,首先其進程狀態(tài)從W(等待)變?yōu)镽(運行),然后運行一個時間片時間以后,該進程還沒運行完成,其優(yōu)先級減1變?yōu)?,相比llt進程,他
51、們具有相同的優(yōu)先級,所以繼續(xù)運行l(wèi)lg進程,再運行一個時間片以后,該進程運行完成,其優(yōu)先級變?yōu)?100(程序默認(rèn)),其進程狀態(tài)從R(運行)變?yōu)镕(完成);最后運行l(wèi)lt進程,首先它的進程狀態(tài)運行一個時間片以后,換沒結(jié)束,再運行6以后運行結(jié)束,其優(yōu)先級變?yōu)?100(程序默認(rèn)),其進程狀態(tài)從R(運行)變?yōu)镕(完成)。至此,創(chuàng)建的三個進程運行完畢,換可以創(chuàng)建新的進程運行,如圖12所示。</p><p><b>
52、; 第六章 總結(jié)</b></p><p> 通過此次課程設(shè)計,我掌握進程調(diào)度的相關(guān)知識,特別是結(jié)和最高優(yōu)先級優(yōu)先算法和按時間輪轉(zhuǎn)算法有了新的認(rèn)識。課程設(shè)計和平時的實驗課比較起來有很大的差距,實驗課只是將這一章中的一部分內(nèi)容練習(xí)操作一遍,而課程設(shè)計需要的是他們綜合起來的東西,這要更難一些。此次課程設(shè)計主要遇到的困難就是,最高級優(yōu)先數(shù)優(yōu)先算法和按時間片輪轉(zhuǎn)法的算法的結(jié)合,經(jīng)過查閱資料和自己多次的調(diào)試,
53、終于使編寫的程序達到了預(yù)期的效果。</p><p> 總體來說我認(rèn)為操作系統(tǒng)這門學(xué)科在計算機科學(xué)當(dāng)是中非常重要的。這次操作系統(tǒng)的課程設(shè)計收獲頗豐,復(fù)習(xí)了許多東西,也從新學(xué)會了許多東西。我想這也許就是課程設(shè)計的最終目的吧。</p><p><b> 參考文獻</b></p><p> [1]劉振安、劉燕君著.《C++程序設(shè)計課程設(shè)計》.北京
54、: 機械工業(yè)出版社,2004</p><p> [2][美]Abraham Silberschatz, Peter Baer Galvin, Greg Gagne 著. 鄭扣根 譯. 操作系統(tǒng)概念(第六版). 北京: 高等教育出版社,2004</p><p> [3]陳向群,向勇 等. Windows操作系統(tǒng)原理(第二版). 北京:機械工業(yè)出版社,2004.</p>&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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 課程設(shè)計報告---處理機調(diào)度模擬程序
- 《高級語言程序設(shè)計》課程設(shè)計--進程調(diào)度模擬
- 頁面置換算法模擬程序課程設(shè)計
- 頁面置換算法模擬程序課程設(shè)計報告
- 進程調(diào)度模擬系統(tǒng)課程設(shè)計
- 進程模擬調(diào)度算法課程設(shè)計
- java課程設(shè)計-atm柜員機模擬程序資料
- 操作系統(tǒng)課程設(shè)計--進程調(diào)度程序設(shè)計
- 操作系統(tǒng)課程設(shè)計-進程調(diào)度模擬
- 操作系統(tǒng)課程設(shè)計報告---信號燈模擬程序
- java計算器課程設(shè)計---計算器模擬程序
- 操作系統(tǒng)課程設(shè)計——進程調(diào)度模擬算法
- 操作系統(tǒng)課程設(shè)計---進程調(diào)度模擬設(shè)計
- 操作系統(tǒng)課程設(shè)計——進程調(diào)度模擬算法
- 操作系統(tǒng)課程設(shè)計報告--頁面置換算法模擬程序設(shè)計
- 操作系統(tǒng)課程設(shè)計報告--頁面置換算法模擬程序設(shè)計
- 操作系統(tǒng)課程設(shè)計---進程調(diào)度子系統(tǒng)模擬實現(xiàn)
- 操作系統(tǒng)課程設(shè)計報告---進程調(diào)度的模擬實現(xiàn)
- 操作系統(tǒng)進程調(diào)度課程設(shè)計
- 操作系統(tǒng)進程調(diào)度課程設(shè)計
評論
0/150
提交評論