版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p> 操作系統(tǒng)課程設(shè)計報告</p><p> 題 目: 進(jìn)程調(diào)度算法 </p><p> Minix操作系統(tǒng)實踐 </p><p> 姓 名: ********* </p><p> 學(xué) 號:
2、 ********* </p><p> 專 業(yè): 計算機(jī)科學(xué)與技術(shù) </p><p> 指導(dǎo)教師: ***** </p><p><b> 實驗一</b></p><p><b> 1.實驗?zāi)康?lt;/b>
3、;</p><p> 通過優(yōu)先權(quán)法和輪轉(zhuǎn)算法的模擬加深對進(jìn)程概念和進(jìn)程調(diào)度過程的理解,掌握進(jìn)程狀態(tài)之間的切換,同時掌握進(jìn)程調(diào)度算法的實現(xiàn)方法和技巧。</p><p><b> 2.實驗內(nèi)容</b></p><p> 1.用C++語言來實現(xiàn)對n個進(jìn)程采用優(yōu)先權(quán)優(yōu)先算法以及輪轉(zhuǎn)算法的進(jìn)程調(diào)度。</p><p> 2.
4、每個用來標(biāo)識進(jìn)程的進(jìn)程控制塊PCB用結(jié)構(gòu)來描述,包括以下字段:</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時間CPUtime,
5、進(jìn)程每運行一次,累計值等于4。</p><p> ?。?)進(jìn)程總共需要運行時間Alltime,利用隨機(jī)函數(shù)產(chǎn)生。</p><p> (5)進(jìn)程狀態(tài),0-就緒態(tài);1-運行態(tài);2-阻塞態(tài)。</p><p> (6)隊列指針next,用來將多個進(jìn)程控制塊PCB鏈接為隊列。</p><p> 3.優(yōu)先數(shù)改變的原則</p><
6、p> (1)進(jìn)程在就緒隊列中每呆一個時間片,優(yōu)先數(shù)增加1。</p><p> ?。?)進(jìn)程每運行一個時間片,優(yōu)先數(shù)減3。</p><p> 4.在調(diào)度前,系統(tǒng)中擁有的進(jìn)程數(shù)PCB_number由鍵盤輸入,經(jīng)初始化后,所有的進(jìn)程控制塊PCB鏈接成就緒隊列。</p><p> 5.為了清楚地觀察諸進(jìn)程的調(diào)度過程,程序應(yīng)將每個時間片內(nèi)的進(jìn)程的情況顯示出來, &
7、lt;/p><p><b> 3.實驗步驟</b></p><p><b> 進(jìn)程調(diào)度的思想</b></p><p> ?。?)當(dāng)系統(tǒng)空閑(就緒隊列為空)時,系統(tǒng)運行閑逛進(jìn)程,否則運行其他進(jìn)程,發(fā)生變遷1(就緒→運行)。</p><p> ?。?)在運行進(jìn)程(包括閑逛進(jìn)程)的過程中,可能發(fā)生變遷2(
8、運行→阻塞),即將運行進(jìn)程插入到阻塞隊列(閑逛進(jìn)程不能被阻塞),可能有其他新的進(jìn)程創(chuàng)建PCB,還可能喚醒阻塞隊列中的某些進(jìn)程PCB,發(fā)生變遷3(阻塞→就緒),即從阻塞隊列中移出并插入就緒隊列中。</p><p> ?。?)時間片運行結(jié)束后,若進(jìn)程累計占用CPU時間大于等于進(jìn)程需要運行的時間,則進(jìn)程執(zhí)行結(jié)束,釋放其PCB。若進(jìn)程累計占用CPU時間小于進(jìn)程需要運行時間,發(fā)生變遷4(運行→就緒),即將當(dāng)前運行的進(jìn)程插入
9、就緒隊列中。</p><p><b> 程序流程圖</b></p><p> 動態(tài)優(yōu)先權(quán)的進(jìn)程調(diào)度算法模擬流程</p><p> 2.輪轉(zhuǎn)法進(jìn)程調(diào)度算法模擬流程</p><p><b> 程序代碼</b></p><p> /*以下程序在C++環(huán)境調(diào)試通過*/<
10、;/p><p> #define NULL 0</p><p> #include <stdio.h></p><p> #include <stdlib.h></p><p> #include<iostream></p><p> using namespace std
11、;</p><p> /*以下僅列出動態(tài)優(yōu)先權(quán)的進(jìn)程調(diào)度算法模擬*/</p><p> /*進(jìn)程PCB結(jié)構(gòu)*/</p><p> struct Pcb</p><p><b> {</b></p><p> int ID;//進(jìn)程標(biāo)識ID,其中0為閑逛進(jìn)程,用戶進(jìn)程的標(biāo)識數(shù)為1,2,3…
12、</p><p> int priority;//進(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> int CPUtime;//進(jìn)程占用的CPU時間CPUtime,進(jìn)程每運行一次,累計值等于4</p><p> int ALLtime;//進(jìn)程總共需要運行時間Allti
13、me</p><p> int State;//進(jìn)程狀態(tài),0-就緒態(tài);1-運行態(tài);2-阻塞態(tài)。</p><p> struct Pcb *next;//隊列指針next,用來將多個進(jìn)程控制塊PCB鏈接為隊列</p><p><b> };</b></p><p> typedef struct Pcb PCB;&
14、lt;/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&g
15、t;<p> void insert_queue(PCB *queue,PCB *item); /*動態(tài)優(yōu)先權(quán)調(diào)試算法將item插入到隊列中,使得插入后,隊列中按照優(yōu)先級從高到低有序*/</p><p> void insert_queue1(PCB *queue,PCB *item); /*輪轉(zhuǎn)法將item插入到隊列末尾*/</p><p> void pu
16、shback_queue(PCB *queue,PCB *item); /*將item插入到隊列的尾部*/</p><p> void insert(); /*動態(tài)優(yōu)先權(quán)的進(jìn)程調(diào)度算法生成進(jìn)程屬性信息,插入進(jìn)程就緒隊列*/</p><p> void insert1(); /*輪轉(zhuǎn)法的進(jìn)程調(diào)度算法生成進(jìn)程屬性信息,插入進(jìn)程就緒隊列
17、*/</p><p> void run(PCB *pcb); /*運行進(jìn)程,隨機(jī)阻塞進(jìn)程、產(chǎn)生新進(jìn)程,插入就緒隊列,喚醒阻塞進(jìn)程*/</p><p> void run1(PCB *pcb); /*輪轉(zhuǎn)法試運行參數(shù)PCB所指的進(jìn)程*/</p><p> void block(PCB *pcb); /*調(diào)用destroy
18、(),將進(jìn)程插入阻塞隊列*/</p><p> void wakeup(); /*動態(tài)優(yōu)先權(quán)的進(jìn)程調(diào)度算法喚醒進(jìn)程,插入就緒隊列*/</p><p> void wakeup1(); /*輪轉(zhuǎn)法的進(jìn)程調(diào)度算法喚醒進(jìn)程,插入就緒隊列*/</p><p> void proc_priority(); /
19、*優(yōu)先權(quán)調(diào)度算法模擬*/</p><p> void proc_loop(); /*輪轉(zhuǎn)法調(diào)度算法模擬*/</p><p> void update(PCB *pcb); /*更新進(jìn)程信息*/</p><p> PCB *ready_queue,*block_queue,*idleprocess; /*就緒隊列,阻塞隊列及閑逛進(jìn)
20、程指針變量*/</p><p> void main()</p><p><b> {</b></p><p><b> int i=0;</b></p><p><b> while(1)</b></p><p><b> {<
21、;/b></p><p> cout<<("\n Please select a number (1,2,0) ");</p><p> cout<<("\n 1-- priority ");</p><p> cout<<("\n 2-- loop");&l
22、t;/p><p> cout<<("\n 0-- exit\n");</p><p><b> cin>>i;</b></p><p><b> if(i==1)</b></p><p><b> {</b></p>
23、<p> cout<<("\nThis is an example for priority processing:\n");</p><p><b> init();</b></p><p> ::proc_priority();</p><p><b> }</b>&
24、lt;/p><p> else if (i==2)</p><p><b> {</b></p><p> cout<<("\nThis is an example for round robin processing:\n");</p><p><b> init();&l
25、t;/b></p><p> proc_loop();</p><p><b> }</b></p><p> else if(i==0)</p><p><b> exit(1);</b></p><p><b> }</b></
26、p><p><b> }</b></p><p> /*輸出所有PCB的初始值,此函數(shù)用于測試程序*/</p><p> void print_init(PCB *pcb)</p><p><b> {</b></p><p> PCB *temp=pcb->ne
27、xt;</p><p> cout<<("\n ID priority CPUtime ALLtime State\n");</p><p> while(temp!=NULL)</p><p><b> {</b></p><p> cout<
28、;<"\n"<<" "<<temp->ID<<" "<<temp->priority<<" "<<temp->CPUtime<<" "<<temp->ALLt
29、ime;</p><p> if (temp->State==0)</p><p> cout<<(" ready");</p><p> else if (temp->State==1)</p><p> cout<<(" runn
30、ing");</p><p><b> else</b></p><p> cout<<(" blocked");</p><p> temp=temp->next;</p><p><b> }</b></p>
31、<p><b> }</b></p><p> /*輸出進(jìn)程屬性信息*/</p><p> void print(PCB *pcb)</p><p><b> {</b></p><p> PCB *temp;</p><p><b> te
32、mp=pcb;</b></p><p> if (pcb->ID==0) </p><p> cout<<("\n\tThe idle process is running!");</p><p><b> else</b></p><p><b> {
33、</b></p><p> cout<<"\n"<<" "<<temp->ID<<" "<<temp->priority<<" "<<temp->CPUtime<<&
34、quot; "<<temp->ALLtime;</p><p> if (temp->State==0)</p><p> cout<<(" ready");</p><p> else if (temp->State==1)</p><
35、p> cout<<(" running");</p><p><b> else</b></p><p> cout<<(" blocked");</p><p><b> }</b></p>&
36、lt;p><b> }</b></p><p> void insert_queue(PCB *queue,PCB *item)</p><p> {//動態(tài)優(yōu)先權(quán)調(diào)試算法將item插入到隊列中,使得插入后,隊列中按照優(yōu)先級從高到低有序</p><p> PCB *p,*q;</p><p> q=que
37、ue;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->ne
38、xt;</p><p><b> }</b></p><p><b> if(p==0)</b></p><p><b> {//在隊尾插入</b></p><p> item->next=0;</p><p> q->next=i
39、tem;</p><p><b> }</b></p><p><b> else</b></p><p> {//在q之后、p之前插入</p><p> item->next=p;</p><p> q->next=item;</p>&
40、lt;p><b> }</b></p><p><b> }</b></p><p> void insert_queue1(PCB *queue,PCB *item)</p><p> {//輪轉(zhuǎn)法將item插入到隊列末尾</p><p> PCB *p,*q;</p>
41、<p> q=queue;p=q->next;</p><p> item->next=0;</p><p> q->next=item;</p><p><b> }</b></p><p> void pushback_queue(PCB *queue,PCB *item)&
42、lt;/p><p> {//將item插入到隊列的尾部</p><p> PCB *p,*q;</p><p> q=queue;p=q->next;</p><p> while(p!=0 )</p><p><b> {</b></p><p><b&
43、gt; q=p;</b></p><p> p=p->next;</p><p><b> }</b></p><p> item->next=q->next;</p><p> q->next=item;</p><p><b> }&l
44、t;/b></p><p> void sort_queue(PCB *&queue)</p><p> {//對queue中的結(jié)點進(jìn)行排序,按照優(yōu)先級從大到小</p><p> PCB *temp=new PCB;</p><p> temp->next=0;</p><p> whil
45、e(queue->next)</p><p><b> {</b></p><p><b> PCB *p;</b></p><p> p=queue->next;queue->next=p->next;</p><p> ::insert_queue(temp,p)
46、;</p><p><b> }</b></p><p> queue->next=temp->next;</p><p> delete temp;</p><p><b> }</b></p><p> /*動態(tài)優(yōu)先權(quán)的進(jìn)程調(diào)度生成進(jìn)程屬性信息,插入
47、進(jìn)程就緒隊列,顯示進(jìn)程信息*/</p><p> void insert()</p><p><b> {</b></p><p> PCB *newp=0;</p><p> static long id=0;</p><p> newp=new PCB;</p><
48、;p><b> id++;</b></p><p> newp->ID=id;</p><p> newp->State=0;</p><p> newp->CPUtime=0;</p><p> newp->priority=rand()%3+1;</p><
49、p> newp->ALLtime=rand()%3+1;</p><p> newp->next=NULL;</p><p> ::pushback_queue(ready_queue,newp);//將新生成進(jìn)程插入到就緒隊列尾部</p><p> print(newp);</p><p> cout<&l
50、t;("\t建立: Creating -> ready\n");</p><p><b> }</b></p><p> /*輪轉(zhuǎn)法的進(jìn)程調(diào)度生成進(jìn)程屬性信息,插入進(jìn)程就緒隊列,顯示進(jìn)程信息*/</p><p> void insert1()</p><p><b> {<
51、;/b></p><p> PCB *newp=0;</p><p> static long id=0;</p><p> newp=new PCB;</p><p><b> id++;</b></p><p> newp->ID=id;</p><p
52、> newp->State=0;</p><p> newp->CPUtime=0;</p><p> newp->ALLtime=rand()%3+1;</p><p> newp->next=NULL;</p><p> ::pushback_queue(ready_queue,newp);//將新
53、生成進(jìn)程插入到就緒隊列尾部</p><p> print(newp);</p><p> cout<<("\t建立: Creating -> ready\n");</p><p><b> }</b></p><p> /*生成n個進(jìn)程屬性信息,插入進(jìn)程就緒隊列,顯示進(jìn)程信息
54、*/</p><p> void insert(int n)</p><p><b> {</b></p><p> for(int i=1;i<=n;i++)</p><p><b> {</b></p><p><b> insert();<
55、;/b></p><p><b> } </b></p><p><b> }</b></p><p> /*動態(tài)優(yōu)先權(quán)調(diào)度產(chǎn)生idle進(jìn)程,輸入用戶進(jìn)程數(shù)目,調(diào)用insert()*/</p><p> void init()</p><p><b>
56、 {</b></p><p> //為每個隊列設(shè)立頭結(jié)點,便于插入刪除操作</p><p> block_queue=new PCB;</p><p> block_queue->next=0;</p><p> ready_queue=new PCB;</p><p> ready_qu
57、eue->next=0;</p><p> int i,pcb_number=-1;</p><p> idleprocess=NULL; /*設(shè)置閑逛進(jìn)程PCB各字段值*/</p><p> idleprocess=(PCB *)malloc(sizeof(PCB));</p><p> idleproce
58、ss->ID=0;</p><p> idleprocess->State=0;</p><p> idleprocess->CPUtime=0;</p><p> idleprocess->priority=0;</p><p> idleprocess->ALLtime=1;</p>&
59、lt;p> idleprocess->next=NULL;</p><p> //閑逛進(jìn)程放入就緒隊列</p><p> idleprocess->next=ready_queue->next;</p><p> ready_queue->next=idleprocess; </p><p> //也可
60、假定初始時系統(tǒng)中只有一個idle進(jìn)程</p><p> ////輸入初始時進(jìn)程的個數(shù)</p><p> //while (pcb_number<0)</p><p><b> //{</b></p><p> //cout<<("Input the number of the PCB
61、 to be started:");</p><p> //cin>>pcb_number;</p><p><b> //}</b></p><p> //cout<<("\n ID priority CPUtime ALLtime State");
62、</p><p> //for (i=0;i<pcb_number;i++)</p><p> //insert();</p><p> cout<<"就緒隊列初始化成功"<<endl;</p><p> ::print_init(ready_queue);</p>&
63、lt;p> cout<<endl;</p><p><b> }</b></p><p> /*調(diào)用destroy(),將進(jìn)程插入阻塞隊列*/</p><p> void block(PCB *pcb)</p><p> {//將pcb插入到阻塞隊列</p><p>
64、 pcb->State=2; /*將PCB所指進(jìn)程的狀態(tài)設(shè)置為阻塞*/</p><p> pcb->CPUtime-=2; /*設(shè)進(jìn)程執(zhí)行半個時間片單位后被阻塞*/</p><p> /*pcb->next=NULL;*/</p><p> print(pcb);</p><p>
65、; cout<<(" 變遷2:running -> blocked\n");</p><p> //將pcb插入到阻塞隊列</p><p> //按照什么方式插入呢,需要參考喚醒條件</p><p> //因為是隨機(jī)喚醒一個進(jìn)程,所以我們就簡單地把它放置在阻塞隊列的頭部</p><p>
66、 pcb->next=block_queue->next;</p><p> block_queue->next=pcb;</p><p><b> }</b></p><p> void update(PCB *pcb)</p><p> {//就緒隊列中進(jìn)程的優(yōu)先級均增加1</p&g
67、t;<p> PCB *temp=ready_queue->next;</p><p> while(temp && temp->next )</p><p> {//就緒隊列的最后一個是閑逛進(jìn)程</p><p> temp->priority++;</p><p> temp=tem
68、p->next;</p><p><b> }</b></p><p><b> }</b></p><p> /*動態(tài)優(yōu)先權(quán)調(diào)度試運行參數(shù)PCB所指的進(jìn)程*/</p><p> void run(PCB *pcb) </p><p
69、><b> {</b></p><p> //如果pcb是閑逛進(jìn)程,則不做處理,再次放入就緒隊列ready_queue</p><p> if(pcb->ID==0)</p><p><b> {</b></p><p> ::insert_queue(ready_queue,
70、pcb);</p><p> print(pcb);</p><p> cout<<" 變遷1:ready -> running\n";</p><p><b> }</b></p><p><b> else</b></p>&
71、lt;p> {//如果不是閑逛進(jìn)程,則進(jìn)行如下處理</p><p> pcb->State=1;/*設(shè)置該進(jìn)程的狀態(tài)為"運行"*/</p><p> pcb->CPUtime+=4;/*累計該進(jìn)程占用CPU的時間*/</p><p> pcb->priority=pcb->priority-3; /*每運行一
72、個時間片,其優(yōu)先數(shù)減3*/</p><p> if(pcb->priority<1)pcb->priority=1;</p><p> print(pcb);</p><p> printf(" 變遷1:ready -> running\n");</p><p> if (rand
73、()%3==1 ) /*PCB不是閑逛進(jìn)程,滿足條件則阻塞此進(jìn)程*/</p><p><b> {</b></p><p> if(pcb->CPUtime-2<pcb->ALLtime)</p><p> block(pcb);</p><p><b> else</b>
74、;</p><p> {//已經(jīng)執(zhí)行完畢,應(yīng)該銷毀進(jìn)程</p><p> cout<<endl;</p><p> cout<<"\t the process no "<<pcb->ID<<" is completed! 銷毀:running->Destroy&q
75、uot;<<endl;</p><p> delete pcb;</p><p><b> }</b></p><p><b> }</b></p><p><b> else</b></p><p> {//否則看改進(jìn)程是否執(zhí)行完
76、畢,如果執(zhí)行完,則釋放,否則再次放入就緒隊列</p><p> if(pcb->CPUtime>=pcb->ALLtime)</p><p><b> {//釋放</b></p><p> cout<<endl;</p><p> cout<<"\t the p
77、rocess no "<<pcb->ID<<" is completed! 銷毀:running->Destroy"<<endl;</p><p> delete pcb;</p><p><b> }</b></p><p><b> els
78、e</b></p><p> {//再次放入就緒隊列,按照優(yōu)先級有序</p><p> ::insert_queue(ready_queue,pcb);</p><p><b> }</b></p><p><b> }</b></p><p><b
79、> }</b></p><p> update(ready_queue);/*更新就緒隊列進(jìn)程優(yōu)先數(shù)*/</p><p> if (rand()%5==1)</p><p><b> {</b></p><p> insert(3); /*創(chuàng)建3個新進(jìn)程*/</p>&l
80、t;p> ::sort_queue(ready_queue);</p><p><b> }</b></p><p> if (rand()%7==1)</p><p> wakeup(); /*喚醒一個進(jìn)程*/ </p><p> /*返回當(dāng)前進(jìn)程是否被阻塞,
81、1(已阻塞),0(未阻塞)*/</p><p><b> }</b></p><p> /*輪轉(zhuǎn)法試運行參數(shù)PCB所指的進(jìn)程*/</p><p> void run1(PCB *pcb) </p><p><b> {</b></p><
82、p> //如果pcb是閑逛進(jìn)程,則不做處理,再次放入就緒隊列ready_queue</p><p> if(pcb->ID==0)</p><p><b> {</b></p><p> ::insert_queue1(ready_queue,pcb);</p><p> print(pcb);&l
83、t;/p><p> cout<<" 變遷1:ready -> running\n";</p><p><b> }</b></p><p><b> else</b></p><p> {//如果不是閑逛進(jìn)程,則進(jìn)行如下處理</p>
84、<p> pcb->State=1;/*設(shè)置該進(jìn)程的狀態(tài)為"運行"*/</p><p> pcb->CPUtime+=4;/*累計該進(jìn)程占用CPU的時間*/</p><p> //if(pcb->priority<1)pcb->priority=1;</p><p> //print(pcb);
85、</p><p> // printf(" 變遷1:ready -> running\n");</p><p> if (rand()%3==1 ) /*PCB不是閑逛進(jìn)程,滿足條件則阻塞此進(jìn)程*/</p><p><b> {</b></p><p> if(pcb-&g
86、t;CPUtime-2<pcb->ALLtime)</p><p> block(pcb);</p><p><b> else</b></p><p> {//已經(jīng)執(zhí)行完畢,應(yīng)該銷毀進(jìn)程</p><p> cout<<endl;</p><p> cout<
87、;<"\t the process no "<<pcb->ID<<" is completed! 銷毀:running->Destroy"<<endl;</p><p> delete pcb;</p><p><b> }</b></p><
88、p><b> }</b></p><p><b> else</b></p><p> {//否則看改進(jìn)程是否執(zhí)行完畢,如果執(zhí)行完,則釋放,否則再次放入就緒隊列</p><p> if(pcb->CPUtime>=pcb->ALLtime)</p><p><b
89、> {//釋放</b></p><p> cout<<endl;</p><p> cout<<"\t the process no "<<pcb->ID<<" is completed! 銷毀:running->Destroy"<<endl;&l
90、t;/p><p> delete pcb;</p><p><b> }</b></p><p><b> else</b></p><p> {//再次放入就緒隊列</p><p> ::insert_queue1(ready_queue,pcb);</p>
91、;<p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> if (rand()%5==1)</p><p><b> {</b></p><p&
92、gt; insert(3); /*創(chuàng)建3個新進(jìn)程*/</p><p> //::sort_queue(ready_queue);</p><p><b> }</b></p><p> if (rand()%7==1)</p><p> wakeup1(); /*喚醒一
93、個進(jìn)程*/ </p><p> /*返回當(dāng)前進(jìn)程是否被阻塞,1(已阻塞),0(未阻塞)*/</p><p><b> }</b></p><p> /*喚醒,即從阻塞隊列中選擇一個PCB,且插入就緒隊列中*/</p><p> void wakeup()</p><p> {/
94、/隨機(jī)喚醒一個阻塞進(jìn)程</p><p> //這里采取的方法是遍歷阻塞隊列,每訪問一個,就產(chǎn)生一個隨機(jī)數(shù)</p><p> //如果該隨機(jī)數(shù)對20求余恰好是1,則當(dāng)前結(jié)點被喚醒,就要納入就緒隊列</p><p> if(block_queue->next==0)//此時沒有被阻塞的進(jìn)程,無所謂喚醒</p><p><b>
95、; return;</b></p><p> PCB *q,*p;//下面遍歷阻塞隊列,q永遠(yuǎn)指向p的前驅(qū)</p><p> while(true)</p><p><b> {</b></p><p> q=block_queue;</p><p> p=q->ne
96、xt;</p><p> while(p && rand()%20!=1)</p><p><b> {</b></p><p><b> q=p;</b></p><p> p=p->next;</p><p><b> }<
97、/b></p><p><b> if(p!=0)</b></p><p> {//p就是要喚醒的進(jìn)程</p><p> q->next=p->next;</p><p><b> break;</b></p><p><b> }<
98、;/b></p><p><b> }</b></p><p> p->State=0;</p><p> cout<<endl;</p><p> ::print(p);</p><p> cout<<" 變遷3:blocked->r
99、eady"<<endl;</p><p> ::insert_queue(ready_queue,p);</p><p><b> }</b></p><p> void wakeup1()</p><p> {//隨機(jī)喚醒一個阻塞進(jìn)程</p><p> //這里采
100、取的方法是遍歷阻塞隊列,每訪問一個,就產(chǎn)生一個隨機(jī)數(shù)</p><p> //如果該隨機(jī)數(shù)對20求余恰好是1,則當(dāng)前結(jié)點被喚醒,就要納入就緒隊列</p><p> if(block_queue->next==0)//此時沒有被阻塞的進(jìn)程,無所謂喚醒</p><p><b> return;</b></p><p&g
101、t; PCB *q,*p;//下面遍歷阻塞隊列,q永遠(yuǎn)指向p的前驅(qū)</p><p> while(true)</p><p><b> {</b></p><p> q=block_queue;</p><p> p=q->next;</p><p> while(p &
102、& rand()%20!=1)</p><p><b> {</b></p><p><b> q=p;</b></p><p> p=p->next;</p><p><b> }</b></p><p><b> i
103、f(p!=0)</b></p><p> {//p就是要喚醒的進(jìn)程</p><p> q->next=p->next;</p><p><b> break;</b></p><p><b> }</b></p><p><b>
104、}</b></p><p> p->State=0;</p><p> cout<<endl;</p><p> ::print(p);</p><p> cout<<" 變遷3:blocked->ready"<<endl;</p><
105、p> ::insert_queue1(ready_queue,p);</p><p><b> }</b></p><p> /*優(yōu)先權(quán)優(yōu)先調(diào)度算法*/</p><p> void proc_priority()</p><p><b> {</b></p><p
106、> ::sort_queue(ready_queue);//對queue中的結(jié)點進(jìn)行排序,按照優(yōu)先級從大到小</p><p> PCB *temp=0,*running=0; /*running的PCB指針*/</p><p> int times;</p><p> for(times=0;times<10;times++)<
107、/p><p><b> {</b></p><p> //找到優(yōu)先級最高的進(jìn)程,并且從隊列中刪除</p><p> cout<<"本次調(diào)度前:"<<endl;</p><p> ::print_init(ready_queue);</p><p>
108、 running=ready_queue->next; /*running指向就緒隊列隊首PCB*/</p><p> ready_queue->next=running->next;</p><p> cout<<endl;</p><p> cout<<"本次調(diào)度開始"<<en
109、dl;</p><p> ::run(running);</p><p> cout<<"\n本次調(diào)度結(jié)束。"<<endl;</p><p><b> }</b></p><p><b> }</b></p><p> /
110、*輪轉(zhuǎn)法進(jìn)程調(diào)用算法*/</p><p> void proc_loop()</p><p><b> {</b></p><p> PCB *temp=0,*running=0; /*running的PCB指針*/</p><p> int times;</p><p>
111、 for(times=0;times<10;times++)</p><p><b> {</b></p><p> cout<<"本次調(diào)度前:"<<endl;</p><p> ::print_init(ready_queue);</p><p> runnin
112、g=ready_queue->next; /*running指向就緒隊列隊首PCB*/</p><p> ready_queue->next=running->next;</p><p> cout<<endl;</p><p> cout<<"本次調(diào)度開始"<<endl;<
113、/p><p> ::run1(running);</p><p> cout<<"\n本次調(diào)度結(jié)束。"<<endl;</p><p><b> }</b></p><p><b> }</b></p><p> 圖0 輸入實現(xiàn)
114、調(diào)度的方法</p><p> 圖1 輸入1 在動態(tài)優(yōu)先級調(diào)度算法下執(zhí)行</p><p><b> 圖2</b></p><p> 圖3 輸入2 在輪轉(zhuǎn)法調(diào)度算法下執(zhí)行</p><p><b> 圖4</b></p><p> 4.實驗過程中遇到的問題及解決方案<
115、;/p><p> 對進(jìn)程調(diào)度的思想理解不夠深刻,不知道如何實現(xiàn)對進(jìn)程優(yōu)先級的排序,以及進(jìn)程控制塊如何配置信息。在翻閱在大量書箱和同學(xué)的幫助下,解決了用動態(tài)優(yōu)先級在方法實現(xiàn)進(jìn)程調(diào)度模擬算法。在對C++語言的使用尤其是在編寫代碼方面很欠缺,在組織語言時出錯不斷。經(jīng)過自己的多次修改之后,程序才得以運行。在做輪轉(zhuǎn)法實現(xiàn)的過程中,參考動態(tài)優(yōu)先級在方法,便很容易實現(xiàn)。</p><p><b>
116、 5.課程設(shè)計總結(jié)</b></p><p> 通過本次的課程設(shè)計,使我能夠正確運用操作系統(tǒng)課程中所學(xué)的基本理論和知識,加深了對進(jìn)程調(diào)度基本概念的理解,還有讓我感受很深的是對C++語言的應(yīng)用,由于對C++語言在平時運用的不夠,在對C++語言的使用尤其是在編寫代碼方面很欠缺,在組織語言時出錯不斷。在設(shè)計過程中,需要大量的相關(guān)資料,為了本次課程設(shè)計我在網(wǎng)上和圖書館查閱了大量資料,不斷的發(fā)現(xiàn)問題、提出問題
117、、解決問題。在編程和調(diào)試的過程中,經(jīng)常會出現(xiàn)意想不到的問題,并非每個問題都可以從相關(guān)資料中找到解決方法,有些問題是無法預(yù)料到的,這就需要通過自己理性的分析得出問題的解決方案。我還希望我們可以有更多這樣的學(xué)習(xí)機(jī)會,使我們的知識體系變的更加牢固。</p><p><b> 實驗二</b></p><p> 在Windows操作系統(tǒng)上安裝Bochs虛擬機(jī)。配置Bochs
118、虛擬機(jī),并完成Minix操作系統(tǒng)的運行。</p><p><b> 1.實驗?zāi)康?lt;/b></p><p> 閱讀并理解Bochs虛擬機(jī)的基本概念,成功安裝Bochs虛擬機(jī)。閱讀Minix操作系統(tǒng)相關(guān)技術(shù)資料,理解Minix操作系統(tǒng)的安裝過程和Minix操作系統(tǒng)的模塊結(jié)構(gòu),實現(xiàn)Minix操作系統(tǒng)的運行;</p><p><b>
119、2.實驗內(nèi)容</b></p><p> Minix操作系統(tǒng)的安裝、運行及退出</p><p><b> 3.實驗步驟</b></p><p> 步驟一、在http://sourceforge.net地址下載Bochs-2.0.2虛擬機(jī)軟件Bochs-2.0.2.Win32-bin.zip,大小為2.55MB,將其安裝在C:\b
120、ochs-2.0.2目錄下(安裝目錄可以是任意硬盤分區(qū),本處為C盤分區(qū));</p><p> 步驟二、下載Minix操作系統(tǒng)鏡像Minix204.zip,大小為6.84MB,并用WINRAR解壓縮軟件解壓縮鏡像文件,將鏡像文件復(fù)制到C:\bochs-2.0.2\Minix204目錄下;</p><p> 步驟三、配置Minix操作系統(tǒng)的啟動文件C:\bochs-2.0.2\Minix2
121、04\run.bat,配置內(nèi)容如下:</p><p> #設(shè)置BXSHARE環(huán)境變量</p><p> SET BXSHARE=C:\bochs-2.0.2</p><p> #將當(dāng)前目錄換到C:\Bochs-2.0.2\minix204</p><p> cd "C:\Bochs-2.0.2\minix204"&
122、lt;/p><p> #使用當(dāng)前目錄下的minix.bxrc配置文件運行bochs</p><p> ..\bochs -q -f minix.bxrc</p><p> 步驟四、在C:\bochs-2.0.2\Minix204\目錄下配置Minix操作系統(tǒng)硬件配置文件minix.bxrc,配置內(nèi)容如下:</p><p><b>
123、 megs: 40</b></p><p> romimage: file=$BXSHARE/BIOS-bochs-latest, address=0xf0000</p><p> vgaromimage: $BXSHARE/VGABIOS-elpin-2.40</p><p> ata0-master: type=disk, path=mini
124、x.img, cylinders=200, heads=16, spt=32</p><p> log: bochsout.txt</p><p> panic: action=ask</p><p> error: action=report</p><p> info: action=report</p><p
125、> debug: action=ignore</p><p> ips: 1000000</p><p> mouse: enabled=0</p><p> user_shortcut: keys=ctrlaltdel</p><p> boot: disk</p><p> floppya: 1_
126、44=vfloppya.img, status=inserted</p><p> ata0-slave: type=cdrom, path=d:, status=inserted</p><p> 步驟五、在C:\bochs-2.0.2\Minix204\目錄下,雙擊run.bat,運行Minix操作系統(tǒng);</p><p> 如圖3-2所示,在此處選擇使用單
127、機(jī)版的Minix,還是網(wǎng)絡(luò)版的Minix(鍵入=,選擇單機(jī)版Minix;鍵入n,選擇網(wǎng)絡(luò)版Minix)</p><p> 網(wǎng)絡(luò)版與單機(jī)版選擇界面</p><p> Minix操作系統(tǒng)登錄界面</p><p><b> 4.實驗結(jié)果</b></p><p> 4.實驗過程中遇到的問題及解決方案</p>
128、<p> 在安裝Minix和配置Bochs的過程中不知道配置問題,在老師給的參考下成功的配置了Bochs并且運行了Minix。</p><p> 運行Minix的過程中出現(xiàn)的命令不知道如何操作在同學(xué)的幫助下也克服了這一困難,最終實現(xiàn)了Minix的命令的運行,并且的到了運行界面。</p><p><b> 5.課程設(shè)計總結(jié)</b></p>
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 操作系統(tǒng)課程設(shè)計--進(jìn)程調(diào)度算法
- 操作系統(tǒng)課程設(shè)計---進(jìn)程調(diào)度算法
- 進(jìn)程調(diào)度算法操作系統(tǒng)課程設(shè)計
- 操作系統(tǒng)課程設(shè)計--進(jìn)程調(diào)度算法
- 進(jìn)程調(diào)度算法操作系統(tǒng)課程設(shè)計 (2)
- 操作系統(tǒng)課程設(shè)計——進(jìn)程調(diào)度模擬算法
- 操作系統(tǒng)_進(jìn)程調(diào)度算法課程設(shè)計報告
- 操作系統(tǒng)課程設(shè)計——進(jìn)程調(diào)度模擬算法
- 操作系統(tǒng)進(jìn)程調(diào)度課程設(shè)計
- 操作系統(tǒng)進(jìn)程調(diào)度課程設(shè)計
- 操作系統(tǒng)課程設(shè)計---多級反饋隊列進(jìn)程調(diào)度算法
- 操作系統(tǒng)進(jìn)程調(diào)度課程設(shè)計報告
- 操作系統(tǒng)課程設(shè)計-進(jìn)程調(diào)度模擬
- 操作系統(tǒng)課程設(shè)計---進(jìn)程調(diào)度模擬設(shè)計
- 操作系統(tǒng)課程設(shè)計--進(jìn)程調(diào)度程序設(shè)計
- 操作系統(tǒng)課程設(shè)計---磁盤調(diào)度算法
- 操作系統(tǒng)課程設(shè)計---進(jìn)程調(diào)度子系統(tǒng)模擬實現(xiàn)
- 操作系統(tǒng)課程設(shè)計--磁盤調(diào)度算法實踐
- 操作系統(tǒng)課程設(shè)計報告--磁盤調(diào)度算法
- 操作系統(tǒng)課程設(shè)計報告--磁盤調(diào)度算法
評論
0/150
提交評論