版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 課程設(shè)計報告</b></p><p> 設(shè)計題目:內(nèi)存的連續(xù)分配算法</p><p><b> 班級 : </b></p><p><b> 學(xué)號: </b></p><p><b> 姓名:</b&g
2、t;</p><p><b> 指導(dǎo)老師:</b></p><p> 設(shè)計時間:2012年8月</p><p><b> 摘要</b></p><p><b> 主要算法包括:</b></p><p> 固定分區(qū)分配、動態(tài)分區(qū)分配、伙
3、伴算法、可重定位分區(qū)分配。</p><p><b> 2、內(nèi)容要求:</b></p><p> 1)定義與算法相關(guān)的數(shù)據(jù)結(jié)構(gòu),如PCB,空閑分區(qū)表;</p><p> 2)至少實現(xiàn)兩種以上分配算法,且用戶可以選擇在某次執(zhí)行過程中使用何種算法;</p><p> 3)在使用動態(tài)分區(qū)分配或可重定位分區(qū)分配算法時必須實
4、現(xiàn)緊湊和對換功能;</p><p> 4)動態(tài)分區(qū)分配和可重定位分區(qū)分配必選一個實現(xiàn)。</p><p> 本系統(tǒng)模擬了操作系統(tǒng)內(nèi)存分配算法的實現(xiàn),實現(xiàn)了固定分區(qū)分配和動態(tài)分區(qū)分配,以及可重定位分區(qū)分配算法,采用PCB定義結(jié)構(gòu)體來表示一個進程,定義了進程的名稱和大小,進程內(nèi)存起始地址和進程狀態(tài)。內(nèi)存分區(qū)表采用單鏈表來模擬實現(xiàn)。</p><p> 關(guān)鍵詞:固定分區(qū)
5、分配、動態(tài)分區(qū)分配、可重定位分區(qū)分配。</p><p><b> 目錄</b></p><p> 1. 概述 ……………………….4</p><p> 2. 課程設(shè)計任務(wù)及要求</p><p> 2.1 設(shè)計任務(wù) ………………………..4</p><p>
6、; 2.2 設(shè)計要求 ………………………..4</p><p> 3. 算法及數(shù)據(jù)結(jié)構(gòu)</p><p> 3.1算法的總體思想(流程)………………………5</p><p> 3.2 PCB模塊</p><p> 3.2.1 功能(運算)……………………….5</p><p&
7、gt; 3.2.2 數(shù)據(jù)結(jié)構(gòu)(存儲結(jié)構(gòu))……………………….5</p><p> 3.2.3 算法(實現(xiàn))……………………….5</p><p> 3.3 進程隊列模塊</p><p> 3.3.1功能………………………6</p><p> 3.3.2 數(shù)據(jù)結(jié)構(gòu)………………………6</p>
8、;<p> 3.3.3算法………………………6</p><p> 4. 程序設(shè)計與實現(xiàn)</p><p> 4.1 程序流程圖……………………..7</p><p> 4.2 程序說明(代碼)</p><p> 4.3 實驗結(jié)果……………………..9</p>
9、<p> 5. 結(jié)論……………………..10</p><p> 6. 參考文獻?!?.10</p><p> 7. 收獲、體會和建議?!?.10</p><p><b> 一:概述</b></p><p> 本系統(tǒng)模擬了操作
10、系統(tǒng)內(nèi)存分配算法的實現(xiàn),實現(xiàn)了固定分區(qū)分配和動態(tài)分區(qū)分配,以及可重定位分區(qū)分配算法,采用PCB定義結(jié)構(gòu)體來表示一個進程,定義了進程的名稱和大小,進程內(nèi)存起始地址和進程狀態(tài)。內(nèi)存分區(qū)表采用單鏈表來模擬實現(xiàn)。</p><p> 固定分區(qū)實現(xiàn)就是將單鏈表的每個節(jié)點的大小設(shè)為固定大小,系統(tǒng)默認(rèn)如果按固定分區(qū)分配的話,只能分成20個相等大小的分區(qū),因此系統(tǒng)只能最多運行20個進程。</p><p>
11、 動態(tài)分區(qū)的實現(xiàn)是根據(jù)進程所申請的內(nèi)存大小來決定動態(tài)的有系統(tǒng)進行分配內(nèi)存空間大小,因此分區(qū)表里的空閑分區(qū)個數(shù)是不定的,根據(jù)進程數(shù)和進程大小決定的。</p><p> 可重定位分區(qū)算法比動態(tài)分區(qū)算法增加了緊湊和進程對換的功能。</p><p> 二:課程設(shè)計任務(wù)及要求</p><p><b> 設(shè)計任務(wù):</b></p>&
12、lt;p> 使用C++ MFC實現(xiàn)模擬操作系統(tǒng)內(nèi)存分配算法的實現(xiàn),定義結(jié)構(gòu)體數(shù)據(jù)結(jié)構(gòu)表示進程,定義單鏈表表示內(nèi)存分區(qū)表。</p><p><b> 設(shè)計要求:</b></p><p> 定義與算法相關(guān)的數(shù)據(jù)結(jié)構(gòu),如PCB,空閑分區(qū)表;</p><p> 至少實現(xiàn)兩種以上分配算法,且用戶可以選擇在某次執(zhí)行過程中使用何種算法;<
13、/p><p> 在使用動態(tài)分區(qū)分配或可重定位分區(qū)分配算法時必須實現(xiàn)緊湊和對換功能;</p><p> 動態(tài)分區(qū)分配和可重定位分區(qū)分配必選一個實現(xiàn)。</p><p><b> 三:算法及數(shù)據(jù)結(jié)構(gòu)</b></p><p> #define free 0//表示進程狀態(tài)空閑</p><p>
14、 #define busy 1//表示進程狀態(tài)忙</p><p> typedef int Status;//表示進程狀態(tài)</p><p> struct PCB//表示進程PCB結(jié)構(gòu)體</p><p><b> {</b></p><p> CString name;//進程name&l
15、t;/p><p> Status status;//進程狀態(tài)busy or free</p><p> int lStartAddres;//進程起始地址</p><p> int Size;//進程大小</p><p><b> };</b></p><p> st
16、ruct Node//表示組成鏈表的結(jié)點結(jié)構(gòu)體</p><p><b> {</b></p><p><b> PCB data;</b></p><p> Node *next;</p><p><b> };</b></p><p>
17、; class Queue//表示分區(qū)表的單鏈表類</p><p><b> {</b></p><p><b> public:</b></p><p><b> Queue();</b></p><p> ~Queue(){}</p>&
18、lt;p> //void Show();//內(nèi)存區(qū)分配情況顯示</p><p> int GetLength();</p><p> int GetAllFree();//獲得所有空閑分區(qū)總大小</p><p> void InitialMemory(int );//初始化內(nèi)存區(qū)域大小</p>&
19、lt;p> void FixedPartitonAlloc();//固定分區(qū)分配初始化空閑內(nèi)存鏈表</p><p> bool AllocProFixed(CString ,int );//為進程分配內(nèi)存(執(zhí)行固定分區(qū)分配算法)</p><p> bool AllocProDynamic(CString ,int );//為進程分配內(nèi)存(動態(tài)分區(qū)分配)<
20、;/p><p> boolFreeMemory(CString );//釋放進程內(nèi)存</p><p> bool AllMerge(int );//內(nèi)存緊湊分區(qū)算法</p><p> bool Swaping(int ,PCB&);//進程對換算法</p><p> Node *GetFirst
21、();//返回頭結(jié)點</p><p> void Clear();//鏈表節(jié)點清除</p><p><b> private:</b></p><p> Node *first;</p><p><b> };</b></p><p&g
22、t; #include "StdAfx.h"</p><p> #include "Queue.h"</p><p> Queue::Queue()</p><p><b> {</b></p><p><b> //默認(rèn)頭結(jié)點數(shù)據(jù)</b></
23、p><p> first = new Node;</p><p> first->data.lStartAddres=0;</p><p> first->data.name="";</p><p> first->data.Size=0;</p><p> first-&g
24、t;data.status=busy;</p><p> first->next=NULL;</p><p><b> }</b></p><p> int Queue::GetLength()</p><p><b> {</b></p><p><b&
25、gt; int n=0;</b></p><p> Node *p=first;</p><p> while(p->next)</p><p><b> {</b></p><p> p=p->next;</p><p><b> n++;</
26、b></p><p><b> }</b></p><p><b> return n;</b></p><p><b> }</b></p><p> Node *Queue::GetFirst()</p><p><b>
27、{</b></p><p> return first;</p><p><b> }</b></p><p> int Queue::GetAllFree()</p><p><b> {</b></p><p><b> int n=0;&
28、lt;/b></p><p> Node *p=first;</p><p> while(p->next)</p><p><b> {</b></p><p> p=p->next;</p><p> if (p->data.status==free)<
29、/p><p><b> {</b></p><p> n+=p->data.Size;</p><p><b> }</b></p><p><b> }</b></p><p><b> return n;</b>&l
30、t;/p><p><b> }</b></p><p> //void Queue::Show()</p><p><b> //{</b></p><p> //Node *p=first;</p><p> //while(p->next)</p&g
31、t;<p><b> //{</b></p><p> //p=p->next;</p><p> //cout<<"分區(qū)號:"<<p->data.name<<endl;</p><p> //cout<<"分區(qū)狀態(tài):&
32、quot;<<(p->data.status==busy ?"busy":"free")<<endl;</p><p> //cout<<"分區(qū)起始地址:"<<p->data.lStartAddres<<endl;</p><p> //cout&
33、lt;<"分區(qū)大小:"<<p->data.Size<<endl;</p><p> //cout<<"--------------------------------\n";</p><p><b> //}</b></p><p><b&g
34、t; //}</b></p><p> void Queue::InitialMemory(int i)</p><p><b> {</b></p><p><b> PCB tmp;</b></p><p> tmp.name="";</p>
35、<p> tmp.status=free;</p><p> tmp.lStartAddres=0;</p><p> tmp.Size=i;</p><p> Node *s=new Node;</p><p> s->data=tmp;</p><p> first->next
36、=s;</p><p> s->next=NULL;</p><p><b> }</b></p><p> void Queue::Clear()</p><p><b> {</b></p><p><b> Node *q;</b>
37、</p><p> Node *p=first->next;</p><p> while(p->next)</p><p><b> {</b></p><p><b> q=p;</b></p><p> p=p->next;</p>
38、;<p><b> delete q;</b></p><p><b> }</b></p><p><b> }</b></p><p> void Queue::FixedPartitonAlloc()</p><p><b> {<
39、/b></p><p><b> PCB tmp;</b></p><p> int AllSize=first->next->data.Size;</p><p> int perSize=AllSize/20;</p><p> first->next->data.Size=pe
40、rSize;</p><p> Node *p= first;</p><p> for (int i=1;i<20;i++)</p><p><b> {</b></p><p> while(p->next)</p><p><b> {</b>&l
41、t;/p><p> p=p->next;</p><p><b> }</b></p><p> tmp.name="";</p><p> tmp.status=free;</p><p> tmp.lStartAddres=i*perSize+1;</p&
42、gt;<p> tmp.Size=perSize;</p><p> Node *s= new Node;</p><p> s->data=tmp;</p><p> p->next=s;</p><p> s->next=NULL;</p><p><b> }
43、</b></p><p><b> }</b></p><p> bool Queue::AllocProFixed(CString _name,int _size)</p><p><b> {</b></p><p><b> PCB tmp;</b>&
44、lt;/p><p> Node *p= first;</p><p> while(p->next)</p><p><b> {</b></p><p> p=p->next;</p><p> if (p->data.Size>=_size&&p-
45、>data.status==free)</p><p><b> {</b></p><p> p->data.name=_name;</p><p> p->data.status=busy;</p><p> return true;</p><p><b>
46、; }</b></p><p><b> }</b></p><p> return false;</p><p><b> }</b></p><p> void Queue::SortList()</p><p><b> {</b
47、></p><p> Node *p=NULL;</p><p> Node *q=NULL;</p><p> for(p=first->next;p->next;p=p->next)</p><p> for (q=p->next;q;q=q->next)</p><p>
48、;<b> {</b></p><p> if (p->data.Size>q->data.Size)</p><p><b> {</b></p><p><b> PCB tmp;</b></p><p> tmp=p->data;<
49、/p><p> p->data=q->data;</p><p> q->data=tmp;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p>
50、<p> //動態(tài)分區(qū)分配算法(最佳適應(yīng)算法)</p><p> bool Queue::AllocProDynamic(CString _name,int _size)</p><p><b> {</b></p><p> Node *p=first;</p><p> Node *q=NUL
51、L;//用來記錄最佳插入點位置</p><p> int ch=0;//用來記錄最小碎片值</p><p> while(p->next)</p><p><b> {</b></p><p> p=p->next;</p><p> //分區(qū)大小正好和進程
52、大小相等</p><p> if (p->data.status==free&&p->data.Size==_size)</p><p><b> {</b></p><p> p->data.name=_name;</p><p> p->data.status=busy
53、;</p><p> return true;</p><p><b> }</b></p><p> if (p->data.status==free&&p->data.Size>_size)</p><p><b> {</b></p>&
54、lt;p> ch=p->data.Size-_size;</p><p><b> q=p;</b></p><p><b> break;</b></p><p><b> }</b></p><p><b> /*</b><
55、/p><p> //分區(qū)大小大于進程大小,分割分區(qū),并按大小分區(qū)排序</p><p> if (p->data.Size>_size&&p->data.status==free)</p><p><b> {</b></p><p> Node *s=new Node;</p&
56、gt;<p> int tmp=p->data.Size-_size;</p><p> if (tmp>_size)</p><p><b> {</b></p><p> s->data.lStartAddres=p->data.lStartAddres;</p><p>
57、; s->data.Size=_size;</p><p> s->data.name=_name;</p><p> s->data.status=busy;</p><p> p->data.lStartAddres+=_size;</p><p> p->data.Size=tmp;</p&
58、gt;<p> s->next=q->next;</p><p> q->next=s;</p><p> SortList();//對分區(qū)鏈表進行按大小有小到大排序</p><p> return true;</p><p><b> }</b></p>&
59、lt;p><b> else</b></p><p><b> {</b></p><p> s->data.lStartAddres=p->data.lStartAddres+tmp;</p><p> s->data.name=_name;</p><p> s
60、->data.Size=_size;</p><p> s->data.status=busy;</p><p> p->data.Size=tmp;</p><p> s->next=p->next;</p><p> p->next=s;</p><p> SortLi
61、st();//對分區(qū)鏈表進行按大小有小到大排序</p><p> return true;</p><p><b> }</b></p><p><b> */</b></p><p><b> }</b></p><p><b&g
62、t; while(p)</b></p><p><b> {</b></p><p> if (p->data.status==free&&p->data.Size>=_size)</p><p><b> {</b></p><p> if
63、(p->data.Size-_size<ch)</p><p><b> {</b></p><p> ch=p->data.Size-_size;</p><p><b> q=p;</b></p><p><b> }</b></p>
64、<p><b> }</b></p><p> p=p->next;</p><p><b> }</b></p><p> if(q==NULL)</p><p><b> {</b></p><p> return fa
65、lse;</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> Node *s=new Node;</p><p> s->data.lStartAddr
66、es=q->data.lStartAddres+ch;</p><p> s->data.name=_name;</p><p> s->data.Size=_size;</p><p> s->data.status=busy;</p><p> q->data.Size=ch;</p>
67、<p> s->next=q->next;</p><p> q->next=s;</p><p> return true;</p><p><b> }</b></p><p><b> }</b></p><p> bool Qu
68、eue::FreeMemory(CString _name)</p><p><b> {</b></p><p> Node *p=first;</p><p><b> Node *q;</b></p><p> while(p->next)</p><p>
69、;<b> {</b></p><p><b> q=p;</b></p><p> p=p->next;</p><p> if (p->data.name==_name)</p><p><b> {</b></p><p>
70、 p->data.name="";</p><p> p->data.status=free;</p><p> //進行相鄰分區(qū)合并</p><p> if (q->data.status==free)</p><p><b> {</b></p><p
71、> q->data.Size+=p->data.Size;</p><p> q->next=p->next;</p><p><b> }</b></p><p> //判斷是否為鏈表尾</p><p> if (p->next!=NULL)</p><
72、p><b> {</b></p><p> if (p->next->data.status==free)</p><p><b> {</b></p><p> p->data.Size+=p->next->data.Size;</p><p> p-
73、>next=p->next->next;</p><p><b> }</b></p><p><b> }</b></p><p> return true;</p><p><b> }</b></p><p><b&
74、gt; }</b></p><p> return false;</p><p><b> }</b></p><p> bool Queue::AllMerge(int _size)</p><p><b> {</b></p><p> Node
75、*p=first;</p><p><b> Node *q;</b></p><p> int sum=0;</p><p> bool flag=true;//標(biāo)志是否為第一次找到free分區(qū)</p><p> while(p->next)</p><p><b&g
76、t; {</b></p><p> while(p->next)</p><p><b> {</b></p><p><b> q=p;</b></p><p> p=p->next;</p><p> if (p->data.st
77、atus==free&&flag)</p><p><b> {</b></p><p> sum=p->data.Size;</p><p> q->next=p->next;</p><p> flag=false;</p><p><b>
78、 break;</b></p><p><b> }</b></p><p> if (!flag&&p->data.status==busy)</p><p><b> {</b></p><p> //對數(shù)據(jù)進行重定位</p><p
79、> p->data.lStartAddres-=sum;</p><p><b> }</b></p><p> if (p->data.status==free&&!flag)</p><p><b> {</b></p><p> p->data
80、.Size+=sum;</p><p> //對數(shù)據(jù)進行重定位</p><p> p->data.lStartAddres-=sum;</p><p> if (p->data.Size>=_size)</p><p><b> {</b></p><p> retur
81、n true;</p><p><b> }</b></p><p> q->next=p->next;</p><p> sum=p->data.Size;</p><p><b> break;</b></p><p><b> }&
82、lt;/b></p><p><b> }</b></p><p><b> while(p)</b></p><p><b> {</b></p><p><b> q=p;</b></p><p> p=p-&g
83、t;next;</p><p> if (p->data.status==free)</p><p><b> {</b></p><p> p->data.Size+=sum;</p><p> //對數(shù)據(jù)進行重定位</p><p> p->data.lStartAd
84、dres-=sum;</p><p> if (p->data.Size>_size)</p><p><b> {</b></p><p> return true;</p><p><b> }</b></p><p> q->next=p-&
85、gt;next;</p><p> sum=p->data.Size;</p><p><b> break;</b></p><p><b> }</b></p><p><b> else</b></p><p><b>
86、{</b></p><p> //對數(shù)據(jù)進行重定位</p><p> p->data.lStartAddres-=sum;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</
87、b></p><p> return false;</p><p><b> }</b></p><p> bool Queue::Swaping(int needSize ,PCB &pro)</p><p><b> {</b></p><p>
88、Node *p=first;</p><p> //Node *q;</p><p> while(p->next)</p><p><b> {</b></p><p> p=p->next;</p><p> if (p->data.Size>=needSiz
89、e)</p><p><b> {</b></p><p> pro=p->data;</p><p> p->data.name="";</p><p> p->data.status=free;</p><p> return true;<
90、/p><p><b> }</b></p><p><b> }</b></p><p> return false;</p><p><b> }</b></p><p> 四:程序設(shè)計與實現(xiàn)。</p><p><b
91、> 流程圖</b></p><p> 固定分區(qū)分配流程圖:</p><p> 默認(rèn)1000KB內(nèi)存大小</p><p> 總共分為20個相等大小分區(qū)</p><p><b> 動態(tài)分區(qū)分配算法:</b></p><p> 可重定位分區(qū)分配算法:</p&
92、gt;<p><b> 實驗結(jié)果:</b></p><p> 五:收獲,體會和建議</p><p> 此次課程設(shè)計讓我進一步加深了對操作系統(tǒng)內(nèi)存分配算法的的理解,此次試驗自己花了不少時間研究課本和課外資料,在寫可重定位分區(qū)分配算法遇到了內(nèi)存緊湊算法方面的難題,如何對內(nèi)存剩余空間大小進行緊湊利用,花了好些時間不斷的實驗,不斷的調(diào)試代碼,最后終于寫好了
93、,并加以測試代碼的健壯性,完成并測試了本次操作系統(tǒng)課程設(shè)計。期間雖然遇到了很多困難,但自己最后因為這些困難而收獲到了不少知識,加強了自己動手寫代碼的能力,對代碼調(diào)式技術(shù)進一步掌握,對操作系統(tǒng)也產(chǎn)生了更濃厚的興趣,自己一定還要多花時間研究操作系統(tǒng),爭取進一步理解操作系統(tǒng)并能夠?qū)?yōu)秀算法加以運用到自己以后的代碼中。</p><p> 六:參考資料和書籍。</p><p> 《Visual
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- os課程設(shè)計---模擬處理機調(diào)度算法mfc實現(xiàn)
- 操作系統(tǒng)課程設(shè)計實驗報告--內(nèi)存的連續(xù)分配算法
- vc++課程設(shè)計--基于mfc的模擬時鐘
- mfc課程設(shè)計報告—模擬計算器
- 用銀行家算法實現(xiàn)資源分配課程設(shè)計
- 銀行家算法模擬實現(xiàn)課程設(shè)計
- os課程設(shè)計題目
- 課程設(shè)計--銀行家算法的模擬實現(xiàn)
- 《操作系統(tǒng)》課程設(shè)計---連續(xù)動態(tài)分區(qū)內(nèi)存管理模擬實現(xiàn)
- 操作系統(tǒng)課程設(shè)計--連續(xù)動態(tài)分區(qū)內(nèi)存管理模擬實現(xiàn)
- 操作系統(tǒng)課程設(shè)計--連續(xù)動態(tài)分區(qū)內(nèi)存管理模擬實現(xiàn)
- 操作系統(tǒng)課程設(shè)計--cpu進程調(diào)度和內(nèi)存分配
- mfc課程設(shè)計實驗報告
- 課程設(shè)計報告--磁盤調(diào)度算法的模擬實現(xiàn)
- des算法實現(xiàn)-課程設(shè)計
- bfgs算法實現(xiàn)課程設(shè)計
- 實驗 可變分區(qū)內(nèi)存分配首次適應(yīng)算法模擬
- mfc計算器課程設(shè)計報告
- mfc程序設(shè)計課程設(shè)計---考勤系統(tǒng)
- bfgs算法實現(xiàn)課程設(shè)計
評論
0/150
提交評論