版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 學(xué)年論文(課程設(shè)計(jì))</p><p> 題目: 操作系統(tǒng)課程設(shè)計(jì)模擬操作系統(tǒng)</p><p> 2012年 06月 05日</p><p><b> 一:課程設(shè)計(jì)題目</b></p><p> 實(shí)現(xiàn)一個(gè)模擬操作系統(tǒng)。</p><p><b> 二:課程
2、設(shè)計(jì)目的</b></p><p> 通過(guò)模擬操作系統(tǒng)的實(shí)現(xiàn),加深對(duì)操作系統(tǒng)工作原理的理解,進(jìn)一步了解操作系統(tǒng)的實(shí)現(xiàn)方法,并可練習(xí)合作完成系統(tǒng)的團(tuán)隊(duì)精神和提高程序設(shè)計(jì)能力。</p><p><b> 三:小組人數(shù)</b></p><p> 小組內(nèi)有四個(gè)人共同完成實(shí)驗(yàn)。</p><p> 四:編程語(yǔ)言和系
3、統(tǒng)環(huán)境</p><p> 采用的是C++語(yǔ)言,在windows系統(tǒng)環(huán)境下的Microsoft Visual Studio軟件下設(shè)計(jì)的程序語(yǔ)言。</p><p><b> 五:課程設(shè)計(jì)內(nèi)容</b></p><p> 模擬采用多道程序設(shè)計(jì)方法的單用戶操作系統(tǒng),愛(ài)操作系統(tǒng)包括進(jìn)程管理、存儲(chǔ)管理、設(shè)備管理、文件管理和用戶接口4部分。進(jìn)程調(diào)度采用時(shí)
4、間片輪轉(zhuǎn)調(diào)度算法,存儲(chǔ)管理采用可變分區(qū)存儲(chǔ)管理方式,文件系統(tǒng)采用FAT方法。我所設(shè)計(jì)的部分為程序管理部分。</p><p> 七:課程設(shè)計(jì)具體內(nèi)容</p><p><b> 進(jìn)程調(diào)度:</b></p><p><b> 1、任務(wù)分析:</b></p><p> 時(shí)間片輪轉(zhuǎn)的主要思想就是按順序
5、為每一個(gè)進(jìn)程一次只分配一個(gè)時(shí)間片的時(shí)間。算法要完成的功能就是將各個(gè)進(jìn)程按照時(shí)間片輪轉(zhuǎn)運(yùn)行的動(dòng)態(tài)過(guò)程顯示出來(lái)。時(shí)間片輪轉(zhuǎn)算法的主要實(shí)現(xiàn)過(guò)程是首先為每一個(gè)進(jìn)程創(chuàng)建一個(gè)進(jìn)程控制塊,定義數(shù)據(jù)結(jié)構(gòu),說(shuō)明進(jìn)程控制塊所包含的內(nèi)容,有進(jìn)程名、進(jìn)程所需運(yùn)行時(shí)間、已運(yùn)行時(shí)間和進(jìn)程的狀態(tài)以及指針的信息。實(shí)現(xiàn)的過(guò)程即運(yùn)用指針指向某一個(gè)進(jìn)程,判斷當(dāng)前的進(jìn)程是否是就緒狀態(tài)“r”,如果是,則為該進(jìn)程分配一個(gè)時(shí)間片,同時(shí),已運(yùn)行時(shí)間加一且要求運(yùn)行的時(shí)間減一,如此循環(huán)執(zhí)
6、行,當(dāng)某一個(gè)進(jìn)程的所需要運(yùn)行的時(shí)間減少至0時(shí),則將該進(jìn)程的狀態(tài)設(shè)置為“e”。然后,將指針指向下一個(gè)未運(yùn)行完成的進(jìn)程,重復(fù)判斷,直至所有的進(jìn)程都運(yùn)行結(jié)束。</p><p> 進(jìn)程調(diào)度算法采用的是時(shí)間片輪轉(zhuǎn)法。</p><p> 時(shí)間片輪轉(zhuǎn)法就是按一定時(shí)間片(記為q)輪番運(yùn)行各個(gè)進(jìn)程。如果q是一個(gè)定值,則輪轉(zhuǎn)法是一種對(duì)各進(jìn)程機(jī)會(huì)均等的調(diào)度方法。</p><p>
7、輪轉(zhuǎn)法本質(zhì)上是剝奪的,因?yàn)橐惠唭?nèi),每個(gè)進(jìn)程不能獲得比一個(gè)時(shí)間片q更長(zhǎng)的運(yùn)行時(shí)間。正是由于這一特點(diǎn),輪轉(zhuǎn)法特別適用于分時(shí)操作系統(tǒng)。</p><p> 輪轉(zhuǎn)法的關(guān)鍵問(wèn)題是如何確定q的大小。如果時(shí)間片太大以致每個(gè)進(jìn)程的CPU周期都能在一個(gè)時(shí)間片內(nèi)完成,則輪轉(zhuǎn)法實(shí)際上脫化為FCFS。如果q太小以致CPU切換過(guò)于頻繁,則會(huì)增加CPU的額外開(kāi)銷(xiāo),降低了CPU的有效利用率。這是因?yàn)?,每次CPU切換涉及到保存原運(yùn)行進(jìn)程的現(xiàn)場(chǎng)和
8、恢復(fù)新運(yùn)行進(jìn)程的現(xiàn)場(chǎng),這些操作一般需要10ms~100ms的時(shí)間。例如,設(shè)有一個(gè)CPU周期為10單位的進(jìn)程,在q取12,6,1時(shí)的調(diào)度次數(shù)分別為0,1,9。令時(shí)間單位為1ms(1ms=1000ms),1次調(diào)度的開(kāi)銷(xiāo)為100ms,則在q=1時(shí)CPU的額外開(kāi)銷(xiāo)和有效開(kāi)銷(xiāo)之比為1:10,這是不容忽視的。</p><p> 每個(gè)進(jìn)程的狀態(tài)可以是就緒(Wait)、運(yùn)行(Run)或完成(Finish)三種狀態(tài)之一。就緒進(jìn)程
9、獲得CPU后都只能運(yùn)行一個(gè)時(shí)間片,用已占用CPU時(shí)間加1來(lái)表示。</p><p> 如果運(yùn)行一個(gè)時(shí)間片后,進(jìn)程的已占用CPU時(shí)間已達(dá)到所需的運(yùn)行時(shí)間,則撤銷(xiāo)該進(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。每進(jìn)行一次調(diào)度程序都打印一次運(yùn)行進(jìn)程、就緒隊(duì)列以及各個(gè)進(jìn)程的PCB,以便進(jìn)行檢查。重
10、復(fù)以上過(guò)程,直到所有進(jìn)程都完成為止。</p><p><b> 2、概要設(shè)計(jì):</b></p><p> ?。?)所用數(shù)據(jù)結(jié)構(gòu)及符號(hào)說(shuō)明</p><p> typedef struct PCB{</p><p> char name[10]; //進(jìn)程名</p><p> struc
11、t PCB *next; //循環(huán)鏈指針</p><p> int need_time; //要求運(yùn)行時(shí)間</p><p> int worked_time; //已運(yùn)行時(shí)間,初始為0</p><p> char condition; //進(jìn)程狀態(tài),只有“就緒”和“結(jié)束”兩種狀態(tài)</p><p> int flag;
12、 //進(jìn)程結(jié)束標(biāo)志,用于輸出</p><p><b> }PCB;</b></p><p> PCB *front,*rear; //循環(huán)鏈隊(duì)列的頭指針和尾指針 </p><p> int N; //N為進(jìn)程數(shù)</p><p> ?。?)主程序的流程圖:</p><p>
13、?。?)程序說(shuō)明:處理器調(diào)度總是選擇指針指示的進(jìn)程運(yùn)行。由于本實(shí)驗(yàn)是模擬處理器調(diào)度的功能,所以,對(duì)被選中的進(jìn)程并不實(shí)際的啟動(dòng)運(yùn)行,而是執(zhí)行:已運(yùn)行時(shí)間+1來(lái)模擬進(jìn)程的一次運(yùn)行,表示進(jìn)程已經(jīng)運(yùn)行過(guò)一個(gè)單位的時(shí)間。</p><p><b> 3、詳細(xì)設(shè)計(jì)</b></p><p> ?。?)首先每一個(gè)進(jìn)程用一個(gè)進(jìn)程控制塊PCB來(lái)代表。進(jìn)程控制塊的格式為:</p>
14、;<p> 其中,進(jìn)程名——作為進(jìn)程的標(biāo)識(shí),如Q1、Q2等。</p><p> 指針——進(jìn)程按順序排成循環(huán)鏈隊(duì)列,用指針指出下一個(gè)進(jìn)程的進(jìn)程控制塊的首地址,最后一個(gè)進(jìn)程的指針指出第一個(gè)進(jìn)程的進(jìn)程控制塊首地址。</p><p> 要求運(yùn)行時(shí)間——假設(shè)進(jìn)程需要運(yùn)行的單位時(shí)間數(shù)。</p><p> 已運(yùn)行時(shí)間——假設(shè)進(jìn)程已經(jīng)運(yùn)行的單位時(shí)間數(shù),初始值為
15、“0”。</p><p> 狀態(tài)——有兩種狀態(tài),“就緒”和“結(jié)束”,初始狀態(tài)都為“就緒”,用“R”表示。當(dāng)一個(gè)進(jìn)程運(yùn)行結(jié)束后,它的狀態(tài)為“結(jié)束”,用“E”表示。</p><p> ?。?)每次運(yùn)行所設(shè)計(jì)的處理器調(diào)度程序前,為每個(gè)進(jìn)程任意確定它的“要求運(yùn)行時(shí)間”。</p><p> 把五個(gè)進(jìn)程按順序排成循環(huán)鏈隊(duì)列,用指針指出隊(duì)列連接情況。用指針表示輪到運(yùn)行的進(jìn)程,
16、如下圖描述所示: </p><p> ?。?)程序詳細(xì)設(shè)計(jì)步驟:</p><p> a.首先建立PCB的數(shù)據(jù)結(jié)構(gòu),為了便于正確輸出,加上了進(jìn)程結(jié)束標(biāo)志flag。輸入進(jìn)程信息(包括進(jìn)程名和要求運(yùn)行的時(shí)間),并為每個(gè)進(jìn)程創(chuàng)建一個(gè)PCB并初始化形成一個(gè)循環(huán)鏈隊(duì)列,用函數(shù)creatPCB()來(lái)實(shí)現(xiàn)。</p><p> b.建立函數(shù)judge()用來(lái)判斷進(jìn)程全部運(yùn)行結(jié)束標(biāo)
17、志,即當(dāng)所有進(jìn)程的狀態(tài)變?yōu)椤痚’(即完成狀態(tài))后,循環(huán)結(jié)束,表示所有進(jìn)程都已運(yùn)行成功。</p><p> c.建立時(shí)間片輪轉(zhuǎn)算法creatProcess()對(duì)進(jìn)程進(jìn)行輪轉(zhuǎn)運(yùn)行,首先指針s指向第一個(gè)進(jìn)程PCB,即s=front,判斷該進(jìn)程的狀態(tài)是否為’r’(就緒狀態(tài)),即if(s->condition == 'r'),若是則表示此進(jìn)程尚未執(zhí)行結(jié)束,則執(zhí)行s->worked_time++
18、且s->need_time--,if(s->need_time==0),則表示此進(jìn)程已運(yùn)行結(jié)束,將其狀態(tài)置為結(jié)束,即s->condition='e',并根據(jù)狀態(tài)位輸出完成信息,且以后不會(huì)再運(yùn)行此進(jìn)程。將指針指向下個(gè)進(jìn)程,s=s->next,并判斷所有進(jìn)程是否已全部運(yùn)行結(jié)束,沒(méi)有則重復(fù)上面算法。當(dāng)所有進(jìn)程的狀態(tài)位都變成’e’表示所有進(jìn)程運(yùn)行完成,則循環(huán)結(jié)束。</p><p>
19、 d.建立主函數(shù)main(),輸入進(jìn)程數(shù)N,調(diào)用初始化循環(huán)鏈隊(duì)列函數(shù)creatPCB()和時(shí)間片輪轉(zhuǎn)算法creatProcess(N),每次選中進(jìn)程的進(jìn)程名以及運(yùn)行一次后進(jìn)程隊(duì)列的變化,實(shí)現(xiàn)處理器的調(diào)度。</p><p><b> 4、調(diào)試分析:</b></p><p> a.調(diào)試過(guò)程中遇到的問(wèn)題及解決方案</p><p> 開(kāi)始運(yùn)行到
20、Q5運(yùn)行完成后顯示錯(cuò)誤,如下圖所示:</p><p> 原因:經(jīng)檢查程序發(fā)現(xiàn)語(yǔ)句if(s->condition=='e' ){printf("進(jìn)程%s已經(jīng)運(yùn)行完成!\n\n",s->name);}有錯(cuò)誤,因?yàn)楫?dāng)某個(gè)進(jìn)程運(yùn)行完成后,其狀態(tài)標(biāo)志已修改為’e’,所以再次循環(huán)運(yùn)行未完成的進(jìn)程時(shí),當(dāng)運(yùn)行到此句時(shí)仍會(huì)將前面已完成的進(jìn)程重新輸出一遍完成信息,導(dǎo)致輸出錯(cuò)誤。<
21、;/p><p> 解決方案:為每個(gè)進(jìn)程加上一個(gè)結(jié)束標(biāo)志flag,并賦初值為0,當(dāng)進(jìn)程運(yùn)行完成后,將flag改為1,再將后面輸出改為if(s->condition=='e' || s->flag==0 ){printf("進(jìn)程%s已經(jīng)運(yùn)行完成!\n\n",s->name);s->flag==0;},這樣在前面進(jìn)程運(yùn)行完成輸出后,后面再循環(huán)時(shí)就不會(huì)重新輸出一遍
22、了。</p><p> b.改進(jìn)設(shè)想:本實(shí)驗(yàn)較簡(jiǎn)單,但還不夠完善,如未實(shí)現(xiàn)插入進(jìn)程功能,即進(jìn)程在運(yùn)行過(guò)程中可以插入其他的進(jìn)程再運(yùn)行。還有未進(jìn)行進(jìn)程優(yōu)先級(jí)判別,本實(shí)驗(yàn)?zāi)J(rèn)進(jìn)程的優(yōu)先級(jí)按輸入的先后順序從大到小排列的,還有其他功能等,希望在以后的實(shí)驗(yàn)中逐步完善。</p><p><b> 5、測(cè)試結(jié)果:</b></p><p> a.首先輸出五
23、個(gè)進(jìn)程的初始狀態(tài)</p><p> b.開(kāi)始從進(jìn)程Q1開(kāi)始按時(shí)間片輪轉(zhuǎn)運(yùn)行進(jìn)程,Q4先運(yùn)行完成</p><p> c.接著Q1運(yùn)行完成</p><p> d.接著Q5運(yùn)行完成</p><p><b> e.再Q(mào)3運(yùn)行完成</b></p><p> f.最后Q2運(yùn)行完成</p>
24、<p> 時(shí)間片輪轉(zhuǎn)法調(diào)度進(jìn)程代碼:</p><p> #include"stdio.h"</p><p> #include"conio.h"</p><p> #include"malloc.h"</p><p> #include"string
25、.h"</p><p> #define NULL 0</p><p> typedef struct PCB{</p><p> char name[10]; //進(jìn)程名</p><p> struct PCB *next; //鏈指針</p><p> int need_time;
26、//要求運(yùn)行時(shí)間</p><p> int worked_time; //已運(yùn)行時(shí)間</p><p> char condition; //進(jìn)程狀態(tài),只有"就緒"和"結(jié)束"兩種狀態(tài)</p><p> int flag; //進(jìn)程結(jié)束標(biāo)志</p><p><b>
27、}PCB;</b></p><p> PCB *front,*rear; </p><p> int N; //N為進(jìn)程數(shù)</p><p> void creatPCB(){ //為每個(gè)進(jìn)程創(chuàng)建一個(gè)PCB并初始化形成一個(gè)循環(huán)鏈隊(duì)列</p><p> PCB *p,*l;</p><p>
28、; l = (PCB *)malloc(sizeof(PCB));</p><p> printf("請(qǐng)輸入各進(jìn)程名和要求運(yùn)行時(shí)間\n");</p><p> scanf("%s%d",l->name,&l->need_time);</p><p> l->condition = 'r
29、'; //進(jìn)程初始狀態(tài)為就緒</p><p> l->worked_time = 0;</p><p> l->next=NULL;</p><p> l->flag=0;</p><p><b> front=l;</b></p><p> for(int i
30、 = 1;i < N ;i ++){</p><p> p = (PCB *)malloc(sizeof(PCB));</p><p> scanf("%s%d",p->name,&p->need_time);</p><p> p->condition = 'r'; </p>
31、<p> p->worked_time = 0;</p><p> p->flag=0;</p><p> l->next = p;</p><p> l=l->next;</p><p><b> }</b></p><p> rear=l;rear
32、->next=front;</p><p><b> }</b></p><p> void output(){ //進(jìn)程輸出函數(shù)</p><p> printf("進(jìn)程名 已運(yùn)行時(shí)間 需要時(shí)間 狀態(tài)\n");</p><p> for(int j=1;j<=N;j++
33、){ </p><p> printf(" %-4s\t %-4d\t %-4d\t%-c\n",front->name, front->worked_time, front->need_time, front->condition);</p><p> front=front->next;</p>
34、<p><b> }</b></p><p> printf("\n");</p><p><b> }</b></p><p> int judge(PCB *p){ //判斷所有進(jìn)程運(yùn)行結(jié)束</p><p> int flag = 1;</p&
35、gt;<p> for(int i=0;i<N;i++){</p><p> if(p->condition != 'e'){</p><p><b> flag = 0;</b></p><p><b> break;}</b></p><p>
36、 p=p->next;</p><p><b> }</b></p><p> return flag;</p><p><b> }</b></p><p> void creatProcess(int n){ //時(shí)間片輪轉(zhuǎn)算法</p><p> PCB
37、 *s,*p;</p><p> int i,j,flag1=0;</p><p> s = (PCB *)malloc(sizeof(PCB));</p><p><b> s=front;</b></p><p> printf("\n--------------------------------
38、------------\n");</p><p><b> output();</b></p><p> printf("請(qǐng)按任意鍵繼續(xù)\n\n");</p><p> getch(); //按任意鍵繼續(xù)</p><p><b> s=front;</b>
39、</p><p> while(flag1 != 1){</p><p> if(s->condition == 'r'){</p><p> s->worked_time++;</p><p> s->need_time--;</p><p> if(s->need_
40、time==0)</p><p> s->condition='e';</p><p><b> output();</b></p><p> printf("請(qǐng)按任意鍵繼續(xù)\n\n");</p><p><b> getch();</b></
41、p><p><b> }</b></p><p> if(s->condition=='e' && s->flag==0){</p><p> printf("進(jìn)程%s已經(jīng)運(yùn)行完成!\n\n",s->name);</p><p> s->fl
42、ag=1;</p><p><b> }</b></p><p> s=s->next;</p><p> flag1=judge(s);</p><p><b> }</b></p><p> printf("-------------------
43、-------------------------\n");</p><p><b> }</b></p><p> void main(){</p><p> printf("請(qǐng)輸入進(jìn)程總數(shù)\n");</p><p> scanf("%d",&N);&
44、lt;/p><p> creatPCB();</p><p> creatProcess(N);</p><p><b> }</b></p><p><b> 創(chuàng)建進(jìn)程和撤銷(xiāo)進(jìn)程</b></p><p><b> 1、設(shè)計(jì)內(nèi)容</b></p
45、><p> 1、關(guān)于系統(tǒng)用fork()函數(shù)的實(shí)驗(yàn)。 2、使用fork()函數(shù)創(chuàng)建進(jìn)程,實(shí)現(xiàn)父進(jìn)程創(chuàng)建子進(jìn)程和實(shí)現(xiàn)父子進(jìn)程同步。 3、使用系統(tǒng)調(diào)用fork()創(chuàng)建兩個(gè)進(jìn)程。當(dāng)此程序運(yùn)行時(shí),在系統(tǒng)中有一個(gè)父進(jìn)程和兩個(gè)子進(jìn)程活動(dòng)。讓每一個(gè)進(jìn)程在屏幕上顯示一個(gè)字符。如父進(jìn)程顯示’a’,子進(jìn)程分別顯示字符’b’和字符’c’。 4、修改程序,每一個(gè)進(jìn)程循環(huán)顯示一句話,如子進(jìn)程顯示’daughter’及’son’,父
46、進(jìn)程顯示’parent’。 5、用C語(yǔ)言實(shí)現(xiàn)進(jìn)程的創(chuàng)建、撤銷(xiāo)以及簡(jiǎn)單的進(jìn)程管理。</p><p><b> 2、函數(shù)關(guān)系調(diào)用</b></p><p><b> 1、fork( )</b></p><p><b> 創(chuàng)建一個(gè)新進(jìn)程。</b></p><p><b&
47、gt; 系統(tǒng)調(diào)用格式:</b></p><p> pid=fork( ) </p><p><b> 參數(shù)定義:</b></p><p> int fork( ) </p><p> fork( )返回值意義如下:</p><p> 0:在子進(jìn)程中,pid 變量保存的 fo
48、rk( )返回值為 0,表示當(dāng)前進(jìn)程是子進(jìn)程。</p><p> >0:在父進(jìn)程中,pid 變量保存的 fork( )返回值為子進(jìn)程的 id 值(進(jìn)程唯一標(biāo)識(shí)符)。</p><p><b> -1:創(chuàng)建失敗。</b></p><p> 如果 fork( )調(diào)用成功,它向父進(jìn)程返回子進(jìn)程的 PID,并向子進(jìn)程返回 0,即 fork(
49、)被調(diào)用了一次,但返回了兩次。此時(shí) OS 在內(nèi)存中建立一個(gè)新進(jìn)程,所建的新進(jìn)程是調(diào)用 fork( )父進(jìn)程(parent process)的副本,稱為子進(jìn)程(child process)。子進(jìn)程繼承了父進(jìn)程的許多特性,并具有與父進(jìn)程完全相同的用戶級(jí)上下文。父進(jìn)程與子進(jìn)程并發(fā)執(zhí)行。</p><p> 核心為 fork( )完成以下操作:</p><p> (1)為新進(jìn)程分配一進(jìn)程表項(xiàng)和進(jìn)
50、程標(biāo)識(shí)符</p><p> 進(jìn)入 fork( )后,核心檢查系統(tǒng)是否有足夠的資源來(lái)建立一個(gè)新進(jìn)程。若資源不足,則 fork( )系統(tǒng)調(diào)用失敗;否則,核心為新進(jìn)程分配一進(jìn)程表項(xiàng)和唯一的進(jìn)程標(biāo)識(shí)符。</p><p> ?。?)檢查同時(shí)運(yùn)行的進(jìn)程數(shù)目超過(guò)預(yù)先規(guī)定的最大數(shù)目時(shí),fork( )系統(tǒng)調(diào)用失敗。</p><p> ?。?)拷貝進(jìn)程表項(xiàng)中的數(shù)據(jù)</p>
51、<p> 將父進(jìn)程的當(dāng)前目錄和所有已打開(kāi)的數(shù)據(jù)拷貝到子進(jìn)程表項(xiàng)中,并置進(jìn)程的狀態(tài)為“創(chuàng)建”狀態(tài)。</p><p> ?。?)子進(jìn)程繼承父進(jìn)程的所有文件對(duì)父進(jìn)程當(dāng)前目錄和所有已打開(kāi)的文件表項(xiàng)中的引用計(jì)數(shù)加 1。</p><p> ?。?)為子進(jìn)程創(chuàng)建進(jìn)程上、下文進(jìn)程創(chuàng)建結(jié)束,設(shè)子進(jìn)程狀態(tài)為“內(nèi)存中就緒”并返回子進(jìn)程的標(biāo)識(shí)符。</p><p><b
52、> ?。?)子進(jìn)程執(zhí)行</b></p><p> 雖然父進(jìn)程與子進(jìn)程程序完全相同,但每個(gè)進(jìn)程都有自己的程序計(jì)數(shù)器 PC(注子進(jìn)程的 PC 開(kāi)始位置),然后根據(jù) pid 變量保存的 fork( )返回值的不同,執(zhí)行了不同的分支語(yǔ)句。</p><p><b> 例:</b></p><p><b> ….. <
53、;/b></p><p> pid=fork( ); </p><p> if (! pid)</p><p> printf("I'm the child process!\n"); </p><p> else if (pid>0)</p><p> printf(
54、"I'm the parent process! \n"); </p><p><b> else </b></p><p> printf("Fork fail!\n") fork( )調(diào)用前</p><p> fork( )調(diào)用后</p><p><b>
55、; ….. </b></p><p> pid=fork( ); </p><p> if (! pid)</p><p> printf("I'm the child process!\n"); </p><p> else if (pid>0)</p><p>
56、; printf("I'm the parent process!\n "); </p><p><b> else </b></p><p> printf("Fork fail!\n"); </p><p><b> …… ….. </b></p>
57、<p> pid=fork( ); </p><p> if (! pid)</p><p> printf("I'm the child process!\n"); </p><p> else if (pid>0)</p><p> printf("I'm the p
58、arent process!\n "); </p><p><b> else </b></p><p> printf("Fork fail!\n"); </p><p><b> 3、流程圖</b></p><p><b> 創(chuàng)建進(jìn)程代碼:<
59、/b></p><p> #include<iostream> </p><p> #include<cstring> </p><p> #include<algorithm> </p><p> #include<windows.h> </p><p>
60、 using namespace std; </p><p> const int maxpcb=1000; </p><p> const int maxodr=1000; </p><p> const int maxpid=1000; </p><p> bool pid_vis[maxpid]; </p>&l
61、t;p> int cur_pcb=0; </p><p> int Time=0; </p><p> struct pcb_task //進(jìn)程控制塊結(jié)構(gòu)體 </p><p> {int A; //累加器 </p><p> int F; //狀態(tài)寄存器 </p><p> int pc; //程序
62、寄數(shù)器 </p><p> int pid; //進(jìn)程號(hào) </p><p> int ppid; //父進(jìn)程號(hào) </p><p> int priority; //優(yōu)先級(jí)數(shù) </p><p> int runtime; //運(yùn)行時(shí)間 </p><p> int timep; //時(shí)間片 </p>
63、<p> int odr[maxodr];//進(jìn)程需要執(zhí)行的指令 </p><p> char statu[10];//進(jìn)程的狀態(tài) </p><p> void init(); </p><p> }pcb[maxpcb]; </p><p> void pcb_task::init()//所有的屬性要進(jìn)行一次初始化&l
64、t;/p><p><b> {</b></p><p><b> A=pc=0; </b></p><p> priority=rand()%32;//優(yōu)先級(jí)為 0-31 </p><p> do{pid=rand()%maxpid;}while(pid_vis[pid]); </p>
65、;<p> pid_vis[pid]=true; //確保進(jìn)程號(hào)是唯一的 </p><p> memset(odr,-1,sizeof(odr));</p><p> strcpy(statu,"就緒");//初始新建的進(jìn)程狀態(tài)為“就緒” </p><p> runtime=3+rand()%10; </p>
66、<p><b> timep=0; </b></p><p> } bool cmp(pcb_task a,pcb_task b){return a.pid<b.pid;}</p><p> void bulid(int ); //case 1: 創(chuàng)建進(jìn)程 </p><p> void exec() ;//case 2:
67、 執(zhí)行并創(chuàng)建子進(jìn)程 </p><p> void Exit(int ) ;//case 3:進(jìn)程終止(把要終止的進(jìn)程從進(jìn)程序列中去掉) </p><p> void output() ;//case 4: 顯示進(jìn)程序列</p><p> void output()//顯示系統(tǒng)的所有進(jìn)程</p><p><b> { <
68、/b></p><p> cout<<"系統(tǒng)當(dāng)前的進(jìn)程表"<<endl<<endl; </p><p><b> int i; </b></p><p> if(cur_pcb==0) </p><p><b> { </b>&l
69、t;/p><p> cout<<"系統(tǒng)當(dāng)前沒(méi)有進(jìn)程!"<<endl; return ;</p><p><b> } </b></p><p> printf("進(jìn)程號(hào) 優(yōu)先級(jí)數(shù) 進(jìn)程狀態(tài) 累加器 時(shí)間片 需運(yùn)行時(shí)間\n"); </p><p> for
70、 (i = 0; i < cur_pcb; i++)</p><p> if (pid_vis[pcb[i].pid]) </p><p> printf("%d %d %s %d %d %d\n", pcb[i].pid,pcb[i].priority,pcb[i].statu,pcb[i].A, pcb[i].timep,pcb[i].runtime);
71、</p><p> printf("\n"); </p><p><b> } </b></p><p> void bulid(int ppid)//case 1: 創(chuàng)建進(jìn)程 </p><p><b> { </b></p><p> pcb[
72、cur_pcb].init();</p><p> pcb[cur_pcb].ppid=ppid;</p><p> cur_pcb++; cout<<"進(jìn)程創(chuàng)建成功!新進(jìn)程號(hào)是:"<<pcb[cur_pcb-1].pid<<endl<<endl; </p><p> output(); &l
73、t;/p><p><b> } </b></p><p> void Exit(int pid)//進(jìn)程終止(把要終止的進(jìn)程從進(jìn)程序列中去掉) </p><p><b> { </b></p><p><b> int p; </b></p><p>
74、; for(p=0;p<cur_pcb && pcb[p].pid!=pid;p++)</p><p> if(p==cur_pcb) { printf("此進(jìn)程號(hào)不存在!\n"); </p><p><b> return ; </b></p><p><b> } </b&
75、gt;</p><p> pcb[p].pid=maxpid; </p><p> sort(pcb,pcb+cur_pcb,cmp);//按進(jìn)程號(hào)排序 </p><p> cur_pcb--; </p><p> pid_vis[pid]=0; </p><p> printf("進(jìn)程 %d 已被
76、終止\n",pid); </p><p> printf("目前系統(tǒng)進(jìn)程情況:\n"); </p><p> output(); </p><p><b> }</b></p><p><b> 4、運(yùn)行結(jié)果</b></p><p>
77、創(chuàng)建進(jìn)程,隨機(jī)分配進(jìn)程優(yōu)先級(jí)、運(yùn)行時(shí)間:</p><p><b> 進(jìn)程的阻塞和喚醒</b></p><p><b> 1、進(jìn)程阻塞過(guò)程</b></p><p> 正在執(zhí)行的進(jìn)程,當(dāng)發(fā)現(xiàn)上述某事件時(shí),由于無(wú)法繼續(xù)執(zhí)行,于是進(jìn)程便通過(guò)調(diào)用阻塞原語(yǔ)block把自己阻塞。可見(jiàn),進(jìn)程的阻塞是進(jìn)程自身的一種主動(dòng)行為。進(jìn)入blo
78、ck過(guò)程后,由于此時(shí)該進(jìn)程還處于執(zhí)行狀態(tài),所以應(yīng)先立即停止執(zhí)行,把進(jìn)程控制塊中的現(xiàn)行狀態(tài)由“執(zhí)行”改為阻塞,并將PCB插入阻塞隊(duì)列。如果系統(tǒng)中設(shè)置了因不同事件而阻塞的多個(gè)阻塞隊(duì)列,則應(yīng)將本進(jìn)程插入到具有相同事件的阻塞(等待)隊(duì)列。 最后,轉(zhuǎn)調(diào)度程序進(jìn)行重新調(diào)度,將處理機(jī)分配給另一就緒進(jìn)程,并進(jìn)行切換,亦即,保留被阻塞進(jìn)程的處理機(jī)狀態(tài)(在PCB中),再按新進(jìn)程的PCB中的處理機(jī)狀態(tài)設(shè)置CPU的環(huán)境。 </p><p&g
79、t;<b> 2、進(jìn)程喚醒過(guò)程</b></p><p> 當(dāng)被阻塞進(jìn)程所期待的事件出現(xiàn)時(shí),如I/O完成或其所期待的數(shù)據(jù)已經(jīng)到達(dá),則由有關(guān)進(jìn)程(比如,用完并釋放了該I/O設(shè)備的進(jìn)程)調(diào)用喚醒原語(yǔ)wakeup( ),將等待該事件的進(jìn)程喚醒。喚醒原語(yǔ)執(zhí)行的過(guò)程是:首先把被阻塞的進(jìn)程從等待該事件的阻塞隊(duì)列中移出,將其PCB中的現(xiàn)行狀態(tài)由阻塞改為就緒,然后再將該P(yáng)CB插入到就緒隊(duì)列中。</p
80、><p><b> 阻塞進(jìn)程的代碼:</b></p><p> void block() </p><p><b> { </b></p><p> if(empty(s)) </p><p><b> { </b></p><
81、p> if(s->next==NULL) </p><p><b> { </b></p><p> sort(w,s); </p><p> s=s->next; </p><p><b> } </b></p><p><b> e
82、lse </b></p><p><b> { </b></p><p><b> pcb1 p1; </b></p><p><b> p1=s; </b></p><p> s=s->next; </p><p> p1-
83、>next=NULL; </p><p> sort(w,p1); </p><p><b> } </b></p><p><b> } </b></p><p><b> else </b></p><p><b> { &
84、lt;/b></p><p> cout<<"現(xiàn)在就緒隊(duì)列已經(jīng)為空,再?zèng)]有進(jìn)程需要阻塞"<<endl; } </p><p><b> } </b></p><p><b> 喚醒進(jìn)程的代碼:</b></p><p> void wake()
85、 </p><p><b> { </b></p><p> if(empty(w)) </p><p><b> { </b></p><p><b> pcb1 p1; </b></p><p><b> p1=w; </b
86、></p><p> w=w->next; </p><p> p1->next=NULL; </p><p> sort(s,p1); </p><p><b> } </b></p><p><b> else </b></p>
87、<p><b> { </b></p><p> cout<<"阻塞隊(duì)列已經(jīng)為空,沒(méi)有進(jìn)程再需要喚醒"<<endl; } </p><p><b> } </b></p><p><b> 實(shí)驗(yàn)總結(jié)</b></p><p
88、> 本次實(shí)驗(yàn),我的任務(wù)是設(shè)計(jì)一個(gè)模擬單用戶操作系統(tǒng)的進(jìn)程管理模塊,并且進(jìn)程的調(diào)度是使用時(shí)間片輪轉(zhuǎn)法。該系統(tǒng)主要內(nèi)容是進(jìn)程的相關(guān)控制,系統(tǒng)在運(yùn)行過(guò)程中能顯示各進(jìn)程的狀態(tài)及有關(guān)參數(shù)的變化情況,從而觀察諸進(jìn)程的運(yùn)行過(guò)程及系統(tǒng)的管理過(guò)程,我是用C++寫(xiě)的,在我的電腦能夠運(yùn)行通過(guò),雖不能盡善盡美,但也基本能實(shí)現(xiàn)老師的要求。</p><p> 兩個(gè)星期程序設(shè)計(jì)課程,雖然時(shí)間有點(diǎn)短,但我也收獲不少,這次試驗(yàn),加深了我
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 操作系統(tǒng)課程設(shè)計(jì)-- 操作系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)--模擬操作系統(tǒng)的實(shí)現(xiàn)
- 內(nèi)存管理(操作系統(tǒng))操作系統(tǒng)課程設(shè)計(jì)
- 模擬操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)程序設(shè)計(jì)課程設(shè)計(jì)報(bào)告-操作系統(tǒng)模擬實(shí)現(xiàn)
- 操作系統(tǒng)模擬進(jìn)程課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)題目
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告
- 操作系統(tǒng)課程設(shè)計(jì)論文
- 操作系統(tǒng)課程設(shè)計(jì) (4)
- 操作系統(tǒng)課程設(shè)計(jì)1
- 課程設(shè)計(jì)報(bào)告--操作系統(tǒng)
- linux操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告
評(píng)論
0/150
提交評(píng)論