版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 計(jì)算機(jī)科學(xué)與應(yīng)用系</b></p><p><b> 操作系統(tǒng)原理</b></p><p><b> 課程設(shè)計(jì)報(bào)告</b></p><p> 題目: 進(jìn)程調(diào)度算法 </p><p><b> 班級: </b
2、></p><p> 姓名: </p><p> 專業(yè): 計(jì)算機(jī)科學(xué)與技術(shù) </p><p> 指導(dǎo)老師: </p><p><b> 進(jìn)程調(diào)度算法</b></p><p><b> 一、實(shí)驗(yàn)?zāi)康?lt;/b></p>
3、;<p> 通過優(yōu)先權(quán)法與輪轉(zhuǎn)調(diào)度算法的模擬加深對進(jìn)程概念和進(jìn)程調(diào)度過程的理解,掌握進(jìn)程狀態(tài)之間的切換,同時(shí)掌握進(jìn)程調(diào)度算法的實(shí)現(xiàn)方法和技巧。</p><p><b> 二、實(shí)驗(yàn)內(nèi)容</b></p><p> 1、用C語言或C++語言來實(shí)現(xiàn)對N個(gè)進(jìn)程采用優(yōu)先算法以及輪轉(zhuǎn)算法的進(jìn)程調(diào)度。</p><p> 2、每個(gè)用來標(biāo)示進(jìn)
4、程的進(jìn)程控制塊PCB用結(jié)果來描述,包括以下字段</p><p> ?。?)進(jìn)程標(biāo)識ID,其中0為閑逛進(jìn)程,用戶進(jìn)程的標(biāo)識數(shù)為1、2、3、、、、、、、。</p><p> ?。?)進(jìn)程優(yōu)先級Priority,閑逛進(jìn)程(idle)的優(yōu)先級為0,用戶有進(jìn)程的優(yōu)先級大于0,且隨機(jī)產(chǎn)生,標(biāo)識數(shù)越大,優(yōu)先級越高。</p><p> ?。?)進(jìn)程占用的CPU時(shí)間CPUtime,進(jìn)
5、程每運(yùn)一次,累積等于4.</p><p> ?。?)進(jìn)程總共需要運(yùn)行時(shí)間Alltime,利用隨機(jī)函數(shù)產(chǎn)生。</p><p> (5)進(jìn)程狀態(tài),0—就緒態(tài),1—運(yùn)行態(tài),2—阻塞態(tài)。</p><p> ?。?)隊(duì)列指針next,用來將多個(gè)進(jìn)程控制塊PCB鏈接為隊(duì)列。</p><p> 3、優(yōu)先數(shù)改變的原則</p><p&g
6、t; (1)進(jìn)程在就緒隊(duì)列中每呆一個(gè)時(shí)間片,優(yōu)先數(shù)增加1.</p><p> ?。?)進(jìn)程每運(yùn)行一個(gè)時(shí)間片,優(yōu)先數(shù)增加1.</p><p> 4、在調(diào)度前,系統(tǒng)中擁有的進(jìn)程數(shù)PCB_number有鍵盤輸入,進(jìn)初始化后,所有的進(jìn)程控制塊PCB連接成就緒隊(duì)列。</p><p> 5、為了清楚的觀察諸進(jìn)程的調(diào)度過程,程序應(yīng)將每個(gè)時(shí)間片內(nèi)的進(jìn)程的情況顯示出來。<
7、/p><p><b> 三、實(shí)驗(yàn)步驟</b></p><p> 1、進(jìn)程管理程序調(diào)式好后,運(yùn)行進(jìn)程管理程序</p><p><b> Y</b></p><p><b> N</b></p><p><b> N</b><
8、;/p><p><b> Y</b></p><p><b> Y</b></p><p><b> N</b></p><p><b> N</b></p><p><b> Y</b></p&
9、gt;<p><b> Y</b></p><p><b> N</b></p><p><b> N</b></p><p><b> Y</b></p><p><b> 2、優(yōu)先權(quán)調(diào)度</b></p
10、><p> (1)輸入1選擇優(yōu)先權(quán)調(diào)度算法模擬。</p><p> (2)輸入開始進(jìn)程個(gè)數(shù)n,創(chuàng)建n個(gè)PCB并加入就緒隊(duì)列ready_queue中。</p><p> ?。?)就緒隊(duì)列ready_queue不為空,調(diào)度就緒隊(duì)列中第一個(gè)進(jìn)程運(yùn)行,否則,從閑逛隊(duì)列idleprocess中調(diào)度閑逛進(jìn)程運(yùn)行。</p><p> ?。?)在運(yùn)行過程中,
11、當(dāng)遇到阻塞,則該進(jìn)程插入到阻塞隊(duì)列block_queue中,且將該進(jìn)程從ready_queue中刪除。</p><p> ?。?)如果運(yùn)行時(shí)間CPUtime大于等于Alltime,該進(jìn)程運(yùn)行完畢,釋放該進(jìn)程;否則插入到就緒隊(duì)列中。</p><p> ?。?)更新就緒隊(duì)列中的優(yōu)先級數(shù)。</p><p> ?。?)隨機(jī)對阻塞隊(duì)列block_queue中的進(jìn)程PCB詢問是
12、否要喚醒,喚醒,即從喚醒隊(duì)列中選擇第一個(gè)進(jìn)程,且插入就緒隊(duì)列中;阻塞隊(duì)列中沒有阻塞進(jìn)程返回。</p><p> ?。?)重復(fù)上述步驟,直到本次調(diào)度結(jié)束。</p><p><b> 3、輪轉(zhuǎn)調(diào)度</b></p><p> ?。?)輸入2選擇優(yōu)先權(quán)調(diào)度算法模擬。</p><p> ?。?)輸入開始進(jìn)程個(gè)數(shù)n,創(chuàng)建n個(gè)PCB
13、并加入就緒隊(duì)列ready_queue中。</p><p> (3)就緒隊(duì)列ready_queue不為空,調(diào)度就緒隊(duì)列中第一個(gè)進(jìn)程運(yùn)行,否則,從閑逛隊(duì)列idleprocess中調(diào)度閑逛進(jìn)程運(yùn)行。</p><p> ?。?)在運(yùn)行過程中,當(dāng)遇到阻塞,則該進(jìn)程插入到阻塞隊(duì)列block_queue中,且將該進(jìn)程從ready_queue中刪除。</p><p> ?。?)如
14、果運(yùn)行時(shí)間CPUtime大于等于Alltime,該進(jìn)程運(yùn)行完畢,釋放該進(jìn)程;否則插入到就緒隊(duì)列中。</p><p> ?。?)隨機(jī)對阻塞隊(duì)列block_queue中的進(jìn)程PCB詢問是否要喚醒,喚醒,即從喚醒隊(duì)列中選擇第一個(gè)進(jìn)程,且插入就緒隊(duì)列中;阻塞隊(duì)列中沒有阻塞進(jìn)程返回。</p><p> ?。?)如果時(shí)間到,本次調(diào)度結(jié)束,否則重復(fù)上述步驟,直到本次調(diào)度結(jié)束。</p>&l
15、t;p><b> Y</b></p><p><b> N</b></p><p><b> N</b></p><p><b> Y</b></p><p><b> Y</b></p><p&g
16、t;<b> N</b></p><p><b> N</b></p><p><b> Y</b></p><p><b> Y</b></p><p><b> N</b></p><p>&l
17、t;b> N</b></p><p><b> Y</b></p><p><b> Y</b></p><p> 四、實(shí)驗(yàn)過程中遇到的問題及解決方案</p><p> 1、請仔細(xì)閱讀動態(tài)優(yōu)先權(quán)的進(jìn)程調(diào)度算法的模擬實(shí)現(xiàn)代碼,說明該算法與教材中介紹的算法做了哪些簡單化處理.
18、</p><p> 優(yōu)先權(quán)模擬時(shí)優(yōu)先權(quán)是隨機(jī)產(chǎn)生,在實(shí)際的系統(tǒng)中,系統(tǒng)進(jìn)程的優(yōu)先權(quán)高于一般用戶進(jìn)程的優(yōu)先權(quán)。</p><p> 2、為什么對進(jìn)程的優(yōu)先數(shù)可按上述原則進(jìn)行修改?</p><p> 最高優(yōu)先權(quán)調(diào)度算法僅照顧了優(yōu)先權(quán)高的進(jìn)程,當(dāng)不斷有優(yōu)先權(quán)高的進(jìn)程需調(diào)度時(shí),而優(yōu)先權(quán)低的進(jìn)程將很難得到處理機(jī)的調(diào)度,所以進(jìn)程在就緒隊(duì)列中每呆一個(gè)時(shí)間片,優(yōu)先數(shù)增加1,使優(yōu)
19、先權(quán)低的進(jìn)程不總是忙等。</p><p> 3、請給出設(shè)計(jì)實(shí)現(xiàn)的輪轉(zhuǎn)發(fā)進(jìn)程調(diào)度算法的設(shè)計(jì)思想.</p><p> 時(shí)間輪轉(zhuǎn)調(diào)度算法:系統(tǒng)將所有的就像進(jìn)程按先來先服務(wù)的原則,排成一個(gè)隊(duì)列,每次調(diào)度時(shí),把CPU分配給首進(jìn)程,并令其執(zhí)行一個(gè)時(shí)間片。當(dāng)執(zhí)行的時(shí)間片用完時(shí),發(fā)出中斷請求,調(diào)度程序便據(jù)此信號來停止該進(jìn)程的執(zhí)行,并將其送到就緒隊(duì)列的末尾,如此反復(fù),就可以保證就緒隊(duì)列中的所有進(jìn)程在一個(gè)
20、給定的時(shí)間內(nèi),均能獲得一時(shí)間片處理機(jī)執(zhí)行時(shí)間。</p><p> 4、在實(shí)際的進(jìn)程調(diào)度中,除了按調(diào)度算法選擇下一個(gè)執(zhí)行的進(jìn)程外,還應(yīng)處理哪些工作?</p><p> 最高優(yōu)先權(quán)調(diào)度算法,常用于批處理系統(tǒng)中,作為作業(yè)調(diào)度算法,也作為多種操作系統(tǒng)中的進(jìn)程調(diào)度算法,還可以用于實(shí)時(shí)系統(tǒng)中:時(shí)間輪轉(zhuǎn)調(diào)度算法,一般用于分時(shí)系統(tǒng)中。</p><p><b> 五、
21、課程設(shè)計(jì)總結(jié)</b></p><p> 1、當(dāng)把該算法用于作業(yè)調(diào)度時(shí),系統(tǒng)將從后備隊(duì)列中選擇若干個(gè)優(yōu)先權(quán)最高的作業(yè),裝入內(nèi)存,當(dāng)用于進(jìn)程調(diào)度算法時(shí),該算法是把處理及分配給就緒隊(duì)列中優(yōu)先權(quán)最高的進(jìn)程。</p><p> 2、當(dāng)系統(tǒng)空閑(就緒隊(duì)列為空)時(shí),系統(tǒng)運(yùn)行閑逛進(jìn)程,否則運(yùn)行其他進(jìn)程,發(fā)生變遷(就緒運(yùn)行)</p><p> 3、在運(yùn)行進(jìn)程(包括閑
22、逛進(jìn)程)的過程中,可能發(fā)生變遷2(運(yùn)行阻塞),即將運(yùn)行進(jìn)程插入到阻塞隊(duì)列(閑逛進(jìn)程不能不被阻塞),可能有其他的進(jìn)程創(chuàng)建PCB,還可能喚醒阻塞隊(duì)列中的某些進(jìn)程PCB,發(fā)生變遷3(阻塞就緒),即從阻塞隊(duì)列中插入就緒隊(duì)列中。</p><p> 4、時(shí)間片運(yùn)行結(jié)束后,若進(jìn)程累積占用CPU時(shí)間大于等于進(jìn)程需要運(yùn)行時(shí)間,則進(jìn)程執(zhí)行結(jié)束,釋放其PCB。若進(jìn)程累積占用CPU時(shí)間小于進(jìn)程需要運(yùn)行時(shí)間,發(fā)生變遷4(運(yùn)行就緒),即將
23、當(dāng)前運(yùn)行的進(jìn)程插入就緒隊(duì)列中。</p><p> 附:進(jìn)程調(diào)度算法代碼</p><p> // process.cpp : Defines the entry point for the console application.</p><p><b> //</b></p><p> #include &quo
24、t;stdafx.h"</p><p> #include "stdio.h"</p><p> #include "stdlib.h"</p><p> #include "iostream.h"</p><p> #define NULL 0</p>
25、<p> #define false 0</p><p> #define true 1</p><p> bool _state=0;</p><p> struct PCB</p><p><b> {</b></p><p><b> int ID;<
26、;/b></p><p> int priority;</p><p> int CPUtime;</p><p> int ALLtime;</p><p> int State;</p><p> PCB* next;</p><p><b> };</b&
27、gt;</p><p> void init();/*產(chǎn)生idle進(jìn)程,輸入用戶進(jìn)程數(shù)目,調(diào)用insert()*/</p><p> void print(PCB *pcb);/*輸出進(jìn)程屬性信息*/</p><p> void print_init(PCB *pcb);/*輸出所有PCB的初始值*/</p><p> void in
28、sert();/*生成進(jìn)程屬性信息,插入進(jìn)程就緒隊(duì)列*/</p><p> void Run_priority(PCB *pcb);/*運(yùn)行進(jìn)程,隨機(jī)阻塞進(jìn)程、產(chǎn)生新進(jìn)程,插入就緒隊(duì)列,喚醒阻塞進(jìn)程*/</p><p> void block(PCB *pcb);/*調(diào)用destroy()將進(jìn)程插入阻塞隊(duì)列*/</p><p> void wakeup();/
29、*喚醒進(jìn)程,插入就緒隊(duì)列*/</p><p> void proc_priority();/*優(yōu)先權(quán)調(diào)度算法模擬*/</p><p> //void Run_loop(PCB *pcb);</p><p> void proc_loop();/*輪轉(zhuǎn)法調(diào)度算法模擬*/</p><p> void update(PCB *pcb);/*
30、更新進(jìn)程信息*/</p><p> void pushback_queue(PCB *queue,PCB *item);/*將item插入到隊(duì)列的尾部*/</p><p> void insert_queue(PCB *queue,PCB *item);/*將item插入到隊(duì)列中,使得插入后,隊(duì)列中按照優(yōu)先級從高到低有序*/</p><p> void sor
31、t_queue(PCB *&queue);/*對queue中的結(jié)點(diǎn)進(jìn)行排序,按照優(yōu)先級從大到小*/</p><p> PCB *ready_queue,*block_queue,*idleprocess;/*就緒隊(duì)列,阻塞隊(duì)列及閑逛進(jìn)程指針變量*/</p><p> int main(int argc, char* argv[])</p><p><
32、;b> {</b></p><p><b> int i=0;</b></p><p><b> while(1)</b></p><p><b> {</b></p><p> cout<<"\\**********PROCE
33、SS**********/";</p><p> cout<<("\n Please select a num in(1,2,0) ");</p><p> cout<<("\n 1--priority ");</p><p> cout<<("\n 2--loop
34、 ");</p><p> cout<<("\n 0-- exit\n");</p><p> cout<<"Please select a num:";</p><p><b> cin>>i;</b></p><p><
35、b> while(i)</b></p><p><b> {</b></p><p><b> if(i==1)</b></p><p><b> {</b></p><p> cout<<("\n This is a exam
36、ple for priority processing: \n ");</p><p><b> init();</b></p><p> proc_priority();</p><p><b> }</b></p><p> else if (i==2)</p>
37、<p><b> {</b></p><p> cout<<("\n This is a example for round robin processing: \n ");</p><p><b> init();</b></p><p> proc_loop();<
38、;/p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> cout<<"Please select a num in(1,2,0)\n";</p>
39、<p><b> }</b></p><p> cout<<"Please select a num:";</p><p><b> cin>>i;</b></p><p><b> }</b></p><p>
40、<b> return 0;</b></p><p><b> }</b></p><p><b> }</b></p><p> ///////輸出所有PCB的初始值</p><p> void print_init(PCB *pcb)</p><
41、;p><b> {</b></p><p> PCB* temp=pcb->next ;</p><p> cout<<("\nID priority CPUtime ALLtime State");</p><p> while(temp!=NULL)</p><
42、p><b> {</b></p><p> cout<<"\n"<<temp->ID<<" "<<temp->priority<<" "<<temp->CPUtime<<"
43、 "<<temp->ALLtime;</p><p> if(temp->State==0)</p><p> cout<<(" ready");</p><p> else if(temp->State ==1)</p><p> cout<<
44、;(" running");</p><p><b> else</b></p><p> cout<<(" blocked");</p><p> temp=temp->next;</p><p><b> }</b>&
45、lt;/p><p><b> }</b></p><p> ///////輸出進(jìn)程屬性信息</p><p> void print(PCB *pcb)</p><p><b> {</b></p><p> PCB *temp;</p><p>
46、<b> temp=pcb;</b></p><p> if(pcb->ID==0)</p><p> cout<<("\nThe idle peocess id running!");</p><p><b> else</b></p><p><
47、;b> {</b></p><p> cout<<"\n"<<temp->ID<<" "<<temp->priority<<" "<<temp->CPUtime<<" "
48、<<temp->ALLtime;</p><p> if(temp->State==0)</p><p> cout<<(" ready");</p><p> else if(temp->State ==1)</p><p> cout<<("
49、; running");</p><p><b> else</b></p><p> cout<<(" blocked");</p><p><b> }</b></p><p><b> }</b></
50、p><p> ///////將item插入到隊(duì)列中,使得插入后,隊(duì)列中按照優(yōu)先級從高到低有序</p><p> void insert_queue(PCB *queue,PCB *item)</p><p><b> {</b></p><p> PCB *p,*q;</p><p> q=
51、queue;p=q->next;</p><p> while(p!=0&&p->priority>=item->priority)</p><p><b> {</b></p><p><b> q=p;</b></p><p> p=p->n
52、ext;</p><p><b> }</b></p><p><b> if(p==0)</b></p><p><b> {</b></p><p> item->next =0;</p><p> q->next=item;&
53、lt;/p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> item->next =p;</p><p> q->next =item;</p>
54、;<p><b> }</b></p><p><b> }</b></p><p> ///////將item插入到阻塞隊(duì)列的尾部</p><p> void pushback_queue(PCB *queue,PCB *item)</p><p><b> {&
55、lt;/b></p><p> PCB *p,*q;</p><p> q=queue,p=q->next;</p><p> while(p!=0)</p><p><b> {</b></p><p><b> q=p;</b></p>
56、<p> p=p->next;</p><p><b> }</b></p><p> item->next =q->next ;</p><p> q->next =item;</p><p><b> }</b></p><p&g
57、t; ///////對queue中的結(jié)點(diǎn)進(jìn)行排序,按照優(yōu)先級從大到小</p><p> void sort_queue(PCB *&queue)</p><p><b> {</b></p><p> PCB *temp=new PCB;</p><p> temp->next =0;</p
58、><p> while(queue->next )</p><p><b> {</b></p><p><b> PCB *p;</b></p><p> p=queue->next;</p><p> queue->next =p->next
59、 ;</p><p> insert_queue(temp,p);</p><p><b> }</b></p><p> queue->next =temp->next ;</p><p> delete temp;</p><p><b> }</b>
60、;</p><p> ///////生成進(jìn)程屬性信息,插入進(jìn)程就緒隊(duì)列,顯示進(jìn)程信息</p><p> void insert()</p><p><b> {</b></p><p> PCB *newp=0;</p><p> static long id =0;</p>
61、<p> newp=new PCB;</p><p><b> id++;</b></p><p> newp->ID =id;</p><p> newp->State=0;</p><p> newp->CPUtime=0;</p><p> new
62、p->priority=rand()%3+1;</p><p> newp->ALLtime=rand()%3+1;</p><p> newp->next =NULL;</p><p> pushback_queue(ready_queue,newp);</p><p> //print(newp);</p&
63、gt;<p> //cout<<("建立: Creating -> ready\n");</p><p><b> }</b></p><p> ////////生成n個(gè)進(jìn)程屬性信息,插入進(jìn)程就緒隊(duì)列,顯示進(jìn)程信息</p><p> void insert(int n)</p&
64、gt;<p><b> {</b></p><p> for(int i=0;i<n;i++)</p><p><b> insert();</b></p><p><b> }</b></p><p> ///////產(chǎn)生idle進(jìn)程,輸入用戶進(jìn)
65、程數(shù)目,調(diào)用insert()</p><p> void init()</p><p><b> {</b></p><p> block_queue=new PCB;</p><p> block_queue->next=0;</p><p> ready_queue=new P
66、CB;</p><p> ready_queue->next=0;</p><p> int i=0,pcb_number=-1;//閑逛進(jìn)程放入就緒隊(duì)列</p><p> idleprocess=NULL;</p><p> idleprocess=(PCB *)malloc(sizeof(PCB));</p>
67、<p> idleprocess->ID=0;</p><p> idleprocess->State=0;</p><p> idleprocess->CPUtime=0;</p><p> idleprocess->priority=0;</p><p> idleprocess->ALL
68、time=0;</p><p> idleprocess->next=NULL;</p><p> idleprocess->next=ready_queue->next;//閑逛進(jìn)程放入就緒隊(duì)列</p><p> ready_queue->next=idleprocess;</p><p> //也可以假定初
69、始時(shí)系統(tǒng)中只有一個(gè)idle進(jìn)程</p><p> //輸入初始進(jìn)程的個(gè)數(shù)</p><p> while(pcb_number<0)</p><p><b> {</b></p><p> cout<<("Input the number of PCB to be start:"
70、;);</p><p> cin>>pcb_number;</p><p><b> }</b></p><p> cout<<("\nID priority CPUtime ALLtime State\n");</p><p> for(;i<pcb_n
71、umber;i++)</p><p><b> insert();</b></p><p> cout<<"*就緒隊(duì)列初始化成功"<<endl;</p><p> ::print_init(ready_queue);</p><p> cout<<endl;
72、</p><p><b> }</b></p><p> ///////調(diào)用destroy()將進(jìn)程插入阻塞隊(duì)列</p><p> void block(PCB *pcb)</p><p><b> {</b></p><p> pcb->State=2;&l
73、t;/p><p> pcb->CPUtime-=2;</p><p> if(pcb->CPUtime<=0)</p><p><b> {</b></p><p> pcb->CPUtime+=2;</p><p><b> }</b><
74、/p><p> cout<<"\nThe process no"<<pcb->ID<<" is blocked!";</p><p> print(pcb);</p><p> cout<<(" 變遷2:running -> blocked\n&q
75、uot;);</p><p> pcb->next=block_queue->next;</p><p> block_queue->next =pcb;</p><p><b> }</b></p><p> ///////更新進(jìn)程信息,就緒隊(duì)列中進(jìn)程的優(yōu)先級均增加1</p>&
76、lt;p> void update(PCB *pcb)</p><p><b> {</b></p><p> PCB *temp=pcb->next;</p><p> while(temp&&temp->next )</p><p><b> {</b>
77、;</p><p> temp->priority++;</p><p> temp=temp->next;</p><p><b> }</b></p><p><b> }</b></p><p> ///////喚醒進(jìn)程,插入就緒隊(duì)列</p&
78、gt;<p> void wakeup()</p><p><b> {</b></p><p> if(block_queue->next==0)/*此時(shí)沒有阻塞的進(jìn)程,無所謂的喚醒*/</p><p><b> return ;</b></p><p> PCB *
79、q,*p;</p><p> while(true)</p><p><b> {</b></p><p> q=block_queue;</p><p> p=q->next;</p><p> while(p&&rand()%20!=1)</p>
80、<p><b> {</b></p><p><b> q=p;</b></p><p> p=p->next;</p><p><b> }</b></p><p><b> if(p!=0)</b></p>&l
81、t;p><b> {</b></p><p> q->next =p->next ;</p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p>
82、<p> p->State=0;</p><p> cout<<endl;</p><p><b> print(p);</b></p><p> cout<<" 變遷3: blocked -> ready"<<endl;</p><p
83、> insert_queue(ready_queue,p);</p><p><b> }</b></p><p> ///////運(yùn)行進(jìn)程,隨機(jī)阻塞進(jìn)程、產(chǎn)生新進(jìn)程,插入就緒隊(duì)列,喚醒阻塞進(jìn)程</p><p> void Run_priority(PCB *pcb)</p><p><b>
84、{</b></p><p> if(pcb->ID==0)</p><p><b> {</b></p><p> insert_queue(ready_queue,pcb);</p><p> print(pcb);</p><p> cout<<&quo
85、t;變遷1: ready -> running\n";</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> pcb->State=1;</p>&l
86、t;p> pcb->CPUtime+=4;</p><p> pcb->priority=pcb->priority -3;/*每運(yùn)行一個(gè)時(shí)間片,其優(yōu)先數(shù)減3*/</p><p> if(pcb->priority <1)</p><p> pcb->priority=1;</p><p>
87、 print(pcb);</p><p> printf("變遷1: ready -> running\n");</p><p> if(rand()%3==1)/*PCB不是閑逛進(jìn)程,滿足條件側(cè)阻塞此進(jìn)程*/</p><p><b> {</b></p><p> if(pcb->
88、;CPUtime-2<pcb->ALLtime)</p><p> block(pcb);</p><p> else/*已執(zhí)行完畢,應(yīng)該銷毀進(jìn)程*/</p><p><b> {</b></p><p> cout<<'\n';</p><p>
89、; cout<<"The process no"<<pcb->ID<<" is completed! 銷毀:running->Destroy"<<endl;</p><p> delete pcb;</p><p><b> }</b></p>&l
90、t;p><b> }</b></p><p> else/*否則看該進(jìn)程是否執(zhí)行完畢,如果執(zhí)行完,則釋放,否則再次放入就緒隊(duì)列*/</p><p><b> {</b></p><p> if(pcb->CPUtime>=pcb->ALLtime)/*釋放*/</p><
91、p><b> {</b></p><p> cout<<'\n';</p><p> cout<<"The process no "<<pcb->ID<<" if completed! 銷毀:running -> Destrory"<&
92、lt;endl;</p><p> delete pcb;</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> ::insert_queue(::ready_
93、queue,pcb);</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> update(ready_queue);/*更新就緒隊(duì)列的優(yōu)先級數(shù)*/</p><p>
94、 if(rand()%5==1)</p><p><b> {</b></p><p> insert(3);</p><p> ::sort_queue(ready_queue);</p><p><b> }</b></p><p> if(rand()%7==
95、1)</p><p><b> wakeup();</b></p><p><b> }</b></p><p> ///////運(yùn)行進(jìn)程,隨機(jī)阻塞進(jìn)程、產(chǎn)生新進(jìn)程,插入就緒隊(duì)列,喚醒阻塞進(jìn)程</p><p> void Run_loop(PCB *pcb)</p><p
96、><b> {</b></p><p> if(pcb->ID==0)</p><p><b> {</b></p><p> insert_queue(ready_queue,pcb);</p><p> print(pcb);</p><p> c
97、out<<"變遷1: ready -> running\n";</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> pcb->State=1
98、;</p><p> pcb->CPUtime=pcb->ALLtime;</p><p> print(pcb);</p><p> printf("變遷1: ready -> running\n");</p><p> if(rand()%3==1)/*PCB不是閑逛進(jìn)程,滿足條件側(cè)阻
99、塞此進(jìn)程*/</p><p><b> {</b></p><p><b> _state=1;</b></p><p> block(pcb);</p><p><b> }</b></p><p><b> else</b&
100、gt;</p><p><b> {</b></p><p> cout<<'\n';</p><p> cout<<"The process no "<<pcb->ID<<" if completed! 銷毀:running ->
101、Destrory"<<endl;</p><p> delete pcb;</p><p><b> }</b></p><p><b> }</b></p><p> if(rand()%5==1)</p><p><b> {
102、</b></p><p> insert(3);</p><p><b> }</b></p><p> if(rand()%7==1)</p><p><b> wakeup();</b></p><p><b> }</b>&l
103、t;/p><p> ///////優(yōu)先權(quán)調(diào)度算法模擬</p><p> void proc_priority()</p><p><b> {</b></p><p> sort_queue(ready_queue);</p><p> PCB *temp=0,*running=0;<
104、/p><p> int times=0;</p><p> cout<<"*調(diào)度前:";</p><p> ::print_init(ready_queue);</p><p> for(;times<5;times++)</p><p><b> {</
105、b></p><p> running=ready_queue->next;</p><p> ready_queue->next =running->next ;</p><p> cout<<endl;</p><p> cout<<"*調(diào)度開始"<<
106、endl;</p><p> Run_priority(running);</p><p><b> }</b></p><p> cout<<"\n*本次調(diào)度結(jié)束。"<<endl;</p><p><b> }</b></p>
107、<p> ///////輪轉(zhuǎn)調(diào)度算法模擬</p><p> void proc_loop()</p><p><b> {</b></p><p> PCB *temp=0,*running=0;</p><p> int times=10;</p><p> cout&
108、lt;<"*調(diào)度前:";</p><p> ::print_init(ready_queue);</p><p><b> while(1)</b></p><p><b> {</b></p><p> running=ready_queue->nex
109、t;</p><p> ready_queue->next =running->next ;</p><p> cout<<endl;</p><p> if(times>0)</p><p><b> {</b></p><p> times=times-
110、running->ALLtime;//每次運(yùn)行一個(gè)進(jìn)程減去ALLtime;</p><p> if(times>=0)</p><p><b> {</b></p><p> Run_loop(running);</p><p><b> }</b></p><
111、;p> else if(_state)//如果運(yùn)行時(shí)被阻塞,則運(yùn)行2個(gè)時(shí)間單位</p><p><b> {</b></p><p> times=times+2;</p><p><b> _state=0;</b></p><p> cout<<"5
112、487584574389574 fgfgfgfgf gfgfg38954378954375894378954375";</p><p><b> }</b></p><p><b> else</b></p><p> pushback_queue(block_queue,running);//時(shí)間不過,則
113、阻塞該進(jìn)程,放到阻塞隊(duì)列</p><p><b> }</b></p><p> else if(times<=0)</p><p><b> {</b></p><p> cout<<"\n*本次調(diào)度時(shí)間片到!";</p><
114、;p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p> cout<<"\n*本次調(diào)度結(jié)束。"<<endl;</p><p><b&g
115、t; }</b></p><p><b> Linux進(jìn)程管理</b></p><p><b> 一、實(shí)驗(yàn)?zāi)康?lt;/b></p><p> 進(jìn)程描述符即為進(jìn)程控制塊。Linux的進(jìn)程控制塊由task_struct結(jié)果表示,其結(jié)構(gòu)在sched.h里定義。主要進(jìn)城標(biāo)識、調(diào)度相關(guān)信息、進(jìn)程虛擬空間信息、文件相關(guān)
116、信息、信號處理信息、記賬信息及統(tǒng)計(jì)信息、描述進(jìn)程間關(guān)系的指針等。</p><p> 加深對進(jìn)程概念的理解,明確進(jìn)程和程序的區(qū)別,進(jìn)一步認(rèn)識并發(fā)的實(shí)質(zhì),通過分析進(jìn)程爭用資源的現(xiàn)象,學(xué)習(xí)解決進(jìn)程互斥的方法,了解Linux系統(tǒng)中進(jìn)程通信的基本原理。</p><p><b> 二、實(shí)驗(yàn)內(nèi)容</b></p><p> 閱讀Linux的sched.h
117、源碼文件,加深對進(jìn)程管理概念的理解。閱讀Linux的fork.c源碼文件,分析進(jìn)程的創(chuàng)建過程。</p><p> 學(xué)習(xí)Linux系統(tǒng)進(jìn)行C程序的編譯調(diào)式方法。GCC是GNU project Cand C++compiler宿寫,是C/C++語言的編譯器。因其后來可以多種語言的開發(fā),現(xiàn)在改變?yōu)镚NC Compiler Collection。使用gcc hello.c-o hello可以生成執(zhí)行的文件hello。&
118、lt;/p><p> Linux的進(jìn)程狀態(tài)有五種:</p><p> TASK_RUNNING(運(yùn)行):無論進(jìn)程是否正在占用CPU,只要具備運(yùn)行條件,都處于該狀態(tài)。Linux把處于該狀態(tài)的所有PCB組織成一個(gè)可運(yùn)行隊(duì)列run_queue,調(diào)度程序從這個(gè)隊(duì)列只中選擇進(jìn)程運(yùn)行。</p><p> TASK_INTERRUPTIBLE(可中斷阻塞):Linux將阻塞態(tài)劃
119、分成TASK_UNINTERRUPTIBLE、TASK_STOPPED、TASK_ZOMBILE三種不同的狀態(tài): TASK_UNINTERRUPTIBLE(不可中斷喚醒):處于該狀態(tài)的進(jìn)程只有當(dāng)資源有效時(shí)被喚醒,不能通過信號或定時(shí)中斷喚醒;TASK_STOPPED(暫停):處于該狀態(tài)的進(jìn)程只能通過其他進(jìn)程的信號才能喚醒;TASK_ZOMBILE(僵死):進(jìn)程已結(jié)束但尚未消亡,已經(jīng)釋放了大部分資源,PCB仍未被釋放。處于TASK_UNIN
120、TERRUPTIBLE狀態(tài)的進(jìn)程資源有效時(shí)被喚醒,也可以通過信號或定時(shí)中斷喚醒。</p><p><b> 三、實(shí)驗(yàn)步驟</b></p><p><b> 1、進(jìn)程的創(chuàng)建</b></p><p> 編寫一段程序,使用系統(tǒng)調(diào)用fork()創(chuàng)建兩個(gè)進(jìn)程。當(dāng)此程序運(yùn)行時(shí),在系統(tǒng)中有一個(gè)父進(jìn)程和兩個(gè)子進(jìn)程活動。讓每個(gè)進(jìn)程在屏
121、幕上顯示一個(gè)字符:父進(jìn)程顯示字符“A”,子進(jìn)程分別顯示字符“B”和字符“C”。</p><p> #include<stdio.h></p><p> void main()</p><p><b> {</b></p><p> int p1,p2;</p><p> wh
122、ile(p1=fork()==-1);//創(chuàng)建子進(jìn)程</p><p><b> if(p1==0)</b></p><p> putchar('b');</p><p><b> else</b></p><p><b> {</b></p>
123、<p> while((p2==fork())==-1);//創(chuàng)建子進(jìn)程</p><p><b> if(p2==0)</b></p><p> putchar('c');</p><p><b> else</b></p><p> putchar('
124、;a');//父進(jìn)程</p><p><b> }</b></p><p><b> }</b></p><p><b> 2、進(jìn)程的控制</b></p><p> #include<stdio.h></p><p> vo
125、id main()</p><p><b> {</b></p><p> int p1,p2;</p><p> while(p1=fork()==-1);//創(chuàng)建子進(jìn)程</p><p><b> if(p1==0)</b></p><p> for(int i;
126、i<10;i++)</p><p> printf("daugheter%d\n",i);</p><p><b> else</b></p><p><b> {</b></p><p> while((p2==fork())==-1);//創(chuàng)建子進(jìn)程</p
127、><p><b> if(p2==0)</b></p><p> for(int i;i<10;i++)</p><p> printf("son%d\n",i);</p><p><b> else</b></p><p> for(int
128、i;i<10;i++)</p><p> printf("parent%d\n",i);</p><p><b> }</b></p><p><b> }</b></p><p> #include<stdio.h></p><p&
129、gt; #include<unistd.h></p><p> #include<sys/wait.h></p><p> #include<sys/stat.h></p><p> #include<sys/types.h></p><p> #include<fcntl.h&
130、gt;</p><p> void main()</p><p><b> {</b></p><p> int fd,spid,ppid;</p><p> char str[80];</p><p> fd=open("myfile",O_RDWR|O_CREAT
131、,0644);</p><p> if((cpid=fork())==-1)</p><p><b> {</b></p><p> lseek(fd,0,0);</p><p><b> exit(1);</b></p><p><b> }</b
132、></p><p> else if(cpid>0)</p><p><b> {</b></p><p> lseek(fd,0,0);</p><p> if(lockf(fd,0,0)==-1)</p><p><b> {</b></p&g
133、t;<p> perror("lock failure");</p><p><b> exit(1);</b></p><p><b> }</b></p><p> printf("I am a parent process,my pid is %d\n",
134、getid());</p><p> printf("Please input a string:\n");</p><p> scanf("%s",str);</p><p> lseek(fd,0,0);</p><p> write(fd,str,sizeof(str));</p&g
135、t;<p> lseek(fd,0,0);</p><p> if(lockf(fd,0,0)==-1)</p><p><b> {</b></p><p> perror("unlock failure");</p><p><b> exit(1);</b
136、></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p><b> sleep(1);</b></p><p> lseek(fd,0
137、,0);</p><p> if(lockf(fd,0,0)==-1)</p><p><b> {</b></p><p> perror("lock failure");</p><p><b> exit(1);</b></p><p>&l
138、t;b> }</b></p><p> lseek(fd,0,0);</p><p> read(fd,str,sizeof(str));</p><p> lseek(fd,0,0);</p><p> if(lockf(fd,0,0)==-1)</p><p><b> {&
139、lt;/b></p><p> perror("unlock failure");</p><p><b> exit(1);</b></p><p><b> }</b></p><p> printf("\nI am a parent process,
140、my pid is %d\n",getid());</p><p> printf("Please input a string:\n");</p><p> printf("%s\n",str);</p><p><b> }</b></p><p><b&
141、gt; }</b></p><p><b> }</b></p><p><b> 3、軟中斷通信</b></p><p> 編制一段程序,使其實(shí)現(xiàn)進(jìn)程的軟中斷通信。</p><p> 使用系統(tǒng)調(diào)度fork()創(chuàng)建兩個(gè)子進(jìn)程,再用系統(tǒng)調(diào)用signal()讓父進(jìn)程捕捉鍵盤上來的中
142、斷信號(即按Del鍵);當(dāng)捕捉到中斷信號后,父進(jìn)程用系統(tǒng)調(diào)用kill()向兩個(gè)子進(jìn)程發(fā)出信號,子進(jìn)程捕捉到信號后分別輸出下列信息后中止。</p><p> Child Process 1 is killed by Parent!</p><p> Child Process 2 is killed by Parent!</p><p> #include<
143、;stdio.h></p><p> #include<signal.h></p><p> #include<unistd.h></p><p> void stop();</p><p> int wait_mark;</p><p> void main()</p&g
144、t;<p><b> {</b></p><p> int p1,p2,stdout;</p><p> while(p1=fork()==-1);</p><p><b> if(p1>0)</b></p><p><b> {</b></
145、p><p> while((p2==fork())==-1);</p><p><b> if(p2>0)</b></p><p><b> {</b></p><p> wait_mark=1;</p><p> printf("Input any c
146、har to stop:");</p><p> getchar();</p><p> kill(p1,16);</p><p> kill(p2,17);</p><p><b> wait(0);</b></p><p><b> wait(0);</b&
147、gt;</p><p> printf("Parent process is killed!\n");</p><p><b> exit(0);</b></p><p><b> }</b></p><p><b> else</b></p&
148、gt;<p><b> {</b></p><p> wait_mark=1;</p><p> signal(17,stop);</p><p> while(wait_mark!=0)</p><p><b> {</b></p><p> lo
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 操作系統(tǒng)課程設(shè)計(jì)--進(jìn)程調(diào)度算法
- 操作系統(tǒng)課程設(shè)計(jì)---進(jìn)程調(diào)度算法
- 進(jìn)程調(diào)度算法操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)--進(jìn)程調(diào)度算法
- 進(jìn)程調(diào)度算法操作系統(tǒng)課程設(shè)計(jì) (2)
- 操作系統(tǒng)課程設(shè)計(jì)——進(jìn)程調(diào)度模擬算法
- 操作系統(tǒng)_進(jìn)程調(diào)度算法課程設(shè)計(jì)報(bào)告
- 操作系統(tǒng)課程設(shè)計(jì)——進(jìn)程調(diào)度模擬算法
- 操作系統(tǒng)進(jìn)程調(diào)度課程設(shè)計(jì)
- 操作系統(tǒng)進(jìn)程調(diào)度課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)---多級反饋隊(duì)列進(jìn)程調(diào)度算法
- 操作系統(tǒng)進(jìn)程調(diào)度課程設(shè)計(jì)報(bào)告
- 操作系統(tǒng)課程設(shè)計(jì)-進(jìn)程調(diào)度模擬
- 操作系統(tǒng)課程設(shè)計(jì)---進(jìn)程調(diào)度模擬設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)--進(jìn)程調(diào)度程序設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)---磁盤調(diào)度算法
- 操作系統(tǒng)課程設(shè)計(jì)---進(jìn)程調(diào)度子系統(tǒng)模擬實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計(jì)--磁盤調(diào)度算法實(shí)踐
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告--磁盤調(diào)度算法
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告--磁盤調(diào)度算法
評論
0/150
提交評論