版權(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è)計(jì)報(bào)告</b></p><p> 課程名稱 操作系統(tǒng)課程設(shè)計(jì) </p><p> 設(shè)計(jì)題目 網(wǎng)絡(luò)教學(xué)系統(tǒng) </p><p> 專業(yè)班級(jí) </p><p> 姓 名
2、</p><p> 學(xué) 號(hào) </p><p> 指導(dǎo)教師 </p><p> 起止時(shí)間 2013年1月6日 </p><p><b> 成 績(jī) 評(píng) 定</b></p><p><b>
3、 一、進(jìn)程調(diào)度</b></p><p> 1、設(shè)計(jì)目的: </p><p> 進(jìn)程管理是操作系統(tǒng)中的重要功能,用來(lái)創(chuàng)建進(jìn)程、撤消進(jìn)程、實(shí)現(xiàn)進(jìn)程狀態(tài)轉(zhuǎn)換,它提供了在可運(yùn)行的進(jìn)程之間復(fù)用CPU的方法。在進(jìn)程管理中,進(jìn)程調(diào)度是核心,因?yàn)樵诓捎枚嗟莱绦蛟O(shè)計(jì)的系統(tǒng)中,往往有若干個(gè)進(jìn)程同時(shí)處于就緒狀態(tài),當(dāng)就緒進(jìn)程個(gè)數(shù)大于處理器數(shù)目時(shí),就必須
4、依照某種策略決定哪些進(jìn)程優(yōu)先占用處理器。本實(shí)驗(yàn)?zāi)M在單處理器情況下的進(jìn)程調(diào)度,目的是加深對(duì)進(jìn)程調(diào)度工作的理解,掌握不同調(diào)度算法的優(yōu)缺點(diǎn)。</p><p><b> 2、設(shè)計(jì)題目</b></p><p> 設(shè)計(jì)一個(gè)按多級(jí)隊(duì)列調(diào)度算法實(shí)現(xiàn)處理器調(diào)度的程序。</p><p><b> 設(shè)計(jì)思想</b></p>
5、<p> 設(shè)置多個(gè)就緒隊(duì)列,分別賦予不同的優(yōu)先級(jí),如逐級(jí)降低,隊(duì)列1的優(yōu)先級(jí)最高。每個(gè)隊(duì)列執(zhí)行時(shí)間片的長(zhǎng)度也不同,規(guī)定優(yōu)先級(jí)越低則時(shí)間片越長(zhǎng),如逐級(jí)加倍?! ⌒逻M(jìn)程進(jìn)入內(nèi)存后,先投入隊(duì)列1的末尾,按FCFS算法調(diào)度;若按隊(duì)列1一個(gè)時(shí)間片未能執(zhí)行完,則降低投入到隊(duì)列2的末尾,同樣按FCFS算法調(diào)度;如此下去,降低到最后的隊(duì)列,則按“時(shí)間片輪轉(zhuǎn)”算法調(diào)度直到完成?! H當(dāng)較高優(yōu)先級(jí)的隊(duì)列為空,才調(diào)度較低優(yōu)先級(jí)的隊(duì)列中的進(jìn)程
6、執(zhí)行。如果進(jìn)程執(zhí)行時(shí)有新進(jìn)程進(jìn)入較高優(yōu)先級(jí)的隊(duì)列,則搶先執(zhí)行新進(jìn)程,并把被搶先的進(jìn)程投入原隊(duì)列的末尾。</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 { //就緒隊(duì)列</p><p> int time; //時(shí)間片數(shù)量</p><p> struct pss *head;</p><p> st
9、ruct pss *tail;</p><p><b> };</b></p><p> struct pss { //進(jìn)程</p><p> char name[5];</p><p> int pro_time; //執(zhí)行時(shí)間</p><p> int l_time; // 剩余
10、時(shí)間</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[]) //初始化就緒隊(duì)列,時(shí)間片分別為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)建進(jìn)程</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(" 請(qǐng)輸入進(jìn)程名稱 :");</p><p> scanf("%s",p->
16、name);</p><p> gotoxy(25,8);</p><p> printf("請(qǐng)輸入處理進(jìn)程需要的時(shí)間:");</p><p> scanf("%d",&p->pro_time);</p><p> p->l_time=p->pro_time; //剩余
17、時(shí)間初始化,初始值為需要時(shí)間的值</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、進(jìn)程執(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無(wú)需要處理的進(jì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; //剩余時(shí)間-1?</p><p><b> }</b></p><p> gotoxy(27,15);</p><
35、;p> printf("進(jìn)程%s處理完畢,離開(kāi)隊(duì)列!",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("所有進(jìn)程處理完畢!");</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("所有進(jìn)程處理完畢!");}</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--; //時(shí)間片減1&l
43、t;/p><p><b> }</b></p><p> if(p->l_time==0) //剩余時(shí)間為零</p><p> {gotoxy(27,15);</p><p> printf("進(jìn)程%s處理完畢,離開(kāi)隊(duì)列!",p->name);</p><p>
44、 gotoxy(MN,18);</p><p> printf("[%s %d]",p->name,p->pro_time); //輸出完成進(jìn)程</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)建就緒隊(duì)列</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)建進(jìn)程</p><p> gotoxy(25,12);</p><p> printf("繼續(xù)輸入進(jìn)程?(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"); //消除上一次回車(chē)的內(nèi)容</p&
55、gt;<p><b> }</b></p><p> gotoxy(10,2);</p><p> printf("待處理進(jìn)程: ");</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("一級(jí)隊(duì)列 2:");</p><p> gotoxy(10,7);</p><p> printf("二級(jí)隊(duì)列 4:");</p><p> gotoxy(1
59、0,9);</p><p> printf("三級(jí)隊(duì)列 8:");</p><p> gotoxy(10,11);</p><p> printf("四級(jí)隊(duì)列 16:"); </p><p> gotoxy(8,13);</p><p> printf("┗
60、━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛");</p><p> print(cpu_quene);</p><p> gotoxy(10,15);</p><p> printf("正在處理的進(jìn)程:"); </p><p> process(cpu_quene);</p
61、><p> gotoxy(10,20);</p><p> printf("\n*******************************************************************************");</p><p><b> }</b></p><p>
62、<b> 運(yùn)行結(jié)果:</b></p><p> 重點(diǎn)和難點(diǎn)及其解決方法 </p><p> 多級(jí)反饋隊(duì)列算法的實(shí)現(xiàn)。剛開(kāi)始對(duì)多級(jí)反饋隊(duì)列算法不太了解,是FCFS 、RR、HPF三者結(jié)合而形成的一種進(jìn)程調(diào)度算法。</p><p><b> 二、死鎖 </b>
63、</p><p> 1、設(shè)計(jì)目的: </p><p> 死鎖是進(jìn)程并發(fā)執(zhí)行過(guò)程中可能出現(xiàn)的現(xiàn)象,哲學(xué)家就餐問(wèn)題是描述死鎖的經(jīng)典例子。為了防止死鎖,可以采用資源預(yù)分配法或者資源按序分配法。資源預(yù)分配法是指進(jìn)程在運(yùn)行前一次性地向系統(tǒng)申請(qǐng)它所需要的全部資源,如果系統(tǒng)當(dāng)前不能夠滿足進(jìn)程的全部資源請(qǐng)求,
64、則不分配資源, 此進(jìn)程暫不投入運(yùn)行,如果系統(tǒng)當(dāng)前能夠滿足進(jìn)程的全部資源請(qǐng)求, 則一次性地將所申請(qǐng)的資源全部分配給申請(qǐng)進(jìn)程。資源按序分配法是指事先將所有資源類全排序, 即賦予每一個(gè)資源類一個(gè)唯一的整數(shù),規(guī)定進(jìn)程必需按照資源編號(hào)由小到大的次序申請(qǐng)資源。</p><p><b> 2、設(shè)計(jì)題目: </b></p><p> 模擬有五個(gè)哲學(xué)家的哲學(xué)家進(jìn)餐問(wèn)題。&
65、lt;/p><p><b> 3、設(shè)計(jì)思路</b></p><p> 在什么情況下5 個(gè)哲學(xué)家全部吃不上飯。</p><p> (1) 假如所有的哲學(xué)家都同時(shí)拿起左側(cè)筷子,看到右側(cè)筷子不可用,又都放下左側(cè)筷子,</p><p> 等一會(huì)兒,又同時(shí)拿起左側(cè)筷子,如此這般,永遠(yuǎn)重復(fù)。對(duì)于這種情況,即所有的程序都在<
66、/p><p> 無(wú)限期地運(yùn)行,但是都無(wú)法取得任何進(jìn)展,即出現(xiàn)饑餓,所有哲學(xué)家都吃不上飯。</p><p> (2) 算法:規(guī)定在拿到左側(cè)的筷子后,先檢查右面的筷子是否可用。如果不可用,則先放下左側(cè)筷子,等一段時(shí)間再重復(fù)整個(gè)過(guò)程。當(dāng)出現(xiàn)以下情形,在某一個(gè)瞬間,所有的哲學(xué)家都同時(shí)啟動(dòng)這個(gè)算法,拿起左側(cè)的筷子,而看到右側(cè)筷子不可用,又都放下左側(cè)筷子,等一會(huì)兒,又同時(shí)拿起左側(cè)筷子……如此這樣永遠(yuǎn)重
67、復(fù)下去。對(duì)于這種情況,所有的程序都在運(yùn)行,但卻無(wú)法取得進(jìn)展,即出現(xiàn)饑餓,所有的哲學(xué)家都吃不上飯。</p><p> 一種沒(méi)有人餓死算法.。</p><p> 僅當(dāng)哲學(xué)家的左右兩支筷子都可用時(shí),才允許他拿起筷子進(jìn)餐。</p><p> 利用型信號(hào)量機(jī)制實(shí)現(xiàn):在一個(gè)原語(yǔ)中,將一段代碼同時(shí)需要的多個(gè)臨界資源,要么全部分配給它,要么一個(gè)都不分配,因此不會(huì)出現(xiàn)死鎖的情形
68、。當(dāng)某些資源不夠時(shí)阻塞調(diào)用進(jìn)程;由于等待隊(duì)列的存在,使得對(duì)資源的請(qǐng)求滿足要求,因此不會(huì)出現(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];// 定時(shí)器,確定狀態(tài)變化的時(shí)刻</p>
70、<p> const int SPAN = 91;//定義思考和進(jìn)食的最長(zhǎng)時(shí)間</p><p> void hungry(int i) //模擬當(dāng)i饑餓時(shí),采用的策略。</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è)置吃飯時(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); //喚醒后的操作同思考時(shí)饑餓的操作相同</p><p><b> }</b></p><p> void ate(int i) //模擬吃完后的動(dòng)作</p><p><b> {</b></p><p> stick[(i)%5]=0;
75、 //吃完后放下筷子</p><p> stick[(i+1)%5]=0; //喚醒左右哲學(xué)家的順序可以改成隨機(jī)的,這里僅僅是固定順序</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è)置思考時(shí)間、隨機(jī)</p><p><b> }</b></p>
77、<p> void print_state(int cur_time) //輸出當(dāng)前狀態(tài),參數(shù)為當(dāng)前時(shí)間</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è)置思考時(shí)間</p><p> phstate[i]=Thinking;</p><p><b> }</b></p><p><b> //模擬開(kāi)始</b></p><p> long tim
82、e = 0;//時(shí)鐘</p><p> int eating_event_cnt=0;//進(jìn)食成功事件次數(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++) //檢查哪個(gè)哲學(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];//記錄等待時(shí)間</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> 運(yùn)行結(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、點(diǎn)和難點(diǎn)及其解決方法</p><p> 解決哲學(xué)家饑餓的算法。哲學(xué)家餓了就要嘗試去得到叉子,哲學(xué)家得到相鄰的左右兩把叉子才可以進(jìn)餐,吃完了就要釋放兩把叉子。</p><p> 三 、動(dòng)態(tài)異長(zhǎng)分區(qū)的存儲(chǔ)分配與回收算法 </p><p> 1、設(shè)計(jì)目的: </p><p>
95、 存儲(chǔ)器是計(jì)算機(jī)系統(tǒng)中的關(guān)鍵資源,存儲(chǔ)管理一直是操作系統(tǒng)的最主要功能之一。存儲(chǔ)管理既包括內(nèi)存資源管理,也包括用 于實(shí)現(xiàn)分級(jí)存儲(chǔ)體系的外存資源的管理。通常,內(nèi)存與外存可采用相同或相似的管理技術(shù),如內(nèi)存采用段式存儲(chǔ)管理,則外存也采用段式存儲(chǔ)管理。 通過(guò)本設(shè)計(jì) 理解存儲(chǔ)管理的功能,掌握動(dòng)態(tài)異長(zhǎng)分區(qū)的存儲(chǔ)分配與回收算法。</p><p><b> 2、設(shè)計(jì)題目: </b></p&
96、gt;<p> 模擬動(dòng)態(tài)異長(zhǎng)分區(qū)的分配算法、回收算法和碎片整理算法。</p><p><b> 3、設(shè)計(jì)思路</b></p><p> 設(shè)計(jì)目標(biāo)用C語(yǔ)言或C++語(yǔ)言分別實(shí)現(xiàn)采用首次適應(yīng)算法和最佳適應(yīng)算法的動(dòng)態(tài)分區(qū)分配過(guò)程alloc()和回收過(guò)程free()。其中,空閑分區(qū)通過(guò)空閑分區(qū)鏈表來(lái)管理,在進(jìn)行內(nèi)存分配時(shí),系統(tǒng)優(yōu)先使用空閑區(qū)低端空間。分別用首
97、次適應(yīng)算法和最佳適應(yīng)算法進(jìn)行內(nèi)存塊的分配和回收,同時(shí)顯示內(nèi)存塊分配和回收后空閑內(nèi)存分區(qū)鏈的情況。</p><p> 首次適應(yīng)算法(First-fit):當(dāng)要分配內(nèi)存空間時(shí),就查表,在各空閑區(qū)中查找滿足大小要求的可用塊。只要找到第一個(gè)足以滿足要球的空閑塊就停止查找,并把它分配出去;如果該空閑空間與所需空間大小一樣,則從空閑表中取消該項(xiàng);如果還有剩余,則余下的部分仍留在空閑表中,但應(yīng)修改分區(qū)大小和分區(qū)始址。<
98、/p><p> 最佳適應(yīng)算法(Best-fit):當(dāng)要分配內(nèi)存空間時(shí),就查找空閑表中滿足要求的空閑塊,并使得剩余塊是最小的。然后把它分配出去,若大小恰好合適,則直按分配;若有剩余塊,則仍保留該余下的空閑分區(qū),并修改分區(qū)大小的起始地址。</p><p> 內(nèi)存回收:將釋放作業(yè)所在內(nèi)存塊的狀態(tài)改為空閑狀態(tài),刪除其作業(yè)名,設(shè)置為空。并判斷該空閑塊是否與其他空閑塊相連,若釋放的內(nèi)存空間與空閑塊相連
99、時(shí),則合并為同一個(gè)空閑塊,同時(shí)修改分區(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 //出錯(cuò)</p><p> #define MAX_length 640 //最大內(nèi)存空間為640KB</p><p> typedef int S
101、tatus;</p><p> typedef struct freearea//定義一個(gè)空閑區(qū)說(shuō)明表結(jié)構(gòu)</p><p><b> {</b></p><p> int ID; //分區(qū)號(hào)</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 // 線性表的雙向鏈表存儲(chǔ)結(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é)點(diǎn)</p>&
104、lt;p> DuLinkList block_last; //尾結(jié)點(diǎn)</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();//開(kāi)創(chuàng)空間表</p><p> Status Initblock()//開(kāi)創(chuàng)帶頭結(jié)點(diǎn)的內(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<<"請(qǐng)輸入作業(yè)(分區(qū)號(hào)):"; </p><p><b&
110、gt; cin>>ID;</b></p><p> cout<<"請(qǐng)輸入需要分配的主存大小(單位:KB):"; </p><p> cin>>request;</p><p> if(request<0 ||request==0) </p><p><b&
111、gt; {</b></p><p> cout<<"分配大小不合適,請(qǐng)重試!"<<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è)名及申請(qǐng)量</p><p><b> {</b></p><p> //為申請(qǐng)作業(yè)開(kāi)辟新空間且初始化</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;//沒(méi)有找到空閑塊</p><p><b> else</b></p><p>
132、 {//找到了最佳位置并實(shí)現(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ū) 號(hào):";</p><p
溫馨提示
- 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)課程設(shè)計(jì)模擬操作系統(tǒng)
- 《網(wǎng)絡(luò)操作系統(tǒng)》課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)-- 操作系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
- 內(nèi)存管理(操作系統(tǒng))操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
- uml課程設(shè)計(jì)——網(wǎng)絡(luò)教學(xué)系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)--模擬操作系統(tǒng)的實(shí)現(xiàn)
- 操作系統(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)論