版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 《操作系統(tǒng)原理》</b></p><p><b> 課程設(shè)計(jì)報告</b></p><p> 二〇一一年十二月十二日</p><p><b> 目錄</b></p><p> 一、《操作系統(tǒng)原理》課程設(shè)計(jì)的目的與要求3</p>
2、<p><b> 1、目的3</b></p><p><b> 2、要求3</b></p><p> 二、簡述課程設(shè)計(jì)內(nèi)容、主要功能和實(shí)現(xiàn)環(huán)境3</p><p> 1.課程設(shè)計(jì)內(nèi)容3</p><p> 三、任務(wù)的分析、設(shè)計(jì)、實(shí)現(xiàn)和討論3</p>
3、<p> 1、任務(wù)的分析3</p><p> 2、任務(wù)的設(shè)計(jì)與實(shí)現(xiàn)5</p><p><b> 五、附錄11</b></p><p> 進(jìn)程調(diào)度—優(yōu)先數(shù)法與簡單輪轉(zhuǎn)法</p><p> 《操作系統(tǒng)原理》課程設(shè)計(jì)的目的與要求</p><p><b>
4、目的</b></p><p> 進(jìn)程是操作系統(tǒng)最重要的概念之一,進(jìn)程調(diào)度又是操作系統(tǒng)核心的主要內(nèi)容。本實(shí)習(xí)要求學(xué)生獨(dú)立地用高級語言編寫和調(diào)試一個簡單的進(jìn)程調(diào)度程序。調(diào)度算法可任意選擇或自行設(shè)計(jì)。任務(wù)一采用簡單輪轉(zhuǎn)法,任務(wù)二采用優(yōu)先數(shù)法等。本課題可以加深對進(jìn)程調(diào)度和各種調(diào)度算法的理解。</p><p><b> 要求</b></p><
5、;p> 設(shè)計(jì)一個有n個進(jìn)程并發(fā)的進(jìn)程調(diào)度程序。每個進(jìn)程由一個進(jìn)程控制塊(PCB)表示。進(jìn)程控制塊一般應(yīng)該包含下述信息:進(jìn)程名、進(jìn)程優(yōu)先數(shù)、進(jìn)程需要運(yùn)行的時間、占用CPU的時間以及進(jìn)程的狀態(tài)等,且可按調(diào)度算法的不同而增刪。</p><p> 調(diào)度程序應(yīng)包含2種不同的調(diào)度算法,運(yùn)行時可任意選一種,以利于各種算法的分析比較。</p><p> 算法應(yīng)能顯示或打印各個進(jìn)程的PID、狀態(tài)
6、(運(yùn)行狀態(tài)R、等待狀態(tài)W等)和參數(shù)(已運(yùn)行時間等)的變化情況,便于觀察諸進(jìn)程的調(diào)度過程</p><p> 進(jìn)程是操作系統(tǒng)最重要的概念之一,進(jìn)程調(diào)度又是操作系統(tǒng)核心的主要內(nèi)容。本實(shí)習(xí)要求學(xué)生獨(dú)立地用高級語言編寫和調(diào)試一個簡單的進(jìn)程調(diào)度程序。調(diào)度算法可任意選擇或自行設(shè)計(jì)。任務(wù)一采用簡單輪轉(zhuǎn)法,任務(wù)二采用優(yōu)先數(shù)法等。本課題可以加深對進(jìn)程調(diào)度和各種調(diào)度算法的理解。</p><p> 簡述課程設(shè)
7、計(jì)內(nèi)容、主要功能和實(shí)現(xiàn)環(huán)境</p><p><b> 課程設(shè)計(jì)內(nèi)容 </b></p><p> 進(jìn)程調(diào)度是處理機(jī)管理的核心內(nèi)容。本實(shí)驗(yàn)要求用C語言編寫和調(diào)試一個簡單的進(jìn)程調(diào)度程序。選用優(yōu)先數(shù)法或簡單輪轉(zhuǎn)法對五個進(jìn)程進(jìn)行調(diào)度。每個進(jìn)程處于運(yùn)行R(run)、就緒W(wait)和完成F(finish)三種狀態(tài)之一,并假設(shè)起始狀態(tài)都是就緒狀態(tài)W。為了便于處理,程序進(jìn)程的運(yùn)
8、行時間以時間片為單位計(jì)算。各進(jìn)程的優(yōu)先數(shù)或輪轉(zhuǎn)時間片數(shù)、以及進(jìn)程需要運(yùn)行的時間片數(shù),均由偽隨機(jī)數(shù)發(fā)生器產(chǎn)生。通過本實(shí)驗(yàn)可以加深理解有關(guān)進(jìn)程控制塊、進(jìn)程隊(duì)列的概念,并體會和了解優(yōu)先數(shù)和時間片輪轉(zhuǎn)調(diào)度算法的具體實(shí)施辦法。</p><p><b> 主要功能</b></p><p> 本程序可選用優(yōu)先數(shù)法或簡單輪轉(zhuǎn)法對五個進(jìn)程進(jìn)行調(diào)度。每個進(jìn)程處于運(yùn)行R(run)、就緒
9、W(wait)和完成F(finish)三種狀態(tài)之一,并假設(shè)起始狀態(tài)都是就緒狀態(tài)W。為了便于處理,程序進(jìn)程的運(yùn)行時間以時間片為單位計(jì)算。</p><p><b> 實(shí)現(xiàn)環(huán)境</b></p><p> 本次課程設(shè)計(jì)結(jié)合算法的特點(diǎn),采用Windows操作系統(tǒng)平臺。開發(fā)工具為Microsoft Visual C++6.0。</p><p> 任務(wù)
10、的分析、設(shè)計(jì)、實(shí)現(xiàn)和討論</p><p><b> 任務(wù)的分析</b></p><p> 本程序可選用優(yōu)先數(shù)法或簡單輪轉(zhuǎn)法對五個進(jìn)程進(jìn)行調(diào)度。每個進(jìn)程處于運(yùn)行R(run)、就緒W(wait)和完成F(finish)三種狀態(tài)之一,并假設(shè)起始狀態(tài)都是就緒狀態(tài)W。為了便于處理,程序進(jìn)程的運(yùn)行時間以時間片為單位計(jì)算。各進(jìn)程的優(yōu)先數(shù)或輪轉(zhuǎn)時間片數(shù)、以及進(jìn)程需要運(yùn)行的時間片數(shù)
11、,均由偽隨機(jī)數(shù)發(fā)生器產(chǎn)生。</p><p> 下面介紹優(yōu)先數(shù)法和簡單輪轉(zhuǎn)法兩種進(jìn)程調(diào)度算法:</p><p> 優(yōu)先數(shù)法。進(jìn)程就緒鏈按優(yōu)先數(shù)大小從高到低排列,鏈?zhǔn)走M(jìn)程首先投入運(yùn)行。每過一個時間片,運(yùn)行進(jìn)程所需運(yùn)行的時間片數(shù)減1,說明它已運(yùn)行了一個時間片,優(yōu)先數(shù)也減3,理由是該進(jìn)程如果在一個時間片中完成不了,優(yōu)先級應(yīng)該降低一級。接著比較現(xiàn)行進(jìn)程和就緒鏈鏈?zhǔn)走M(jìn)程的優(yōu)先數(shù),如果仍是現(xiàn)行進(jìn)程高
12、或者相同,就讓現(xiàn)行進(jìn)程繼續(xù)進(jìn)行,否則,調(diào)度就緒鏈鏈?zhǔn)走M(jìn)程投入運(yùn)行。原運(yùn)行進(jìn)程再按其優(yōu)先數(shù)大小插入就緒鏈,且改變它們對應(yīng)的進(jìn)程狀態(tài),直至所有進(jìn)程都運(yùn)行完各自的時間片數(shù)。</p><p> 簡單輪轉(zhuǎn)法。進(jìn)程就緒鏈按各進(jìn)程進(jìn)入的先后次序排列,進(jìn)程每次占用處理機(jī)的輪轉(zhuǎn)時間按其重要程度登入進(jìn)程控制塊中的輪轉(zhuǎn)時間片數(shù)記錄項(xiàng)(相當(dāng)于優(yōu)先數(shù)法的優(yōu)先數(shù)記錄項(xiàng)位置)。每過一個時間片,運(yùn)行進(jìn)程占用處理機(jī)的時間片數(shù)加1,然后比較占用處
13、理機(jī)的時間片數(shù)是否與該進(jìn)程的輪轉(zhuǎn)時間片數(shù)相等,若相等說明已到達(dá)輪轉(zhuǎn)時間,應(yīng)將現(xiàn)運(yùn)行進(jìn)程排到就緒鏈末尾,調(diào)度鏈?zhǔn)走M(jìn)程占用處理機(jī),且改變它們的進(jìn)程狀態(tài),直至所有進(jìn)程完成各自的時間片。</p><p> 進(jìn)程控制塊結(jié)構(gòu)如下:</p><p> 進(jìn)程控制塊鏈結(jié)構(gòu)如下:</p><p> 其中:RUN—當(dāng)前運(yùn)行進(jìn)程指針;</p><p> HE
14、AD—進(jìn)程就緒鏈鏈?zhǔn)字羔槪?lt;/p><p> TAID—進(jìn)程就緒鏈鏈尾指針。</p><p><b> 任務(wù)的設(shè)計(jì)與實(shí)現(xiàn)</b></p><p><b> 算法流程圖:</b></p><p><b> 操作過程和結(jié)果分析</b></p><p>
15、; 優(yōu)先數(shù)調(diào)度算法測試數(shù)據(jù):</p><p> 優(yōu)先數(shù)調(diào)度算法程序運(yùn)行結(jié)果截圖:</p><p><b> 圖1.1 結(jié)果截圖</b></p><p><b> 圖1.2 結(jié)果截圖</b></p><p> 簡單輪轉(zhuǎn)調(diào)度算法測試數(shù)據(jù):</p><p> 簡單輪轉(zhuǎn)調(diào)
16、度算法程序運(yùn)行結(jié)果截圖:</p><p><b> 圖2.1 結(jié)果截圖</b></p><p><b> 圖2.2 結(jié)果截圖</b></p><p><b> 圖2.3 結(jié)果截圖</b></p><p><b> 思考題的解答和討論</b><
17、/p><p> 通過以上的調(diào)度算法測試數(shù)據(jù),得出以下不同算法的不同調(diào)度性能結(jié)果:</p><p> 《操作系統(tǒng)》課程設(shè)計(jì)小結(jié)</p><p> 當(dāng)我在回首這一個星期的時候,不因虛度光陰而悔恨,也不因碌碌無為而羞恥。我想,這可能是我一學(xué)期中最豐富而有意義的一個星期了。</p><p> 從大一開始我的理論知識就比實(shí)踐知識好的多,每門課都如此
18、,實(shí)訓(xùn)是我最頭疼的一件事。課本上記得很牢的東西到了實(shí)際操作的時候感覺都用不上,做個實(shí)驗(yàn)就手忙腳亂的。所以我感覺,這個星期的課設(shè)不僅學(xué)到了在理論課上學(xué)不到的知識,更是讓我對自己的實(shí)踐操作有了信心。</p><p> 本次課程設(shè)計(jì)的題目之一是進(jìn)程調(diào)度——優(yōu)先數(shù)法與簡單輪轉(zhuǎn)法。在多任務(wù)系統(tǒng)中,進(jìn)程調(diào)度是CPU管理的一項(xiàng)核心工作。根據(jù)調(diào)度模式的不同,多任務(wù)系統(tǒng)有兩種類型,即非搶占式和搶占式。其中,優(yōu)先數(shù)法是非搶占式調(diào)度
19、策略,而簡單輪轉(zhuǎn)法是搶占式調(diào)度策略。進(jìn)程調(diào)度算法是系統(tǒng)效率的關(guān)鍵,它確定了系統(tǒng)對資源,特別是對CPU資源的分配策略,因而直接決定著系統(tǒng)最本質(zhì)的性能指標(biāo),如相應(yīng)速度和吞吐量等。常用的調(diào)度算法有:先進(jìn)先出法,短進(jìn)程優(yōu)先法,時間片輪轉(zhuǎn)法(時間片輪轉(zhuǎn)法還分為可變時間片輪轉(zhuǎn)法和簡單循環(huán)輪轉(zhuǎn)法),優(yōu)先級調(diào)度法。簡單循環(huán)輪轉(zhuǎn)法中的時間片q是一個十分重要的因素,它的計(jì)算公式為q=t/n。q的選擇對進(jìn)程調(diào)度有很大的影響。q取的太大,輪轉(zhuǎn)法就會退化成先進(jìn)先
20、出算法;而取的太小,則會導(dǎo)致系統(tǒng)開銷增加,將時間浪費(fèi)在進(jìn)程切換上。所以q必須取值適中,使就緒隊(duì)列中的所有進(jìn)程都能得到同樣的服務(wù)。但我們這次的實(shí)驗(yàn)中暫時還沒有考慮到時間片q對算法的影響,只是測試了這個調(diào)度策略的算法。</p><p> 這次我們的實(shí)驗(yàn)測試并比較了簡單輪轉(zhuǎn)法和優(yōu)先數(shù)法這兩種調(diào)度策略的性能。不同的算法有它自己不同的長處,簡單輪轉(zhuǎn)法雖然能夠使每個進(jìn)程可以以相等的速度向前進(jìn)展,但對于緊急進(jìn)程的處理就顯然不
21、及優(yōu)先數(shù)法??墒莾?yōu)先數(shù)法的開銷較高,而且可能對于較短而且優(yōu)先級低的進(jìn)程會花較長的時間等待。不過它還是具有良好的均衡性。實(shí)際應(yīng)用中,經(jīng)常是多種策略結(jié)合使用。如時間片輪轉(zhuǎn)法中也可以適當(dāng)考慮優(yōu)先級因素,對于緊急的進(jìn)程可以分配一個長一點(diǎn)的時間片,或連續(xù)運(yùn)行多個時間片等。這樣取長補(bǔ)短,合理利用各種不同算法的優(yōu)勢,讓CPU的運(yùn)行效率大大提高。</p><p> 人們總是在尋找更好的解決方案,讓算法的性能和開銷得到一個相對較
22、好的平衡。我在尋找這樣的一個解決方案時,同學(xué)對我說雖然老師沒有在課上講過這個策略,但其實(shí)書上有關(guān)于更好的調(diào)度策略。也就是多級反饋隊(duì)列調(diào)度。這種算法可以先用較小的時間片處理完那些用時較短的進(jìn)程,而給那些用時較長的進(jìn)程分配較大的時間片,以免較長的進(jìn)程頻繁被中斷而影響處理機(jī)的效率。這也就是上面所提到的“多種策略結(jié)合使用,如時間片輪轉(zhuǎn)法中也可以適當(dāng)考慮優(yōu)先級因素”。 </p><p> 溫故而知新,可以為師矣。這次編
23、程中所用到的C語言正是我們大一就學(xué)過的計(jì)算機(jī)語言。在平時的學(xué)習(xí)中和實(shí)訓(xùn)中我們總能用到它。這樣反復(fù)的運(yùn)用和考核,讓我對C語言的認(rèn)識更進(jìn)了一步。</p><p> 路漫漫其修遠(yuǎn)兮,吾將上下而求索。我們對操作系統(tǒng)的學(xué)習(xí)還有很長的路要走,死鎖只是其中的一小部分。重要的是,我在實(shí)訓(xùn)的這種里學(xué)到了這樣的一種精神,一種知難而上,相信努力和付出能夠帶來好的結(jié)果的精神。這種精神比刻板的知識點(diǎn)更加重要,能夠指引我走向更寬闊的明天。
24、</p><p><b> 附錄</b></p><p> #include "stdio.h"</p><p> #include "stdlib.h"</p><p> #include "string.h"</p><p>
25、 typedef struct node</p><p><b> {</b></p><p> char name[10]; /*進(jìn)程標(biāo)識符*/</p><p> int prio; /*進(jìn)程優(yōu)先數(shù)*/</p><p> int round; /*進(jìn)程時間輪轉(zhuǎn)時間片*/</p><
26、p> int cputime; /*進(jìn)程占用CPU時間*/</p><p> int needtime; /*進(jìn)程到完成還要的時間*/</p><p> int count; /*計(jì)數(shù)器*/</p><p> char state; /*進(jìn)程的狀態(tài)*/</p><p> struct node *next; /*鏈指針*/&
27、lt;/p><p><b> }PCB;</b></p><p> PCB *finish,*ready=NULL,*tail,*run,*pfcfs,*pfcfs1; /*隊(duì)列指針*/</p><p> int N; /*進(jìn)程數(shù)*/</p><p> /*將就緒隊(duì)列中的第一個進(jìn)程投入運(yùn)行*/</p>
28、<p> void firstin()</p><p><b> {</b></p><p> run=ready; /*就緒隊(duì)列頭指針賦值給運(yùn)行頭指針*/</p><p> run->state='R'; /*進(jìn)程狀態(tài)變?yōu)檫\(yùn)行態(tài)*/</p><p> ready=rea
29、dy->next; /*就緒對列頭指針后移到下一進(jìn)程*/</p><p><b> }</b></p><p> /*標(biāo)題輸出函數(shù)*/</p><p> void prt1(char a)</p><p><b> {</b></p><p> if(tou
30、pper(a)=='P') /*優(yōu)先數(shù)法*/</p><p> printf(" name cputime needtime priority state\n");</p><p> else if(toupper(a)=='R')</p><p> printf(" name
31、 cputime needtime count round state\n");</p><p><b> }</b></p><p> /*進(jìn)程PCB輸出*/</p><p> void prt2(char a,PCB *q)</p><p><b> {</b&
32、gt;</p><p> if(toupper(a)=='P') /*優(yōu)先數(shù)法的輸出*/</p><p> printf("%-10s%-10d%-10d%-10d%c\n",q->name,q->cputime,q->needtime,q->prio,q->state);</p><p>
33、else if(toupper(a)=='R')/*輪轉(zhuǎn)法的輸出*/</p><p> printf("%-10s%-10d%-10d%-10d%-10d%-c\n",q->name,q->cputime,q->needtime,q->count,q->round,q->state);</p><p><b&g
34、t; }</b></p><p><b> /*輸出函數(shù)*/</b></p><p> void prt(char algo)</p><p><b> {</b></p><p><b> PCB *p;</b></p><p>
35、 prt1(algo); /*輸出標(biāo)題*/</p><p> if(run!=NULL) /*如果運(yùn)行指針不空*/</p><p> prt2(algo,run); /*輸出當(dāng)前正在運(yùn)行的PCB*/</p><p> p=ready; /*輸出就緒隊(duì)列PCB*/</p><p> while(p!=NULL)</p>
36、<p><b> {</b></p><p> prt2(algo,p);</p><p> p=p->next;</p><p><b> }</b></p><p> p=finish; /*輸出完成隊(duì)列的PCB*/</p><p> w
37、hile(p!=NULL)</p><p><b> {</b></p><p> prt2(algo,p);</p><p> p=p->next;</p><p><b> }</b></p><p> getchar(); /*壓任意鍵繼續(xù)*/<
38、/p><p><b> }</b></p><p> /*優(yōu)先數(shù)的插入算法*/</p><p> void insert1(PCB *q)</p><p><b> {</b></p><p> PCB *p1,*s,*r;</p><p>&l
39、t;b> int b;</b></p><p> s=q; /*待插入的PCB指針*/</p><p> p1=ready; /*就緒隊(duì)列頭指針*/</p><p> r=p1; /*r做p1的前驅(qū)指針*/</p><p><b> b=1;</b></p><p>
40、 while((p1!=NULL)&&b) /*根據(jù)優(yōu)先數(shù)確定插入位置*/</p><p> if(p1->prio>=s->prio)</p><p><b> {</b></p><p><b> r=p1;</b></p><p> p1=p1-&
41、gt;next;</p><p><b> }</b></p><p><b> else</b></p><p><b> b=0;</b></p><p> if(r!=p1) /*如果條件成立說明插入在r與p1之間*/</p><p>&
42、lt;b> {</b></p><p> r->next=s;</p><p> s->next=p1;</p><p><b> }</b></p><p><b> else</b></p><p><b> {<
43、/b></p><p> s->next=p1; /*否則插入在就緒隊(duì)列的頭*/</p><p><b> ready=s;</b></p><p><b> }</b></p><p><b> }</b></p><p> /
44、*輪轉(zhuǎn)法插入函數(shù)*/</p><p> void insert2(PCB *p2)</p><p><b> {</b></p><p> tail->next=p2; /*將新的PCB插入在當(dāng)前就緒隊(duì)列的尾*/</p><p><b> tail=p2;</b></p>
45、<p> p2->next=NULL;</p><p><b> }</b></p><p> void insert3()/*先來先服務(wù)*/</p><p><b> {</b></p><p> if (ready==NULL)</p><p&g
46、t; { ready=pfcfs;</p><p> ready->next=NULL;</p><p> pfcfs1=pfcfs;</p><p><b> }</b></p><p><b> else</b></p><p> {pfcfs1->
47、;next=pfcfs;</p><p> pfcfs1=pfcfs1->next;</p><p><b> }</b></p><p><b> }</b></p><p> /*優(yōu)先數(shù)創(chuàng)建初始PCB信息*/</p><p> void create1(c
48、har alg)</p><p><b> {</b></p><p><b> PCB *p;</b></p><p> int i,time;</p><p> char na[10];</p><p> ready=NULL; /*就緒隊(duì)列頭指針*/</
49、p><p> finish=NULL; /*完成隊(duì)列頭指針*/</p><p> run=NULL; /*運(yùn)行隊(duì)列指針*/</p><p> for(i=1;i<=N;i++)</p><p><b> {</b></p><p> p=(struct node*)malloc(si
50、zeof(PCB));</p><p> printf("請輸入進(jìn)程名稱%d\n",i);</p><p> scanf("%s",na);</p><p> printf("請輸入進(jìn)程運(yùn)行時間\n");</p><p> scanf("%d",&
51、time);</p><p> strcpy(p->name,na);</p><p> p->cputime=0;</p><p> p->needtime=time;</p><p> p->state='w';</p><p> p->prio=50-tim
52、e;</p><p> if(ready!=NULL) /*就緒隊(duì)列不空調(diào)用插入函數(shù)插入*/</p><p> insert1(p);</p><p><b> else</b></p><p><b> {</b></p><p> p->next=read
53、y; /*創(chuàng)建就緒隊(duì)列的第一個PCB*/</p><p><b> ready=p;</b></p><p><b> }</b></p><p><b> }</b></p><p> printf(" 最高優(yōu)先級進(jìn)程調(diào)度模擬:\n&quo
54、t;);</p><p> printf("************************************************\n");</p><p> prt(alg); /*輸出進(jìn)程PCB信息*/</p><p> printf("***************************************
55、*********\n");</p><p> run=ready; /*將就緒隊(duì)列的第一個進(jìn)程投入運(yùn)行*/</p><p> ready=ready->next;</p><p> run->state='R';}</p><p> /*輪轉(zhuǎn)法創(chuàng)建進(jìn)程PCB*/</p><p
56、> void create2(char alg)</p><p><b> {</b></p><p><b> PCB *p;</b></p><p> int i,time;</p><p> char na[10];</p><p> ready=NU
57、LL;</p><p> finish=NULL;</p><p><b> run=NULL;</b></p><p> for(i=1;i<=N;i++)</p><p><b> {</b></p><p> p=(struct node *)mallo
58、c(sizeof(PCB));</p><p> printf("請輸入進(jìn)程名稱%d\n",i);</p><p> scanf("%s",na);</p><p> printf("請輸入進(jìn)程運(yùn)行時間\n");</p><p> scanf("%d",&
59、amp;time);</p><p> strcpy(p->name,na);</p><p> p->cputime=0;</p><p> p->needtime=time;</p><p> p->count=0; /*計(jì)數(shù)器*/</p><p> p->state=
60、9;w';</p><p> p->round=2; /*時間片*/</p><p> if(ready!=NULL)</p><p> insert2(p);</p><p><b> else</b></p><p><b> {</b><
61、/p><p> p->next=ready;</p><p><b> ready=p;</b></p><p><b> tail=p;</b></p><p><b> }</b></p><p><b> }</b>
62、;</p><p> printf(" 時間輪轉(zhuǎn)法進(jìn)程調(diào)度模擬\n");</p><p> printf("************************************************\n");</p><p> prt(alg); /*輸出進(jìn)程PCB信息*/</p
63、><p> printf("************************************************\n");</p><p> run=ready; /*將就緒隊(duì)列的第一個進(jìn)程投入運(yùn)行*/</p><p> ready=ready->next;</p><p> run->sta
64、te='R';</p><p><b> }</b></p><p> /*優(yōu)先數(shù)調(diào)度算法*/</p><p> void priority(char alg)</p><p><b> {</b></p><p> while(run!=NULL)
65、 /*當(dāng)運(yùn)行隊(duì)列不空時,有進(jìn)程正在運(yùn)行*/</p><p><b> {</b></p><p> run->cputime=run->cputime+1;</p><p> run->needtime=run->needtime-1;</p><p> run->prio=run
66、->prio-3; /*每運(yùn)行一次優(yōu)先數(shù)降低3個單位*/</p><p> if(run->needtime==0) /*如所需時間為0將其插入完成隊(duì)列*/</p><p><b> {</b></p><p> run->next=finish;</p><p> finish=run;&l
67、t;/p><p> run->state='F'; /*置狀態(tài)為完成態(tài)*/</p><p> run=NULL; /*運(yùn)行隊(duì)列頭指針為空*/</p><p> if(ready!=NULL) /*如就緒隊(duì)列不空*/</p><p> firstin(); /*將就緒對列的第一個進(jìn)程投入運(yùn)行*/</p>
68、<p><b> }</b></p><p> else /*沒有運(yùn)行完同時優(yōu)先數(shù)不是最大,則將其變?yōu)榫途w態(tài)插入到就緒列*/</p><p> if((ready!=NULL)&&(run->prio<ready->prio))</p><p><b> {</b>&
69、lt;/p><p> run->state='W';</p><p> insert1(run);</p><p> firstin(); /*將就緒隊(duì)列的第一個進(jìn)程投入運(yùn)行*/</p><p><b> }</b></p><p> prt(alg); /*輸出進(jìn)程P
70、CB信息*/</p><p><b> }</b></p><p><b> }</b></p><p> /*時間片輪轉(zhuǎn)法*/</p><p> void roundrun(char alg)</p><p><b> {</b></p
71、><p> while(run!=NULL)</p><p><b> {</b></p><p> run->cputime=run->cputime+1;</p><p> run->needtime=run->needtime-1;</p><p> run-&
72、gt;count=run->count+1;</p><p> if(run->needtime==0)/*運(yùn)行完將其變?yōu)橥瓿蓱B(tài),插入完成隊(duì)列*/</p><p><b> {</b></p><p> run->next=finish;</p><p> finish=run;</p&g
73、t;<p> run->state='F';</p><p><b> run=NULL;</b></p><p> if(ready!=NULL)</p><p> firstin(); /*就緒對列不空,將第一個進(jìn)程投入運(yùn)行*/</p><p><b> }&l
74、t;/b></p><p><b> else</b></p><p> if(run->count==run->round) /*如果時間片到*/</p><p><b> {</b></p><p> run->count=0; /*計(jì)數(shù)器置0*/</p
75、><p> if(ready!=NULL) /*如就緒隊(duì)列不空*/</p><p><b> {</b></p><p> run->state='W'; /*將進(jìn)程插入到就緒隊(duì)列中等待輪轉(zhuǎn)*/</p><p> insert2(run);</p><p> first
76、in(); /*將就緒對列的第一個進(jìn)程投入運(yùn)行*/</p><p><b> }</b></p><p><b> }</b></p><p> prt(alg); /*輸出進(jìn)程信息*/</p><p><b> }</b></p><p>&l
77、t;b> }</b></p><p> int check_char(char algo)/*判斷輸入的字符是否有效*/</p><p> {if (algo=='F'||algo=='f'||algo=='R'||algo=='r'||algo=='P'||algo=='p
78、39;)</p><p><b> return 1;</b></p><p><b> else</b></p><p><b> return 0;</b></p><p><b> }</b></p><p><
79、b> /*主函數(shù)*/</b></p><p> void main()</p><p><b> {</b></p><p> char algo; /*算法標(biāo)記*/</p><p> int len,h=0;</p><p> char ch/*接收換行字符*/;
80、</p><p> printf("\n***********請選擇要模擬的算法***************\n\n");</p><p> printf("1.最高優(yōu)先數(shù)進(jìn)程調(diào)度算法模擬(P/p)\n");</p><p> printf("2.時間輪轉(zhuǎn)法進(jìn)程調(diào)度算法模擬(R/r)\n");<
81、;/p><p> printf("請輸入相應(yīng)字符選擇\n\n");</p><p> scanf("%c",&algo); /*輸入字符確定算法*/</p><p> if(check_char(algo))/*判斷輸入的字符是否合法*/</p><p><b> {</b&
82、gt;</p><p> printf("請輸入進(jìn)程調(diào)度個數(shù)\n");</p><p> scanf("%d",&N); /*輸入進(jìn)程數(shù)*/</p><p> if(algo=='P'||algo=='p')</p><p><b> {<
83、/b></p><p> create1(algo); /*優(yōu)先數(shù)法*/</p><p> priority(algo);</p><p> printf("\n\n 進(jìn)程已經(jīng)完成.\n");</p><p><b> }</b></p><p><b>
84、; else</b></p><p> if(algo=='R'||algo=='r')</p><p><b> {</b></p><p> create2(algo); /*輪轉(zhuǎn)法*/</p><p> roundrun(algo);</p>&l
85、t;p> printf("\n\n 進(jìn)程已經(jīng)完成.\n");</p><p><b> }</b></p><p><b> }</b></p><p> else if(!check_char(algo)) printf("你輸入的字符有誤,請重新運(yùn)行程序!!");&
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- linux操作系統(tǒng)課程設(shè)計(jì)
- linux課程設(shè)計(jì)報告--linux操作系統(tǒng)應(yīng)用
- 操作系統(tǒng)課程設(shè)計(jì)-磁盤調(diào)度模擬法
- 操作系統(tǒng)課程設(shè)計(jì)-時間片輪轉(zhuǎn)算法java實(shí)現(xiàn)
- linux操作系統(tǒng)基礎(chǔ)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)——操作系統(tǒng)課程設(shè)計(jì)模擬操作系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)-- 操作系統(tǒng)
- 課程設(shè)計(jì)---操作系統(tǒng)課程設(shè)計(jì)之linux磁盤空間管理
- 短作業(yè)優(yōu)先的作業(yè)調(diào)度-操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)報告-基于時間片的輪轉(zhuǎn)調(diào)度算法
- 動態(tài)優(yōu)先權(quán)算法模擬-操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)--動態(tài)優(yōu)先權(quán)算法模擬
- linux課程設(shè)計(jì)---linux操作系統(tǒng)u盤驅(qū)動設(shè)計(jì)分析報告
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
- linux操作系統(tǒng)應(yīng)用課程整體設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
評論
0/150
提交評論