版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 課程設(shè)計報告</b></p><p> 課程名稱 操作系統(tǒng)課程設(shè)計 </p><p> 設(shè)計題目 網(wǎng)絡(luò)教學(xué)系統(tǒng) </p><p> 專業(yè)班級 </p><p> 姓 名
2、</p><p> 學(xué) 號 </p><p> 指導(dǎo)教師 </p><p> 起止時間 2013年1月6日 </p><p><b> 成 績 評 定</b></p><p><b>
3、 一、進程調(diào)度</b></p><p> 1、設(shè)計目的: </p><p> 進程管理是操作系統(tǒng)中的重要功能,用來創(chuàng)建進程、撤消進程、實現(xiàn)進程狀態(tài)轉(zhuǎn)換,它提供了在可運行的進程之間復(fù)用CPU的方法。在進程管理中,進程調(diào)度是核心,因為在采用多道程序設(shè)計的系統(tǒng)中,往往有若干個進程同時處于就緒狀態(tài),當(dāng)就緒進程個數(shù)大于處理器數(shù)目時,就必須
4、依照某種策略決定哪些進程優(yōu)先占用處理器。本實驗?zāi)M在單處理器情況下的進程調(diào)度,目的是加深對進程調(diào)度工作的理解,掌握不同調(diào)度算法的優(yōu)缺點。</p><p><b> 2、設(shè)計題目</b></p><p> 設(shè)計一個按多級隊列調(diào)度算法實現(xiàn)處理器調(diào)度的程序。</p><p><b> 設(shè)計思想</b></p>
5、<p> 設(shè)置多個就緒隊列,分別賦予不同的優(yōu)先級,如逐級降低,隊列1的優(yōu)先級最高。每個隊列執(zhí)行時間片的長度也不同,規(guī)定優(yōu)先級越低則時間片越長,如逐級加倍。 新進程進入內(nèi)存后,先投入隊列1的末尾,按FCFS算法調(diào)度;若按隊列1一個時間片未能執(zhí)行完,則降低投入到隊列2的末尾,同樣按FCFS算法調(diào)度;如此下去,降低到最后的隊列,則按“時間片輪轉(zhuǎn)”算法調(diào)度直到完成?! H當(dāng)較高優(yōu)先級的隊列為空,才調(diào)度較低優(yōu)先級的隊列中的進程
6、執(zhí)行。如果進程執(zhí)行時有新進程進入較高優(yōu)先級的隊列,則搶先執(zhí)行新進程,并把被搶先的進程投入原隊列的末尾。</p><p><b> 源代碼 </b></p><p> #include "stdio.h"</p><p> #include "conio.h"</p><p>
7、 #include "stdlib.h"</p><p> #include "malloc.h"</p><p> #include "time.h"</p><p> #include "windows.h"</p><p> #define nul
8、l 0</p><p> #define N 4</p><p> int MN=18;</p><p> struct cpu { //就緒隊列</p><p> int time; //時間片數(shù)量</p><p> struct pss *head;</p><p> st
9、ruct pss *tail;</p><p><b> };</b></p><p> struct pss { //進程</p><p> char name[5];</p><p> int pro_time; //執(zhí)行時間</p><p> int l_time; // 剩余
10、時間</p><p> struct pss *next;</p><p><b> };</b></p><p> void gotoxy(int x, int y) </p><p><b> { </b></p><p><b> COORD c;
11、</b></p><p> c.X = x - 1; </p><p> c.Y = y - 1; </p><p> SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE), c); </p><p><b> } </b></p&g
12、t;<p> void initial(struct cpu cpu_quene[]) //初始化就緒隊列,時間片分別為2 4 8 16</p><p><b> {</b></p><p> int i,t=2;</p><p> for(i=0;i<4;i++)</p><p> { c
13、pu_quene[i].time=t;</p><p> cpu_quene[i].head=null;</p><p> cpu_quene[i].tail=null;</p><p><b> t=2*t;</b></p><p><b> }</b></p><p&
14、gt;<b> return;</b></p><p><b> }</b></p><p> void creatpcb(struct cpu cpu_quene[]) //創(chuàng)建進程</p><p><b> {</b></p><p> struct pss *
15、 p,*q;</p><p> p=(struct pss *)malloc(sizeof(struct pss));</p><p> gotoxy(25,6);</p><p> printf(" 請輸入進程名稱 :");</p><p> scanf("%s",p->
16、name);</p><p> gotoxy(25,8);</p><p> printf("請輸入處理進程需要的時間:");</p><p> scanf("%d",&p->pro_time);</p><p> p->l_time=p->pro_time; //剩余
17、時間初始化,初始值為需要時間的值</p><p> p->next=null;</p><p> if(cpu_quene[0].head==null)</p><p> {cpu_quene[0].head=p;</p><p> cpu_quene[0].tail=p;}</p><p><b&
18、gt; else</b></p><p> {q=cpu_quene[0].tail;</p><p> cpu_quene[0].tail=p;</p><p> q->next=p;}</p><p><b> }</b></p><p> void osdela
19、y(int n)</p><p> {int a,i,m;</p><p><b> m=500*n;</b></p><p> a=clock();</p><p> for(i=0;;i++){</p><p> if(clock()-a==m)</p><p&g
20、t;<b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p> void print(struct cpu cpu_quene[])</p><p> { struct pss *p;</p>
21、;<p> gotoxy(23,5);</p><p> p=cpu_quene[0].head;</p><p> printf(" ");</p><p> gotoxy(23,5);</p><p>
22、while(p!=null)</p><p> {printf("[%s %d] ",p->name,p->l_time);</p><p> p=p->next;}</p><p> gotoxy(23,7);</p><p> p=cpu_quene[1].head;</p>
23、;<p> printf(" ");</p><p> gotoxy(23,7);</p><p> while(p!=null)</p><p> {printf("[%s %d] ",p->na
24、me,p->l_time);</p><p> p=p->next;}</p><p> gotoxy(23,9);</p><p> p=cpu_quene[2].head;</p><p> printf(" &q
25、uot;);</p><p> gotoxy(23,9);</p><p> while(p!=null)</p><p> {printf("[%s %d] ",p->name,p->l_time);</p><p> p=p->next;}</p><p>
26、gotoxy(23,11);</p><p> p=cpu_quene[3].head;</p><p> printf(" ");</p><p> gotoxy(23,11);</p><p> while(p!=n
27、ull)</p><p> {printf("[%s %d] ",p->name,p->l_time);</p><p> p=p->next;}</p><p><b> }</b></p><p> void nprint(struct pss *p)</p
28、><p> {gotoxy(27,15);</p><p> printf("[%s %d] ",p->name,p->l_time);</p><p><b> }</b></p><p> void process(struct cpu cpu_quene[N]) //
29、進程執(zhí)行函數(shù)</p><p><b> {</b></p><p> struct pss *p,*q,*p1;</p><p> int i=0,j,a,b;</p><p> int flag1=1;</p><p> while(i<4&&cpu_quene[
30、i].head==null){</p><p><b> i++;</b></p><p><b> }</b></p><p><b> if(i==4)</b></p><p> printf("\n無需要處理的進程!");</p>
31、<p><b> else </b></p><p><b> {if(i==3)</b></p><p><b> a=1;</b></p><p><b> else </b></p><p><b> a=2;<
32、/b></p><p> for(;flag1==1;)</p><p> {switch(a)</p><p> {case 1:{if(cpu_quene[i].head!=null)</p><p> {p=cpu_quene[i].head;</p><p> gotoxy(27,15);<
33、;/p><p> printf(" ");</p><p> nprint(p);</p><p> while(p!=null)</p><p><b> {</b></p><
34、p> while(p->l_time!=0)</p><p> {osdelay(1);</p><p> p->l_time=p->l_time-1; //剩余時間-1?</p><p><b> }</b></p><p> gotoxy(27,15);</p><
35、;p> printf("進程%s處理完畢,離開隊列!",p->name);</p><p> cpu_quene[i].head=p->next;</p><p> print(cpu_quene);</p><p> gotoxy(MN,18);</p><p> printf("[
36、%s %d]",p->name,p->pro_time); //輸出執(zhí)行結(jié)果</p><p><b> MN=MN+9;</b></p><p> free(p); //釋放內(nèi)存</p><p> p=cpu_quene[i].head;</p><p><b> }</
37、b></p><p> gotoxy(10,2);</p><p> printf(" ");</p><p> gotoxy(10,2);</p><p>
38、; printf("所有進程處理完畢!");</p><p><b> }</b></p><p><b> else</b></p><p> {gotoxy(10,2);</p><p> printf("
39、 ");</p><p> gotoxy(10,2);</p><p> printf("所有進程處理完畢!");}</p><p><b> flag1=0;</b></p><p&
40、gt;<b> break;</b></p><p><b> }</b></p><p> case 2:{p=cpu_quene[i].head;</p><p> for(;cpu_quene[i].head!=null;)</p><p> { cpu_quene[i].head=
41、p->next;</p><p> p->next=null;</p><p> gotoxy(27,15);</p><p> printf(" ");</p><p> nprint(p);</p
42、><p> b=cpu_quene[i].time;</p><p> while(p->l_time!=0&&b!=0)</p><p> {osdelay(1);</p><p> p->l_time=p->l_time-1;</p><p> b--; //時間片減1&l
43、t;/p><p><b> }</b></p><p> if(p->l_time==0) //剩余時間為零</p><p> {gotoxy(27,15);</p><p> printf("進程%s處理完畢,離開隊列!",p->name);</p><p>
44、 gotoxy(MN,18);</p><p> printf("[%s %d]",p->name,p->pro_time); //輸出完成進程</p><p><b> MN=MN+9;</b></p><p><b> free(p);</b></p><p
45、><b> }</b></p><p><b> else{</b></p><p><b> j=i+1;</b></p><p> if(cpu_quene[j].head!=null) //p=cpu_quene[i].head</p><p> {q=
46、cpu_quene[j].tail;</p><p> cpu_quene[j].tail=p;</p><p> q->next=p;}</p><p><b> else</b></p><p> {cpu_quene[j].head=p;</p><p> cpu_quene
47、[j].tail=p;</p><p> p->next=null;}</p><p><b> }</b></p><p> print(cpu_quene);</p><p> p=cpu_quene[i].head;</p><p><b> }</b>
48、</p><p> cpu_quene[i].tail=null;</p><p><b> i++;</b></p><p><b> if(i==3)</b></p><p><b> a=1;</b></p><p><b>
49、else</b></p><p><b> a=2;</b></p><p><b> break;}</b></p><p><b> }</b></p><p><b> }</b></p><p><
50、;b> }</b></p><p><b> }</b></p><p> void main()</p><p> { int i, j,flag=1,t=2;</p><p><b> char a;</b></p><p> struct
51、pss *p1;</p><p> struct cpu cpu_quene[4];</p><p> initial(cpu_quene); //創(chuàng)建就緒隊列</p><p> for(;flag==1;){</p><p> gotoxy(20,4);</p><p> printf("┏━━
52、━━━━━━━━━━━━━━━━┓");</p><p> for(j=5;j<10;j++)</p><p> {gotoxy(20,j);</p><p> printf("┃ ┃");}</p><p> gotoxy(20
53、,10);</p><p> printf("┗━━━━━━━━━━━━━━━━━━┛");</p><p> creatpcb(cpu_quene); //創(chuàng)建進程</p><p> gotoxy(25,12);</p><p> printf("繼續(xù)輸入進程?(Y/N)");</p&g
54、t;<p> scanf("%s",&a);</p><p> if(a=='n'||a=='N')</p><p><b> {flag=0;}</b></p><p> system("cls"); //消除上一次回車的內(nèi)容</p&
55、gt;<p><b> }</b></p><p> gotoxy(10,2);</p><p> printf("待處理進程: ");</p><p> p1=cpu_quene[0].head;</p><p> while(p1!=null){</p>&l
56、t;p> printf("[%s %d] ",p1->name,p1->pro_time);</p><p> p1=p1->next;</p><p><b> }</b></p><p> for(j=4;j<13;j++)</p><p> {got
57、oxy(8,j);</p><p> printf("┃ ┃");}</p><p> gotoxy(8,4);</p><p> printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━
58、━━━━┓");</p><p> gotoxy(10,5);</p><p> printf("一級隊列 2:");</p><p> gotoxy(10,7);</p><p> printf("二級隊列 4:");</p><p> gotoxy(1
59、0,9);</p><p> printf("三級隊列 8:");</p><p> gotoxy(10,11);</p><p> printf("四級隊列 16:"); </p><p> gotoxy(8,13);</p><p> printf("┗
60、━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛");</p><p> print(cpu_quene);</p><p> gotoxy(10,15);</p><p> printf("正在處理的進程:"); </p><p> process(cpu_quene);</p
61、><p> gotoxy(10,20);</p><p> printf("\n*******************************************************************************");</p><p><b> }</b></p><p>
62、<b> 運行結(jié)果:</b></p><p> 重點和難點及其解決方法 </p><p> 多級反饋隊列算法的實現(xiàn)。剛開始對多級反饋隊列算法不太了解,是FCFS 、RR、HPF三者結(jié)合而形成的一種進程調(diào)度算法。</p><p><b> 二、死鎖 </b>
63、</p><p> 1、設(shè)計目的: </p><p> 死鎖是進程并發(fā)執(zhí)行過程中可能出現(xiàn)的現(xiàn)象,哲學(xué)家就餐問題是描述死鎖的經(jīng)典例子。為了防止死鎖,可以采用資源預(yù)分配法或者資源按序分配法。資源預(yù)分配法是指進程在運行前一次性地向系統(tǒng)申請它所需要的全部資源,如果系統(tǒng)當(dāng)前不能夠滿足進程的全部資源請求,
64、則不分配資源, 此進程暫不投入運行,如果系統(tǒng)當(dāng)前能夠滿足進程的全部資源請求, 則一次性地將所申請的資源全部分配給申請進程。資源按序分配法是指事先將所有資源類全排序, 即賦予每一個資源類一個唯一的整數(shù),規(guī)定進程必需按照資源編號由小到大的次序申請資源。</p><p><b> 2、設(shè)計題目: </b></p><p> 模擬有五個哲學(xué)家的哲學(xué)家進餐問題。&
65、lt;/p><p><b> 3、設(shè)計思路</b></p><p> 在什么情況下5 個哲學(xué)家全部吃不上飯。</p><p> (1) 假如所有的哲學(xué)家都同時拿起左側(cè)筷子,看到右側(cè)筷子不可用,又都放下左側(cè)筷子,</p><p> 等一會兒,又同時拿起左側(cè)筷子,如此這般,永遠(yuǎn)重復(fù)。對于這種情況,即所有的程序都在<
66、/p><p> 無限期地運行,但是都無法取得任何進展,即出現(xiàn)饑餓,所有哲學(xué)家都吃不上飯。</p><p> (2) 算法:規(guī)定在拿到左側(cè)的筷子后,先檢查右面的筷子是否可用。如果不可用,則先放下左側(cè)筷子,等一段時間再重復(fù)整個過程。當(dāng)出現(xiàn)以下情形,在某一個瞬間,所有的哲學(xué)家都同時啟動這個算法,拿起左側(cè)的筷子,而看到右側(cè)筷子不可用,又都放下左側(cè)筷子,等一會兒,又同時拿起左側(cè)筷子……如此這樣永遠(yuǎn)重
67、復(fù)下去。對于這種情況,所有的程序都在運行,但卻無法取得進展,即出現(xiàn)饑餓,所有的哲學(xué)家都吃不上飯。</p><p> 一種沒有人餓死算法.。</p><p> 僅當(dāng)哲學(xué)家的左右兩支筷子都可用時,才允許他拿起筷子進餐。</p><p> 利用型信號量機制實現(xiàn):在一個原語中,將一段代碼同時需要的多個臨界資源,要么全部分配給它,要么一個都不分配,因此不會出現(xiàn)死鎖的情形
68、。當(dāng)某些資源不夠時阻塞調(diào)用進程;由于等待隊列的存在,使得對資源的請求滿足要求,因此不會出現(xiàn)饑餓的情形。</p><p> #include <stdlib.h></p><p> #include <iostream.h></p><p> #include <time.h></p><p> en
69、um PhState{Thinking=0,Waiting,Eating};//枚舉型、哲學(xué)家狀態(tài)</p><p> int stick[5];//筷子狀態(tài),1表示使用,0表示空閑</p><p> PhState phstate[5];//哲學(xué)家狀態(tài)</p><p> int timerforPh[5];// 定時器,確定狀態(tài)變化的時刻</p>
70、<p> const int SPAN = 91;//定義思考和進食的最長時間</p><p> void hungry(int i) //模擬當(dāng)i饑餓時,采用的策略。</p><p><b> {</b></p><p> int left = (i)%5;</p><p> int right
71、= (i+1)%5;</p><p> if(stick[left]==0 && stick[right]==0) //筷子左右空閑</p><p><b> {</b></p><p> stick[left]=stick[right]=1; //使用筷子</p><p> phstate[i]
72、=Eating; </p><p> timerforPh[i]=rand()%SPAN+1;//設(shè)置吃飯時間</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p&g
73、t; phstate[i]=Waiting; //等待</p><p><b> }</b></p><p><b> }</b></p><p> void wakeup(int i)//從等待中喚醒</p><p><b> {</b></p>&l
74、t;p> hungry( i); //喚醒后的操作同思考時饑餓的操作相同</p><p><b> }</b></p><p> void ate(int i) //模擬吃完后的動作</p><p><b> {</b></p><p> stick[(i)%5]=0;
75、 //吃完后放下筷子</p><p> stick[(i+1)%5]=0; //喚醒左右哲學(xué)家的順序可以改成隨機的,這里僅僅是固定順序</p><p> if(phstate[(5+i-1)%5]==Waiting)</p><p> wakeup((5+i-1)%5);</p><p> if(phstate[(i+1)%
76、5]==Waiting)</p><p> wakeup((i+1)%5);</p><p> phstate[i]=Thinking; //喚醒后思考</p><p> timerforPh[i]=rand()%SPAN+1;//設(shè)置思考時間、隨機</p><p><b> }</b></p>
77、<p> void print_state(int cur_time) //輸出當(dāng)前狀態(tài),參數(shù)為當(dāng)前時間</p><p><b> {</b></p><p> char state_ch[]={'0','!','X'};</p><p> cout.width(4);<
78、/p><p> cout<<cur_time<<"ms : ";</p><p> for(int i=0; i<5; i++)</p><p><b> {</b></p><p> cout.width(2);</p><p> cout
79、<<state_ch[phstate[i]]<<' ';</p><p><b> }</b></p><p> cout<<endl;</p><p><b> }</b></p><p> void simulator() //模擬器
80、</p><p><b> {</b></p><p> srand(time(NULL)); //初始化</p><p> for(int i=0; i<5;i++)</p><p><b> {</b></p><p> stick[i]=0;</
81、p><p> timerforPh[i]=rand()%SPAN+1; //設(shè)置思考時間</p><p> phstate[i]=Thinking;</p><p><b> }</b></p><p><b> //模擬開始</b></p><p> long tim
82、e = 0;//時鐘</p><p> int eating_event_cnt=0;//進食成功事件次數(shù)</p><p> while(eating_event_cnt<10)</p><p><b> {</b></p><p><b> time++;</b></p>
83、<p> for(int i=0;i<5;i++) //檢查哪個哲學(xué)家的狀態(tài)需要改變</p><p><b> {</b></p><p> switch(phstate[i])</p><p><b> {</b></p><p> case Waiting:<
84、;/p><p> ++timerforPh[i];//記錄等待時間</p><p><b> break;</b></p><p> case Thinking:</p><p> if(--timerforPh[i]<0)</p><p><b> {</b>&
85、lt;/p><p> hungry(i);</p><p> print_state(time);</p><p><b> }</b></p><p><b> break;</b></p><p><b> default:</b></p
86、><p> if(--timerforPh[i]<0)</p><p><b> {</b></p><p><b> ate(i);</b></p><p> print_state(time);</p><p> eating_event_cnt++;<
87、/p><p><b> }</b></p><p><b> break;</b></p><p><b> };</b></p><p><b> }</b></p><p><b> }</b><
88、;/p><p><b> }</b></p><p> int main(int argc, char* argv[])</p><p><b> {</b></p><p> simulator();</p><p><b> return 0;</b
89、></p><p><b> }</b></p><p><b> 運行結(jié)果:</b></p><p> 23ms : 0 0 X 0 0</p><p> 34ms : 0 ! X 0 0</p><p> 34ms : 0 ! X
90、 0 X</p><p> 37ms : 0 ! X 0 0</p><p> 48ms : 0 ! X ! 0</p><p> 57ms : 0 X 0 X 0</p><p> 72ms : 0 X 0 0 0</p><p> 88ms : ! X 0
91、 0 0</p><p> 123ms : ! X ! 0 0</p><p> 127ms : ! X ! 0 X</p><p> 143ms : ! X ! ! X</p><p> 146ms : ! 0 X ! X</p><p> 163ms : !
92、 ! X ! X</p><p> 182ms : X ! X ! 0</p><p> 216ms : 0 ! X ! 0</p><p> 236ms : 0 X 0 X 0</p><p> 246ms : ! X 0 X 0</p><p> 252ms
93、: ! X ! X 0</p><p> 258ms : ! X ! X !</p><p> 269ms : X 0 ! X !</p><p> 273ms : 0 0 ! X !</p><p> 297ms : 0 0 X 0 X</p><p> 重
94、點和難點及其解決方法</p><p> 解決哲學(xué)家饑餓的算法。哲學(xué)家餓了就要嘗試去得到叉子,哲學(xué)家得到相鄰的左右兩把叉子才可以進餐,吃完了就要釋放兩把叉子。</p><p> 三 、動態(tài)異長分區(qū)的存儲分配與回收算法 </p><p> 1、設(shè)計目的: </p><p>
95、 存儲器是計算機系統(tǒng)中的關(guān)鍵資源,存儲管理一直是操作系統(tǒng)的最主要功能之一。存儲管理既包括內(nèi)存資源管理,也包括用 于實現(xiàn)分級存儲體系的外存資源的管理。通常,內(nèi)存與外存可采用相同或相似的管理技術(shù),如內(nèi)存采用段式存儲管理,則外存也采用段式存儲管理。 通過本設(shè)計 理解存儲管理的功能,掌握動態(tài)異長分區(qū)的存儲分配與回收算法。</p><p><b> 2、設(shè)計題目: </b></p&
96、gt;<p> 模擬動態(tài)異長分區(qū)的分配算法、回收算法和碎片整理算法。</p><p><b> 3、設(shè)計思路</b></p><p> 設(shè)計目標(biāo)用C語言或C++語言分別實現(xiàn)采用首次適應(yīng)算法和最佳適應(yīng)算法的動態(tài)分區(qū)分配過程alloc()和回收過程free()。其中,空閑分區(qū)通過空閑分區(qū)鏈表來管理,在進行內(nèi)存分配時,系統(tǒng)優(yōu)先使用空閑區(qū)低端空間。分別用首
97、次適應(yīng)算法和最佳適應(yīng)算法進行內(nèi)存塊的分配和回收,同時顯示內(nèi)存塊分配和回收后空閑內(nèi)存分區(qū)鏈的情況。</p><p> 首次適應(yīng)算法(First-fit):當(dāng)要分配內(nèi)存空間時,就查表,在各空閑區(qū)中查找滿足大小要求的可用塊。只要找到第一個足以滿足要球的空閑塊就停止查找,并把它分配出去;如果該空閑空間與所需空間大小一樣,則從空閑表中取消該項;如果還有剩余,則余下的部分仍留在空閑表中,但應(yīng)修改分區(qū)大小和分區(qū)始址。<
98、/p><p> 最佳適應(yīng)算法(Best-fit):當(dāng)要分配內(nèi)存空間時,就查找空閑表中滿足要求的空閑塊,并使得剩余塊是最小的。然后把它分配出去,若大小恰好合適,則直按分配;若有剩余塊,則仍保留該余下的空閑分區(qū),并修改分區(qū)大小的起始地址。</p><p> 內(nèi)存回收:將釋放作業(yè)所在內(nèi)存塊的狀態(tài)改為空閑狀態(tài),刪除其作業(yè)名,設(shè)置為空。并判斷該空閑塊是否與其他空閑塊相連,若釋放的內(nèi)存空間與空閑塊相連
99、時,則合并為同一個空閑塊,同時修改分區(qū)大小及起始地址。</p><p><b> 源代碼 </b></p><p> #include<iostream.h></p><p> #include<stdlib.h></p><p> #define Free 0 //空閑狀態(tài)</p
100、><p> #define Busy 1 //已用狀態(tài)</p><p> #define OK 1 //完成</p><p> #define ERROR 0 //出錯</p><p> #define MAX_length 640 //最大內(nèi)存空間為640KB</p><p> typedef int S
101、tatus;</p><p> typedef struct freearea//定義一個空閑區(qū)說明表結(jié)構(gòu)</p><p><b> {</b></p><p> int ID; //分區(qū)號</p><p> long size; //分區(qū)大小</p><p> long add
102、ress; //分區(qū)地址</p><p> int state; //狀態(tài)</p><p> }ElemType;</p><p> typedef struct DuLNode // 線性表的雙向鏈表存儲結(jié)構(gòu)</p><p><b> {</b></p><p> ElemType
103、 data; </p><p> struct DuLNode *prior; //前趨指針</p><p> struct DuLNode *next; //后繼指針</p><p> }DuLNode,*DuLinkList;</p><p> DuLinkList block_first; //頭結(jié)點</p>&
104、lt;p> DuLinkList block_last; //尾結(jié)點</p><p> Status alloc(int);//內(nèi)存分配</p><p> Status free(int); //內(nèi)存回收</p><p> Status First_fit(int,int);//首次適應(yīng)算法</p><p> Status
105、Best_fit(int,int); //最佳適應(yīng)算法</p><p> void show();//查看分配</p><p> Status Initblock();//開創(chuàng)空間表</p><p> Status Initblock()//開創(chuàng)帶頭結(jié)點的內(nèi)存空間鏈表</p><p><b> {</b><
106、/p><p> block_first=(DuLinkList)malloc(sizeof(DuLNode));</p><p> block_last=(DuLinkList)malloc(sizeof(DuLNode));</p><p> block_first->prior=NULL;</p><p> block_firs
107、t->next=block_last;</p><p> block_last->prior=block_first;</p><p> block_last->next=NULL;</p><p> block_last->data.address=0;</p><p> block_last->dat
108、a.size=MAX_length;</p><p> block_last->data.ID=0;</p><p> block_last->data.state=Free;</p><p> return OK;</p><p><b> }</b></p><p> /
109、/分 配 主 存 </p><p> Status alloc(int ch)</p><p><b> {</b></p><p> int ID,request;</p><p> cout<<"請輸入作業(yè)(分區(qū)號):"; </p><p><b&
110、gt; cin>>ID;</b></p><p> cout<<"請輸入需要分配的主存大小(單位:KB):"; </p><p> cin>>request;</p><p> if(request<0 ||request==0) </p><p><b&
111、gt; {</b></p><p> cout<<"分配大小不合適,請重試!"<<endl;</p><p> return ERROR;</p><p><b> }</b></p><p> if(ch==2) //選擇最佳適應(yīng)算法</p>
112、<p><b> {</b></p><p> if(Best_fit(ID,request)==OK) cout<<"分配成功!"<<endl;</p><p> else cout<<"內(nèi)存不足,分配失敗!"<<endl;</p><p&
113、gt; return OK;</p><p><b> }</b></p><p> else //默認(rèn)首次適應(yīng)算法</p><p><b> {</b></p><p> if(First_fit(ID,request)==OK) cout<<"分配成功!"
114、;<<endl;</p><p> else cout<<"內(nèi)存不足,分配失??!"<<endl;</p><p> return OK;</p><p><b> }</b></p><p><b> }</b></p>
115、<p> // 首次適應(yīng)算法 </p><p> Status First_fit(int ID,int request)//傳入作業(yè)名及申請量</p><p><b> {</b></p><p> //為申請作業(yè)開辟新空間且初始化</p><p> DuLinkList temp=(DuLinkL
116、ist)malloc(sizeof(DuLNode)); </p><p> temp->data.ID=ID; </p><p> temp->data.size=request;</p><p> temp->data.state=Busy;</p><p> DuLNode *p=block_first->
117、;next;</p><p><b> while(p)</b></p><p><b> {</b></p><p> if(p->data.state==Free && p->data.size==request)</p><p> {//有大小恰好合適的空閑
118、塊</p><p> p->data.state=Busy;</p><p> p->data.ID=ID;</p><p> return OK;</p><p><b> break;</b></p><p><b> }</b></p>
119、<p> if(p->data.state==Free && p->data.size>request)</p><p> {//有空閑塊能滿足需求且有剩余"</p><p> temp->prior=p->prior;</p><p> temp->next=p; <
120、;/p><p> temp->data.address=p->data.address;</p><p> p->prior->next=temp; </p><p> p->prior=temp;</p><p> p->data.address=temp->data.address+temp-
121、>data.size;</p><p> p->data.size-=request;</p><p> return OK;</p><p><b> break;</b></p><p><b> }</b></p><p> p=p->nex
122、t;</p><p><b> }</b></p><p> return ERROR;</p><p><b> }</b></p><p> //最佳適應(yīng)算法 </p><p> Status Best_fit(int ID,int request)</
123、p><p><b> {</b></p><p> int ch; //記錄最小剩余空間</p><p> DuLinkList temp=(DuLinkList)malloc(sizeof(DuLNode)); </p><p> temp->data.ID=ID; </p><p>
124、 temp->data.size=request;</p><p> temp->data.state=Busy;</p><p> DuLNode *p=block_first->next;</p><p> DuLNode *q=NULL; //記錄最佳插入位置</p><p> while(p) //初始化最
125、小空間和最佳位置</p><p><b> {</b></p><p> if(p->data.state==Free &&</p><p> (p->data.size>request || p->data.size==request) )</p><p><b>
126、; {</b></p><p><b> q=p;</b></p><p> ch=p->data.size-request;</p><p><b> break;</b></p><p><b> }</b></p><p&g
127、t; p=p->next;</p><p><b> }</b></p><p><b> while(p)</b></p><p><b> {</b></p><p> if(p->data.state==Free && p->d
128、ata.size==request)</p><p> {//空閑塊大小恰好合適</p><p> p->data.ID=ID;</p><p> p->data.state=Busy;</p><p> return OK;</p><p><b> break;</b>&
129、lt;/p><p><b> }</b></p><p> if(p->data.state==Free && p->data.size>request)</p><p> {//空閑塊大于分配需求</p><p> if(p->data.size-request<ch)
130、//剩余空間比初值還小</p><p><b> {</b></p><p> ch=p->data.size-request;//更新剩余最小值</p><p> q=p;//更新最佳位置指向</p><p><b> }</b></p><p><b&
131、gt; }</b></p><p> p=p->next;</p><p><b> }</b></p><p> if(q==NULL) return ERROR;//沒有找到空閑塊</p><p><b> else</b></p><p>
132、 {//找到了最佳位置并實現(xiàn)分配</p><p> temp->prior=q->prior;</p><p> temp->next=q;</p><p> temp->data.address=q->data.address;</p><p> q->prior->next=temp;&l
133、t;/p><p> q->prior=temp;</p><p> q->data.address+=request;</p><p> q->data.size=ch;</p><p> return OK;</p><p><b> }</b></p>&
134、lt;p><b> }</b></p><p> // 主 存 回 收 </p><p> Status free(int ID)</p><p><b> {</b></p><p> DuLNode *p=block_first;</p><p>&l
135、t;b> while(p)</b></p><p><b> {</b></p><p> if(p->data.ID==ID)</p><p><b> {</b></p><p> p->data.state=Free;</p><p&
136、gt; p->data.ID=Free;</p><p> if(p->prior->data.state==Free)//與前面的空閑塊相連</p><p><b> {</b></p><p> p->prior->data.size+=p->data.size;</p><p
137、> p->prior->next=p->next;</p><p> p->next->prior=p->prior;</p><p><b> }</b></p><p> if(p->next->data.state==Free)//與后面的空閑塊相連</p>&l
138、t;p><b> {</b></p><p> p->data.size+=p->next->data.size;</p><p> p->next->next->prior=p;</p><p> p->next=p->next->next; <
139、;/p><p><b> }</b></p><p><b> break; </b></p><p><b> }</b></p><p> p=p->next;</p><p><b> }</b></p&g
140、t;<p> return OK;</p><p><b> }</b></p><p> // 顯示主存分配情況 </p><p> void show()</p><p><b> {</b></p><p> cout<<"
141、;+++++++++++++++++++++++++++++++++++++++\n";</p><p> cout<<"+++ 主 存 分 配 情 況 +++\n";</p><p> cout<<"+++++++++++++++++++++++++++++++++++++++\n"
142、;</p><p> DuLNode *p=block_first->next;</p><p><b> while(p)</b></p><p><b> {</b></p><p> cout<<"分 區(qū) 號:";</p><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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 操作系統(tǒng)課程設(shè)計——操作系統(tǒng)課程設(shè)計模擬操作系統(tǒng)
- 《網(wǎng)絡(luò)操作系統(tǒng)》課程設(shè)計
- 操作系統(tǒng)課程設(shè)計-- 操作系統(tǒng)
- 操作系統(tǒng)課程設(shè)計
- 操作系統(tǒng)課程設(shè)計
- 內(nèi)存管理(操作系統(tǒng))操作系統(tǒng)課程設(shè)計
- 操作系統(tǒng)課程設(shè)計
- 操作系統(tǒng)課程設(shè)計
- 操作系統(tǒng)課程設(shè)計
- 操作系統(tǒng)課程設(shè)計
- uml課程設(shè)計——網(wǎng)絡(luò)教學(xué)系統(tǒng)
- 操作系統(tǒng)課程設(shè)計--模擬操作系統(tǒng)的實現(xiàn)
- 操作系統(tǒng)課程設(shè)計題目
- 操作系統(tǒng)課程設(shè)計報告
- 操作系統(tǒng)課程設(shè)計論文
- 操作系統(tǒng)課程設(shè)計 (4)
- 操作系統(tǒng)課程設(shè)計1
- 課程設(shè)計報告--操作系統(tǒng)
- linux操作系統(tǒng)課程設(shè)計
- 操作系統(tǒng)課程設(shè)計報告
評論
0/150
提交評論