版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 數(shù)學(xué)與計(jì)算機(jī)學(xué)院</b></p><p><b> 課程設(shè)計(jì)說(shuō)明書</b></p><p> 課 程 名 稱: 操作系統(tǒng)原理-課程設(shè)計(jì) </p><p> 課 程 代 碼: </p><p> 題 目:
2、進(jìn)程調(diào)度模擬程序 </p><p> 年級(jí)/專業(yè)/班: 09級(jí) 計(jì)科 5班 </p><p> 學(xué) 生 姓 名: </p><p> 學(xué) 號(hào): </p><p> 開 始 時(shí) 間: 2011 年 12 月 9 日<
3、;/p><p> 完 成 時(shí) 間: 2011 年 12 月 23 日</p><p><b> 課程設(shè)計(jì)成績(jī):</b></p><p> 指導(dǎo)教師簽名: 年 月 日</p><p><b> 摘 要</b></p><p&
4、gt; 隨著計(jì)算機(jī)的普及,在計(jì)算機(jī)上配置合適的操作系統(tǒng),已成為不可或缺的因素,操作系統(tǒng)時(shí)配置在計(jì)算機(jī)硬件上的第一層軟件,時(shí)對(duì)硬件系統(tǒng)的首次擴(kuò)充,其他的諸如匯編程序,編譯程序,數(shù)據(jù)庫(kù)管理系統(tǒng)等系統(tǒng)軟件,以及大量的應(yīng)用軟件,都將依賴于操作系統(tǒng)的支持,取得它的服務(wù)。OS作為用戶與計(jì)算機(jī)硬件之間的接口,作為系統(tǒng)資源的管理者,實(shí)現(xiàn)了對(duì)計(jì)算機(jī)資源的抽象,因此,不斷提高計(jì)算機(jī)資源的利用率,方便用戶,以及器件的不斷更新?lián)Q代,計(jì)算機(jī)體系結(jié)構(gòu)的不斷發(fā)展,
5、已經(jīng)成為推動(dòng)計(jì)算機(jī)操作系統(tǒng)發(fā)展的主要因素,為了達(dá)到這些目的,了解操作系統(tǒng)的發(fā)展過(guò)程,熟悉操作系統(tǒng)的內(nèi)部結(jié)構(gòu),掌握操作系統(tǒng)的運(yùn)行,已經(jīng)成為當(dāng)代大學(xué)生,特別是計(jì)算機(jī)專業(yè)的學(xué)生所必不可少的知識(shí)。</p><p> 操作系統(tǒng)的主要任務(wù)是為多道程序的運(yùn)行提供良好的運(yùn)行環(huán)境,并能最大程度的提高系統(tǒng)中各種資源的利用率和方便用戶,為了實(shí)現(xiàn)這些功能,操作系統(tǒng)還應(yīng)該具有處理機(jī)管理,存儲(chǔ)器管理,設(shè)備管理和文件管理等功能。</p
6、><p> 關(guān)鍵詞:操作系統(tǒng);資源利用率;處理機(jī);文件管理</p><p><b> 目 錄 </b></p><p><b> 1 引 言1</b></p><p> 1.1 問(wèn)題的提出1</p><p> 1.2任務(wù)與分析1</p><
7、;p> 2 程序的主要函數(shù)2</p><p> 2.1建立將要模擬進(jìn)程調(diào)度的所有進(jìn)程PCB鏈表2</p><p> 2.2模擬CPU運(yùn)行進(jìn)程3</p><p><b> 2.3顯示4</b></p><p><b> 2.4排序5</b></p><p&
8、gt; 2.5建立先來(lái)先服務(wù)調(diào)度算法的就緒隊(duì)列7</p><p> 2.6建立最高優(yōu)先數(shù)優(yōu)先調(diào)度算法的就緒隊(duì)列8</p><p> 2.7進(jìn)程模擬調(diào)度9</p><p><b> 2.8主函數(shù)12</b></p><p> 3 程序運(yùn)行平臺(tái)14</p><p><b>
9、; 4 總體設(shè)計(jì)14</b></p><p> 5 程序結(jié)構(gòu)體的說(shuō)明14</p><p> 6 程序運(yùn)行結(jié)果15</p><p><b> 7 結(jié)論22</b></p><p><b> 8 參考文獻(xiàn)23</b></p><p><b&g
10、t; 9 附錄24</b></p><p><b> 1 引 言 </b></p><p><b> 1.1 問(wèn)題的提出</b></p><p> 隨著現(xiàn)在操作系統(tǒng)的日趨成熟,用戶對(duì)計(jì)算機(jī)的需求越來(lái)越多,處理機(jī)在同一時(shí)刻處理資源的能力是有限的,從而導(dǎo)致各種任務(wù)隨時(shí)隨地的爭(zhēng)奪使用處理機(jī),因而此對(duì)程序的
11、并發(fā)能力提出了更高的要求。</p><p> 引進(jìn)并發(fā)技術(shù)后,為了更好地說(shuō)明并發(fā)現(xiàn)象(尤其是動(dòng)態(tài)進(jìn)程),引入了進(jìn)程的概念。進(jìn)程是一個(gè)具有一定獨(dú)立功能的可并發(fā)執(zhí)行的關(guān)于某個(gè)數(shù)據(jù)集合一次運(yùn)行活動(dòng)的程序。一個(gè)程序的啟動(dòng)執(zhí)行,便是一個(gè)進(jìn)程的建立;一個(gè)程序執(zhí)行結(jié)束(正?;蛘呤遣徽#?,便是一個(gè)進(jìn)程的撤銷。由于同時(shí)處于就緒態(tài)(爭(zhēng)奪使用CPU資源)的進(jìn)程通常比較多,因此需要CPU調(diào)度算法來(lái)決定由哪個(gè)進(jìn)程獲得CPU使用權(quán)進(jìn)入運(yùn)
12、行狀態(tài),即進(jìn)程調(diào)度算法。</p><p><b> 1.2任務(wù)與分析</b></p><p> 本課題主要的目的是編寫并調(diào)試一個(gè)有N個(gè)進(jìn)程并發(fā)的進(jìn)程模擬調(diào)度程序。</p><p> 進(jìn)程調(diào)度算法:采用最高優(yōu)先數(shù)優(yōu)先的調(diào)度算法(即把處理機(jī)分配給優(yōu)先數(shù)最高的進(jìn)程)和先來(lái)先服務(wù)算法。</p><p> 每個(gè)進(jìn)程有一個(gè)進(jìn)
13、程控制塊( PCB)表示。進(jìn)程控制塊可以包含如下信息:進(jìn)程名、優(yōu)先數(shù)、到達(dá)時(shí)間、需要運(yùn)行時(shí)間、已用CPU時(shí)間、進(jìn)程狀態(tài)等等。 </p><p> 進(jìn)程的優(yōu)先數(shù)及需要的運(yùn)行時(shí)間可以事先人為地指定(也可以由隨機(jī)數(shù)產(chǎn)生)。進(jìn)程的到達(dá)時(shí)間為進(jìn)程輸入的時(shí)間。 </p><p> 進(jìn)程的運(yùn)行時(shí)間以時(shí)間片為單位進(jìn)行計(jì)算。</p><p> 等待I/O的時(shí)間以時(shí)間片為單位進(jìn)行
14、計(jì)算,可隨機(jī)產(chǎn)生,也可事先指定。</p><p> 每個(gè)進(jìn)程的狀態(tài)可以是就緒 R(Ready)、運(yùn)行R(Run)、等待(Wait)或完成F(Finish)四種狀態(tài)之一。 </p><p> 就緒進(jìn)程獲得 CPU后都只能運(yùn)行一個(gè)時(shí)間片。用已占用CPU時(shí)間加1來(lái)表示。 </p><p> 如果運(yùn)行一個(gè)時(shí)間片后,進(jìn)程的已占用 CPU時(shí)間已達(dá)到所需要的運(yùn)行時(shí)間,則撤消
15、該進(jìn)程,如果運(yùn)行一個(gè)時(shí)間片后進(jìn)程的已占用CPU時(shí)間還未達(dá)所需要的運(yùn)行時(shí)間,也就是進(jìn)程還需要繼續(xù)運(yùn)行,此時(shí)應(yīng)將進(jìn)程的優(yōu)先數(shù)減1(即降低一級(jí)),然后把它插入就緒隊(duì)列等待CPU。 </p><p> 每進(jìn)行一次調(diào)度程序都打印一次運(yùn)行進(jìn)程、就緒隊(duì)列、等待進(jìn)程以及各個(gè)進(jìn)程的 PCB,以便進(jìn)行檢查。</p><p> 重復(fù)以上過(guò)程,直到所要進(jìn)程都完成為止。</p><p>
16、<b> 2 程序的主要函數(shù)</b></p><p> 2.1建立將要模擬進(jìn)程調(diào)度的所有進(jìn)程PCB鏈表</p><p> 算法思想:要建立的進(jìn)程個(gè)數(shù)n作為函數(shù)參數(shù),頭指針作為返回,在函數(shù)內(nèi)部由一重循環(huán)建立每個(gè)進(jìn)程PCB的各個(gè)數(shù)據(jù)項(xiàng),其中進(jìn)程需要運(yùn)行時(shí)間、到達(dá)時(shí)間以及優(yōu)先數(shù)全部采用隨機(jī)生成。</p><p><b> 代碼:&l
17、t;/b></p><p> plist *creatpro(int n) //建立所有將要進(jìn)行N個(gè)模擬調(diào)度的進(jìn)程</p><p><b> {</b></p><p><b> int j;</b></p><p> plist *p, *q, *head;</p>&
18、lt;p> p= (plist *) malloc(sizeof(plist));</p><p><b> head = p;</b></p><p> for(j=0;j<n;j++){</p><p><b> q=p;</b></p><p> p->name =
19、 j+1;</p><p> p->needtime = 1+(int)(10.0*rand()/(RAND_MAX+1.0));</p><p> p->arrivetime = (int)(10.0*rand()/(RAND_MAX+1.0));</p><p> p->pri = 1+(int)(9.0*rand()/(RAND_MAX
20、+1.0));</p><p> p->state = 0;</p><p> p->cputime =0;</p><p> p->next = (plist *) malloc(sizeof(plist));</p><p> p=p->next;</p><p><b>
21、 }</b></p><p> q->next = NULL;</p><p> return head;</p><p><b> }</b></p><p><b> 流程圖:</b></p><p> 2.2模擬CPU運(yùn)行進(jìn)程</p&
22、gt;<p> 算法思想:需要運(yùn)行進(jìn)程的PCB作為函數(shù)參數(shù),先修改進(jìn)程狀態(tài),然后修改再修改進(jìn)程已運(yùn)行時(shí)間和還需運(yùn)行時(shí)間。</p><p><b> 代碼:</b></p><p> void action(plist * nowpro)</p><p> //模擬CUP運(yùn)行進(jìn)程的過(guò)程</p><p>
23、;<b> {</b></p><p> nowpro->state = 2; //設(shè)置進(jìn)程狀態(tài)為運(yùn)行態(tài)</p><p> printf("now is process %d ",nowpro->name);</p><p> nowpro->needtime--; //修改進(jìn)程還需
24、運(yùn)行時(shí)間</p><p> nowpro->cputime++; //修改進(jìn)程已運(yùn)行時(shí)間</p><p> nowpro->state = 1;</p><p> if(nowpro->needtime==0)//進(jìn)程運(yùn)行結(jié)束</p><p><b> {</b></p>&
25、lt;p> printf("\tthe process %d is end\n",nowpro->name); </p><p> nowpro->state = 4; //進(jìn)程運(yùn)行結(jié)束,設(shè)置進(jìn)程狀態(tài)為結(jié)束態(tài)</p><p><b> }</b></p><p><b> else<
26、/b></p><p><b> {</b></p><p> printf("\tprocess %d needtime is %d\n",nowpro->name,nowpro->needtime);</p><p><b> }</b></p><p&
27、gt; printf("-----------------------------\n");</p><p><b> }</b></p><p><b> 流程圖:</b></p><p><b> 2.3 顯示</b></p><p> 算法思
28、想:先判斷鏈表借點(diǎn)是否為空,然后利用循環(huán)輸出各PCB信息</p><p><b> 代碼:</b></p><p> void show(plist * process) </p><p><b> //顯示</b></p><p><b> {</b></p&g
29、t;<p> if(!process)</p><p><b> {</b></p><p> printf("there is no process now\n");</p><p><b> }</b></p><p> while(process&a
30、mp;&process->state!=4)</p><p><b> {</b></p><p> printf("name of process %d",process->name);</p><p> printf("\tneedtime %d",process->n
31、eedtime);</p><p> printf(" arrivetime %d",process->arrivetime);</p><p> printf(" pri %d",process->pri);</p><p> printf(" state %d",proce
32、ss->state);</p><p> printf(" cputime %d\n",process->cputime);</p><p> process = process->next;</p><p><b> }</b></p><p><b> }&
33、lt;/b></p><p><b> 流程圖:</b></p><p><b> 2.4排序</b></p><p> 算法思想:利用兩層循環(huán),比較相鄰兩個(gè)元素的大小,第一遍將最大的數(shù)排到最末,第二遍將次大的數(shù)排到最末的數(shù)的前面,經(jīng)N-1遍后將滿足排序的要求。</p><p><
34、b> 代碼:</b></p><p> plist *sort(plist *head) </p><p> //將進(jìn)程隊(duì)列按到達(dá)先后順序排序</p><p><b> {</b></p><p> plist *p,*p1,*p2,*p3,*temp;</p><p&g
35、t;<b> p=head;</b></p><p> while(p->next!=NULL) {</p><p> p=p->next;</p><p><b> }</b></p><p> while(p!=head){</p><p> p3
36、=p1=head;</p><p> p2=p1->next;</p><p> while(p1!=p && p1->next!=NULL){</p><p> if((p1->arrivetime)>(p2->arrivetime)){</p><p> if(p1==head){&l
37、t;/p><p><b> head=p2;</b></p><p><b> }</b></p><p><b> else{</b></p><p> p3->next=p2;</p><p><b> }</b>&
38、lt;/p><p> temp=p2->next;</p><p> p2->next=p1;</p><p> p1->next=temp;</p><p><b> temp=p1;</b></p><p><b> p1=p2;</b></
39、p><p><b> p2=temp;</b></p><p><b> }</b></p><p><b> p3=p1;</b></p><p> p1=p1->next;</p><p> p2=p1->next;</p&g
40、t;<p><b> }</b></p><p><b> p=p3;</b></p><p><b> }</b></p><p> return head;</p><p><b> }</b></p><p
41、> 2.5建立先來(lái)先服務(wù)調(diào)度算法的就緒隊(duì)列</p><p> 算法思想:先來(lái)先服務(wù)調(diào)度算法中的就緒隊(duì)列是按到達(dá)時(shí)間的先后排序的,當(dāng)就緒隊(duì)列為空時(shí),直接將作為將要添加的進(jìn)程PCB temp作為隊(duì)頭,如果就緒隊(duì)列不為空,則將temp添加到隊(duì)列末尾。</p><p> 添加到就緒隊(duì)列后再修改進(jìn)程狀態(tài)為就緒態(tài)。</p><p><b> 代碼:<
42、;/b></p><p> plist *fcfs_creatready(plist *ready_queue,plist *temp) </p><p> //將進(jìn)程temp添加到就緒隊(duì)列ready_queue的尾部</p><p><b> {</b></p><p><b> plist *
43、q;</b></p><p> q=ready_queue;</p><p> if(ready_queue) { //當(dāng)就緒隊(duì)列不為空時(shí),新進(jìn)入的進(jìn)程添加到就緒隊(duì)列末尾</p><p> while(q->next){</p><p> q=q->next;</p><p> }
44、 //使指針P指向就緒隊(duì)列中最后一個(gè)進(jìn)程</p><p> q->next=temp;</p><p> temp->state=1;//修改進(jìn)程狀態(tài)</p><p> temp->next=NULL;</p><p><b> }</b></p><p> else
45、{ //當(dāng)就緒隊(duì)列為空時(shí),新進(jìn)入的進(jìn)程作為就緒隊(duì)列頭部</p><p> ready_queue=temp;</p><p> ready_queue->state = 1; //將進(jìn)程狀態(tài)設(shè)為就緒狀態(tài)</p><p> temp->next=NULL;</p><p><b> }</b><
46、;/p><p> return ready_queue;</p><p><b> }</b></p><p><b> 流程圖:</b></p><p> 2.6建立最高優(yōu)先數(shù)優(yōu)先調(diào)度算法的就緒隊(duì)列</p><p> 算法思想:最高優(yōu)先數(shù)優(yōu)先調(diào)度算法中的就緒隊(duì)列是按進(jìn)
47、程優(yōu)先數(shù)遞減排序的,當(dāng)就緒隊(duì)列為空時(shí),直接將作為將要添加的進(jìn)程PCB temp作為隊(duì)頭,如果就緒隊(duì)列不為空,則將temp添加到隊(duì)列合適位置。然后再修改進(jìn)程狀態(tài)為就緒態(tài)。</p><p><b> 代碼:</b></p><p> plist *hrrn_creatready(plist *ready_queue, plist *temp)</p>&
48、lt;p> //按優(yōu)先數(shù)遞減的順序?qū)⑦M(jìn)程temp添加到就緒隊(duì)列ready_queue的合適位置</p><p><b> {</b></p><p> plist *q, *p;</p><p> p=q=ready_queue;</p><p> if(ready_queue && re
49、ady_queue->pri>temp->pri) { </p><p> //按優(yōu)先數(shù)遞減的順序?qū)⑦M(jìn)程temp添加到就緒隊(duì)列ready_queue的合適位置</p><p> while(q&&q->pri>=temp->pri){</p><p><b> p=q;</b></
50、p><p> q=q->next;</p><p> } //使指針P->next指向就緒隊(duì)列中進(jìn)程temp的插入位置</p><p> p->next=temp;</p><p> temp->next=q;</p><p> temp->state=1;//修改進(jìn)程狀態(tài)&l
51、t;/p><p><b> }</b></p><p> else{ //當(dāng)就緒隊(duì)列為空時(shí),新進(jìn)入的進(jìn)程作為就緒隊(duì)列頭部</p><p> temp->next=ready_queue;</p><p> ready_queue=temp;</p><p> ready_q
52、ueue->state = 1; //將進(jìn)程狀態(tài)設(shè)為就緒狀態(tài)</p><p><b> }</b></p><p> return ready_queue;</p><p><b> }</b></p><p><b> 流程圖:</b></p>&
53、lt;p><b> 2.7進(jìn)程模擬調(diào)度</b></p><p><b> 算法思想:</b></p><p> 1.先來(lái)先服務(wù)調(diào)度算法</p><p> 先來(lái)先服務(wù)調(diào)度算法是一種最簡(jiǎn)單的調(diào)度算法,該算法既可以用于作業(yè)調(diào)度,也可用于進(jìn)程調(diào)度。當(dāng)在作業(yè)調(diào)度中采用該算法時(shí),每次調(diào)度都是從后備作業(yè)隊(duì)列中選擇一個(gè)或多個(gè)
54、最先進(jìn)入該隊(duì)列的作業(yè),將他們調(diào)入內(nèi)存,為它們分配資源、創(chuàng)建進(jìn)程,然后放入就緒隊(duì)列。在進(jìn)程調(diào)度中采用FCFS算法時(shí),則每次調(diào)度是從就緒隊(duì)列中選擇一個(gè)最先進(jìn)入該隊(duì)列的進(jìn)程,為之分配處理機(jī),使之投入運(yùn)行。該進(jìn)程一直運(yùn)行到完成或發(fā)生某事件而阻塞后才放棄處理機(jī)。FCFS算法比較有利于長(zhǎng)作業(yè)(進(jìn)程),而不利于短作業(yè)(進(jìn)程)。</p><p> 2.最高優(yōu)先數(shù)調(diào)度算法</p><p> 優(yōu)先數(shù)調(diào)度算
55、法常用于批處理系統(tǒng)中。在進(jìn)程調(diào)度中,每次調(diào)度時(shí),系統(tǒng)把處理機(jī)分配給就緒隊(duì)列中優(yōu)先數(shù)最高的進(jìn)程。它又分為兩種:非搶占式優(yōu)先數(shù)算法和搶占式優(yōu)先數(shù)算法。在非搶占式優(yōu)先數(shù)算法下,系統(tǒng)一旦把處理機(jī)分配給就緒隊(duì)列中優(yōu)先數(shù)最高的進(jìn)程后,這個(gè)進(jìn)程就會(huì)一直運(yùn)行,直到完成或發(fā)生某事件使它放棄處理機(jī),這時(shí)系統(tǒng)才能重新將處理機(jī)分配給就緒隊(duì)列中的另一個(gè)優(yōu)先數(shù)最高的進(jìn)程。在搶占式優(yōu)先數(shù)算法下,系統(tǒng)先將處理機(jī)分配給就緒隊(duì)列中優(yōu)先數(shù)最高的進(jìn)程度讓它運(yùn)行,但在運(yùn)行的過(guò)程
56、中,如果出現(xiàn)另一個(gè)優(yōu)先數(shù)比它高的進(jìn)程,它就要立即停止,并將處理機(jī)分配給新的高優(yōu)先數(shù)進(jìn)程。</p><p> 本次模擬采用搶占式最高優(yōu)先數(shù)調(diào)度算法。</p><p> 如果調(diào)用此函數(shù)時(shí)是process_simulation(process,fcfs_creatready);則此時(shí)是先來(lái)先服務(wù)算法模擬調(diào)度。</p><p> 如果調(diào)用此函數(shù)時(shí)是 process_s
57、imulation(process,hrrn_creatready);則此時(shí)是最高優(yōu)先數(shù)優(yōu)先算法模擬調(diào)度。</p><p><b> 代碼:</b></p><p> void process_simulation(plist * process,plist *creatready(plist *,plist *))</p><p><
58、;b> {</b></p><p> int time; //模擬CPU時(shí)鐘</p><p> plist *temp;</p><p> plist *ready_queue=NULL; //定義就緒隊(duì)列,并初始化</p><p> time = 0; //初始化CPU時(shí)序</p><
59、p> while(process||ready_queue) //當(dāng)進(jìn)程隊(duì)列不為空,或者就緒隊(duì)列不為空</p><p><b> {</b></p><p> while(process && time == process->arrivetime) {//進(jìn)程到達(dá)時(shí)進(jìn)入就緒隊(duì)列</p><p> temp
60、= process;</p><p> process = process->next;</p><p> ready_queue=creatready(ready_queue, temp);</p><p><b> }</b></p><p> if(ready_queue == NULL) {//如
61、果沒(méi)有進(jìn)程運(yùn)行,打印CPU空轉(zhuǎn)信息</p><p> printf("The time sequence is :%d\n",time);</p><p> printf("The ready queue is :\n");</p><p> printf("there is no process now\n&
62、quot;);</p><p> printf("-----------------------------\n");</p><p><b> time++;</b></p><p> Sleep(500);</p><p><b> }</b></p>
63、<p> else{//如果有進(jìn)程需要運(yùn)行,則模擬進(jìn)程運(yùn)行過(guò)程</p><p> printf("The time sequence is :%d\n",time);</p><p> printf("The ready queue is :\n");</p><p> show(ready_queue-&
64、gt;next);//打印就緒隊(duì)列</p><p> action(ready_queue); //模擬進(jìn)程運(yùn)行</p><p> if(ready_queue ->needtime == 0) {//進(jìn)程運(yùn)行結(jié)束,此時(shí)將此進(jìn)程從就緒隊(duì)列中刪除</p><p> ready_queue=ready_queue->next;</p>&
65、lt;p><b> }</b></p><p><b> time++;</b></p><p> Sleep(1000);</p><p><b> }</b></p><p><b> }</b></p><p>
66、; printf("The time sequence is :%d\n",time); //先來(lái)先服務(wù)模擬調(diào)度結(jié)束</p><p> printf("there is no process now\n");</p><p> printf("-----------------------------\n");</p&
67、gt;<p><b> }</b></p><p><b> 流程圖:</b></p><p><b> 2.8主函數(shù)</b></p><p> 算法思想:先建立所有需要模擬調(diào)度的PCB鏈表,然后采用冒泡法將鏈表按進(jìn)程到達(dá)時(shí)間遞增的順序排序,然后采用switch--case 選擇
68、結(jié)構(gòu)進(jìn)行菜單選擇需要模擬的調(diào)度模擬。</p><p><b> 代碼:</b></p><p> void main()</p><p><b> {</b></p><p> int n; /*the number of process*/</p><p><
69、;b> int k;</b></p><p> plist *process;</p><p> printf("please input the number of process: ");</p><p> scanf("%d",&n);</p><p> pro
70、cess = creatpro(n);</p><p> process = sort(process);/****** 利用冒泡法將進(jìn)程按到達(dá)時(shí)間排序 ******/</p><p> show(process);</p><p> printf("please choose the what you want to use:\n");
71、</p><p> printf("\t1 先來(lái)先服務(wù)\n\t2 最高優(yōu)先數(shù)優(yōu)先\n");</p><p> scanf("%d",&k);</p><p><b> switch(k)</b></p><p><b> {</b></p
72、><p><b> case 1: </b></p><p><b> {</b></p><p> process_simulation(process,fcfs_creatready); /****** 先來(lái)先服務(wù) ******/ </p><p><b> break;&l
73、t;/b></p><p><b> }</b></p><p><b> case 2: </b></p><p><b> {</b></p><p> process_simulation(process,hrrn_creatready); /******
74、 最高優(yōu)先數(shù)算法 ******/</p><p><b> break;</b></p><p><b> }</b></p><p> default : </p><p><b> {</b></p><p> printf("請(qǐng)
75、輸入正確選項(xiàng)?。?!\n");</p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }3 程序運(yùn)行平臺(tái)</b></p><
76、p> Windows xp </p><p> Microsoft Visual C++ 6.0</p><p><b> 4 總體設(shè)計(jì)</b></p><p><b> 系統(tǒng)總體框架圖</b></p><p><b> 5程序結(jié)構(gòu)體的說(shuō)明</b></p&
77、gt;<p> typedef struct pcb</p><p><b> {</b></p><p> int name; //進(jìn)程名</p><p> int needtime; //進(jìn)程所需運(yùn)行時(shí)間</p><p> int arrivetime; //進(jìn)程到達(dá)時(shí)間
78、</p><p> int pri; //進(jìn)程優(yōu)先數(shù)</p><p> int state; //進(jìn)程狀態(tài):0表示未到達(dá) 1表示就緒 2表示運(yùn)行 3表示等待
79、 </p><p><b> 4表示結(jié)束</b></p><p> int cputime; //已用CPU時(shí)間</p><p> struct pcb *next;</p><p><b> }plist;</b></p><p><b>
80、6 程序運(yùn)行結(jié)果</b></p><p> 先來(lái)先服務(wù)模擬調(diào)度運(yùn)行結(jié)果:</p><p> 最高優(yōu)先數(shù)優(yōu)先調(diào)度模擬運(yùn)行結(jié)果:</p><p><b> 7 結(jié)論</b></p><p> 這次課程設(shè)計(jì)的題目是模擬進(jìn)程調(diào)度,課程設(shè)計(jì)的任務(wù)書要求實(shí)現(xiàn)模擬作業(yè)調(diào)度的兩個(gè)算法:先來(lái)先服務(wù)調(diào)度算法,最高優(yōu)先數(shù)優(yōu)
81、先算法。這次的課程設(shè)計(jì)我采用的是C語(yǔ)言來(lái)編寫的,首先編寫一個(gè)結(jié)構(gòu)體用來(lái)存放進(jìn)程的相關(guān)信息,即PCB。然后將要模擬調(diào)度的進(jìn)程PCB放在隊(duì)列中。通過(guò)不斷的調(diào)試與優(yōu)化,程序很好的模擬了進(jìn)程的調(diào)度過(guò)程,先來(lái)先服務(wù),最高優(yōu)先數(shù)優(yōu)先。在編寫實(shí)現(xiàn)最高優(yōu)先數(shù)優(yōu)先算法的時(shí)候,剛開始由于沒(méi)有考慮到后到達(dá)的進(jìn)程的優(yōu)先數(shù),和當(dāng)前運(yùn)行的進(jìn)程的優(yōu)先數(shù)有高低之分,導(dǎo)致調(diào)度得不到預(yù)想的結(jié)果,經(jīng)過(guò)改正之后就得到了正確的結(jié)果。他們的調(diào)度結(jié)果都不一樣,但是對(duì)于進(jìn)程調(diào)度而言,
82、這幾個(gè)算法各有個(gè)的優(yōu)點(diǎn)和缺點(diǎn)。先來(lái)先服務(wù)算法有利于長(zhǎng)進(jìn)程而不利于短進(jìn)程;最高優(yōu)先數(shù)優(yōu)先算法既照顧了長(zhǎng)進(jìn)程,又考慮了進(jìn)程的優(yōu)先級(jí),不會(huì)使長(zhǎng)進(jìn)程長(zhǎng)期得不到服務(wù),該算法實(shí)現(xiàn)了比較好的折中。</p><p> 通過(guò)本次課程設(shè)計(jì)加深了我對(duì)進(jìn)程調(diào)度算法的理解并且還明白了調(diào)度的過(guò)程。在上操作系統(tǒng)課的時(shí)候?qū)@幾個(gè)算法并不是很理解,通過(guò)實(shí)現(xiàn)了這幾個(gè)調(diào)度算法的模擬之后我,我就明白了這幾個(gè)算法的本質(zhì),并且理解了這幾個(gè)算法。在做課程設(shè)
83、計(jì)的時(shí)候自己還是存在不足之處,在考慮算法的時(shí)候考慮的不夠周全,在編寫最高優(yōu)先數(shù)優(yōu)先的時(shí)候剛開始由于沒(méi)有考慮到后到達(dá)的進(jìn)程與之前的進(jìn)程的優(yōu)先數(shù)不一樣造成調(diào)度的結(jié)果與預(yù)想的不一樣,通過(guò)仔細(xì)的檢查與思考之后發(fā)現(xiàn)了這個(gè)問(wèn)題并且改正了之后就可以得到正確的結(jié)果了。這次課程設(shè)計(jì)還讓我明白了只有多實(shí)踐才能發(fā)現(xiàn)自己的問(wèn)題所在才能夠很好的掌握知識(shí)。</p><p><b> 8 參考文獻(xiàn)</b></p&
84、gt;<p> 張堯?qū)W等編著. 計(jì)算機(jī)操作系統(tǒng)教程.北京:清華大學(xué)出版社,2006.02</p><p> 湯子瀛等編著.計(jì)算機(jī)操作系統(tǒng).西安:西安電子科技出版社,1996.12</p><p> 陳向群 編著.操作系統(tǒng)教程.北京:北京大學(xué)出版社,2007.01</p><p> 羅宇 等編著.操作系統(tǒng)課程設(shè)計(jì).北京:機(jī)械工業(yè)出版社,2005.
85、9</p><p><b> 附 錄</b></p><p><b> 程序源代碼:</b></p><p> #include<stdio.h></p><p> #include<stdlib.h></p><p> #include
86、<time.h></p><p> #include<windows.h></p><p> typedef struct pcb</p><p><b> {</b></p><p> int name; //進(jìn)程名</p><p> int needti
87、me; //進(jìn)程所需運(yùn)行時(shí)間</p><p> int arrivetime; //進(jìn)程到達(dá)時(shí)間</p><p> int pri; //進(jìn)程優(yōu)先數(shù)</p><p> int state; //進(jìn)程狀態(tài):0表示未到達(dá) 1表示就緒 2表示運(yùn)行 3表示等待 4表示結(jié)束</p><p> int
88、cputime; //已用CPU時(shí)間</p><p> struct pcb *next;</p><p><b> }plist;</b></p><p> plist *creatpro(int n) </p><p> //建立所有將要進(jìn)行N個(gè)模擬調(diào)度的進(jìn)程</p><p>
89、;<b> {</b></p><p><b> int j;</b></p><p> plist *p, *q, *head;</p><p> p= (plist *) malloc(sizeof(plist));</p><p><b> head = p;</b&
90、gt;</p><p> for(j=0;j<n;j++)</p><p><b> {</b></p><p><b> q=p;</b></p><p> p->name = j+1;</p><p> p->needtime = 1+(int
91、)(10.0*rand()/(RAND_MAX+1.0));</p><p> p->arrivetime = (int)(10.0*rand()/(RAND_MAX+1.0));</p><p> p->pri = 1+(int)(9.0*rand()/(RAND_MAX+1.0));</p><p> p->state = 0;</
92、p><p> p->cputime =0;</p><p> p->next = (plist *) malloc(sizeof(plist));</p><p> p=p->next;</p><p><b> }</b></p><p> q->next = NU
93、LL;</p><p> return head;</p><p><b> }</b></p><p> void action(plist * nowpro)</p><p> //模擬CUP運(yùn)行進(jìn)程的過(guò)程</p><p><b> {</b></p>
94、;<p> nowpro->state = 2; //設(shè)置進(jìn)程狀態(tài)為運(yùn)行態(tài)</p><p> printf("now is process %d ",nowpro->name);</p><p> nowpro->needtime--; //修改進(jìn)程還需運(yùn)行時(shí)間</p><p> nowpr
95、o->cputime++; //修改進(jìn)程已運(yùn)行時(shí)間</p><p> nowpro->state = 1;</p><p> if(nowpro->needtime==0)//進(jìn)程運(yùn)行結(jié)束</p><p><b> {</b></p><p> printf("\tthe pro
96、cess %d is end\n",nowpro->name); </p><p> nowpro->state = 4; //進(jìn)程運(yùn)行結(jié)束,設(shè)置進(jìn)程狀態(tài)為結(jié)束態(tài)</p><p><b> }</b></p><p><b> else</b></p><p><b
97、> {</b></p><p> printf("\tprocess %d needtime is %d\n",nowpro->name,nowpro->needtime);</p><p><b> }</b></p><p> printf("--------------
98、---------------\n");</p><p><b> }</b></p><p> void show(plist * process) </p><p><b> //顯示</b></p><p><b> {</b></p>&
99、lt;p> if(!process)</p><p><b> {</b></p><p> printf("there is no process now\n");</p><p><b> }</b></p><p> while(process&&a
100、mp;process->state!=4)</p><p><b> {</b></p><p> printf("name of process %d",process->name);</p><p> printf("\tneedtime %d",process->needti
101、me);</p><p> printf(" arrivetime %d",process->arrivetime);</p><p> printf(" pri %d",process->pri);</p><p> printf(" state %d",process-&g
102、t;state);</p><p> printf(" cputime %d\n",process->cputime);</p><p> process = process->next;</p><p><b> }</b></p><p><b> }</b
103、></p><p> plist *sort(plist *head) </p><p> //將進(jìn)程隊(duì)列按到達(dá)先后順序排序</p><p><b> {</b></p><p> plist *p,*p1,*p2,*p3,*temp;</p><p><b> p=h
104、ead;</b></p><p> while(p->next!=NULL) </p><p><b> {</b></p><p> p=p->next;</p><p><b> }</b></p><p> while(p!=head)
105、</p><p><b> {</b></p><p> p3=p1=head;</p><p> p2=p1->next;</p><p> while(p1!=p && p1->next!=NULL)</p><p><b> {</b&g
106、t;</p><p> if((p1->arrivetime)>(p2->arrivetime))</p><p><b> {</b></p><p> if(p1==head)</p><p><b> {</b></p><p><b&g
107、t; head=p2;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> p3->next=p2;</p><p><b&g
108、t; }</b></p><p> temp=p2->next;</p><p> p2->next=p1;</p><p> p1->next=temp;</p><p><b> temp=p1;</b></p><p><b> p1=p2
109、;</b></p><p><b> p2=temp;</b></p><p><b> }</b></p><p><b> p3=p1;</b></p><p> p1=p1->next;</p><p> p2=p1-&
110、gt;next;</p><p><b> }</b></p><p><b> p=p3;</b></p><p><b> }</b></p><p> return head;</p><p><b> }</b>&
111、lt;/p><p> plist *fcfs_creatready(plist *ready_queue,plist *temp) </p><p> //將進(jìn)程temp添加到就緒隊(duì)列ready_queue的尾部</p><p><b> {</b></p><p><b> plist *q;</b
112、></p><p> q=ready_queue;</p><p> if(ready_queue) //當(dāng)就緒隊(duì)列不為空時(shí),新進(jìn)入的進(jìn)程添加到就緒隊(duì)列末尾</p><p><b> {</b></p><p> while(q->next)</p><p><b>
113、 {</b></p><p> q=q->next;</p><p> } //使指針P指向就緒隊(duì)列中最后一個(gè)進(jìn)程</p><p> q->next=temp;</p><p> temp->state=1;//修改進(jìn)程狀態(tài)</p><p> temp->next=
114、NULL;</p><p><b> }</b></p><p> else //當(dāng)就緒隊(duì)列為空時(shí),新進(jìn)入的進(jìn)程作為就緒隊(duì)列頭部</p><p><b> {</b></p><p> ready_queue=temp;</p><p> ready_queue
115、->state = 1; //將進(jìn)程狀態(tài)設(shè)為就緒狀態(tài)</p><p> temp->next=NULL;</p><p><b> }</b></p><p> return ready_queue;</p><p><b> }</b></p><p>
116、 plist *hrrn_creatready(plist *ready_queue, plist *temp)</p><p> //按優(yōu)先數(shù)遞減的順序?qū)⑦M(jìn)程temp添加到就緒隊(duì)列ready_queue的合適位置</p><p><b> {</b></p><p> plist *q, *p;</p><p>
117、; p=q=ready_queue;</p><p> if(ready_queue && ready_queue->pri>temp->pri) //按優(yōu)先數(shù)遞減的順序?qū)⑦M(jìn)程temp添加到就緒隊(duì)列ready_queue的合適位置</p><p><b> {</b></p><p> while(q
118、&&q->pri>=temp->pri)</p><p><b> {</b></p><p><b> p=q;</b></p><p> q=q->next;</p><p> } //使指針P->next指向就緒隊(duì)列中進(jìn)程temp的插
119、入位置</p><p> p->next=temp;</p><p> temp->next=q;</p><p> temp->state=1;//修改進(jìn)程狀態(tài)</p><p><b> }</b></p><p> else //當(dāng)就緒隊(duì)列為空時(shí),新進(jìn)入的進(jìn)程作
120、為就緒隊(duì)列頭部</p><p><b> {</b></p><p> temp->next=ready_queue;</p><p> ready_queue=temp;</p><p> ready_queue->state = 1; //將進(jìn)程狀態(tài)設(shè)為就緒狀態(tài)</p>&
121、lt;p><b> }</b></p><p> return ready_queue;</p><p><b> }</b></p><p> void process_simulation(plist * process,plist *creatready(plist *,plist *))</p&
122、gt;<p><b> {</b></p><p> int time; //模擬CPU時(shí)鐘</p><p> plist *temp;</p><p> plist *ready_queue=NULL; //定義就緒隊(duì)列,并初始化</p><p> time = 0; //初始化CPU時(shí)
123、序</p><p> while(process||ready_queue) //當(dāng)進(jìn)程隊(duì)列不為空,或者就緒隊(duì)列不為空</p><p><b> {</b></p><p> while(process && time == process->arrivetime)</p><p><b
124、> {</b></p><p> temp = process;</p><p> process = process->next;</p><p> ready_queue=creatready(ready_queue, temp);//進(jìn)程到達(dá)時(shí)進(jìn)入就緒隊(duì)列</p><p><b> }&l
125、t;/b></p><p> if(ready_queue == NULL) //如果沒(méi)有進(jìn)程運(yùn)行,打印CPU空轉(zhuǎn)信息</p><p><b> {</b></p><p> printf("The time sequence is :%d\n",time);</p><p> prin
126、tf("The ready queue is :\n");</p><p> printf("there is no process now\n");</p><p> printf("-----------------------------\n");</p><p><b> time+
127、+;</b></p><p> Sleep(500);</p><p><b> }</b></p><p> else//如果有進(jìn)程需要運(yùn)行,則模擬進(jìn)程運(yùn)行過(guò)程</p><p><b> {</b></p><p> printf("The
128、time sequence is :%d\n",time);</p><p> printf("The ready queue is :\n");</p><p> show(ready_queue->next);//打印就緒隊(duì)列</p><p> action(ready_queue); //模擬進(jìn)程運(yùn)行</p>
129、;<p> if(ready_queue->needtime == 0) //進(jìn)程運(yùn)行結(jié)束,此時(shí)將此進(jìn)程從就緒隊(duì)列中刪除</p><p><b> {</b></p><p> ready_queue=ready_queue->next;</p><p><b> }</b></p&
130、gt;<p><b> time++;</b></p><p> Sleep(1000);</p><p><b> }</b></p><p><b> }</b></p><p> printf("The time sequence is
131、:%d\n",time); //先來(lái)先服務(wù)模擬調(diào)度結(jié)束</p><p> printf("there is no process now\n");</p><p> printf("-----------------------------\n");</p><p><b> }</b>&
132、lt;/p><p> void main()</p><p><b> {</b></p><p> int n; /*the number of process*/</p><p><b> int k;</b></p><p> plist *process;&l
133、t;/p><p> printf("please input the number of process: ");</p><p> scanf("%d",&n);</p><p> process = creatpro(n);</p><p> process = sort(process
134、);/****** 利用冒泡法將進(jìn)程按到達(dá)時(shí)間排序 ******/</p><p> show(process);</p><p> printf("please choose the what you want to use:\n");</p><p> printf("\t1 先來(lái)先服務(wù)\n\t2 最高優(yōu)先數(shù)優(yōu)先\n&quo
135、t;);</p><p> scanf("%d",&k);</p><p><b> switch(k)</b></p><p><b> {</b></p><p><b> case 1: </b></p><p&g
136、t;<b> {</b></p><p> process_simulation(process,fcfs_creatready); /****** 先來(lái)先服務(wù) ******/ </p><p><b> break;</b></p><p><b> }</b></p>&
137、lt;p><b> case 2: </b></p><p><b> {</b></p><p> process_simulation(process,hrrn_creatready); /****** 最高優(yōu)先數(shù)算法 ******/</p><p><b> break;</b>
138、</p><p><b> }</b></p><p> default : </p><p><b> {</b></p><p> printf("請(qǐng)輸入正確選項(xiàng)!??!\n");</p><p><b> break;</b&
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 進(jìn)程模擬調(diào)度算法課程設(shè)計(jì)
- 進(jìn)程調(diào)度模擬程序課程設(shè)計(jì)
- 《高級(jí)語(yǔ)言程序設(shè)計(jì)》課程設(shè)計(jì)--進(jìn)程調(diào)度模擬
- (精品)模擬建筑塔鐘(2013年優(yōu)秀畢業(yè)設(shè)計(jì))
- [優(yōu)秀畢業(yè)設(shè)計(jì)精品] 簡(jiǎn)易地震模擬振動(dòng)系統(tǒng)的設(shè)計(jì)
- (精品)建筑欣賞精品(2013年優(yōu)秀畢業(yè)設(shè)計(jì))
- 精品組合機(jī)床畢業(yè)設(shè)計(jì)(優(yōu)秀)
- 精品組合機(jī)床畢業(yè)設(shè)計(jì)(優(yōu)秀)
- (精品)膜結(jié)構(gòu)精品(2013年優(yōu)秀畢業(yè)設(shè)計(jì))
- (精品)花卉鑒賞精品(2013年優(yōu)秀畢業(yè)設(shè)計(jì))
- (精品)杯座模具設(shè)計(jì)精品(2013年優(yōu)秀畢業(yè)設(shè)計(jì))
- (精品)清水混凝土施工精品(2013年優(yōu)秀畢業(yè)設(shè)計(jì))
- (精品)倉(cāng)庫(kù)管理系統(tǒng)精品(2013年優(yōu)秀畢業(yè)設(shè)計(jì))
- [優(yōu)秀畢業(yè)設(shè)計(jì)精品] 公交報(bào)站器設(shè)計(jì)
- [優(yōu)秀畢業(yè)設(shè)計(jì)精品] 教師管理系統(tǒng)設(shè)計(jì)
- [優(yōu)秀畢業(yè)設(shè)計(jì)精品] 立式珩磨裝置設(shè)計(jì)
- (精品)非線性建筑初探精品(2013年優(yōu)秀畢業(yè)設(shè)計(jì))
- 進(jìn)程調(diào)度模擬系統(tǒng)課程設(shè)計(jì)
- [優(yōu)秀畢業(yè)設(shè)計(jì)精品] 珩磨機(jī)設(shè)計(jì)報(bào)告
- (精品)畢業(yè)設(shè)計(jì)人力資源系統(tǒng)(2013年優(yōu)秀畢業(yè)設(shè)計(jì))
評(píng)論
0/150
提交評(píng)論