版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 操作系統(tǒng)原理</b></p><p><b> 課程設(shè)計(jì)報(bào)告</b></p><p> 題目: 存儲(chǔ)器的動(dòng)態(tài)分區(qū)算法模擬 </p><p> 所在學(xué)院: </p><p> 班 級(jí):
2、 </p><p> 學(xué) 號(hào): </p><p> 姓 名: </p><p> 指導(dǎo)教師: </p><p> 成 績(jī): </p>
3、<p> 2013年1月 16</p><p><b> 目錄</b></p><p> 一、課程設(shè)計(jì)目的1</p><p><b> 1、背景1</b></p><p><b> 2、目的1</b></p><p> 二、
4、課題任務(wù)描述1</p><p> 三、課題研發(fā)相關(guān)知識(shí)1</p><p> 1、 首次適應(yīng)算法(first fit)1</p><p> 2、 最佳適應(yīng)算法(best fit)1</p><p> 3、 最壞適應(yīng)算法(worst fit)2</p><p><b> 4、 回收內(nèi)存2
5、</b></p><p> 5、庫(kù)函數(shù)的介紹2</p><p><b> 四、課題設(shè)計(jì)2</b></p><p><b> 1、 總體結(jié)構(gòu)2</b></p><p><b> 2、 數(shù)據(jù)結(jié)構(gòu)4</b></p><p> 3
6、、 主要功能的流程圖5</p><p> 4、 程序的技術(shù)路線............................................................8</p><p> 五、帶有詳細(xì)注解的源程序8</p><p> 六、運(yùn)行與測(cè)試18</p><p> 七、收獲及改進(jìn)意見20</p
7、><p><b> 課程設(shè)計(jì)目的</b></p><p><b> 1、背景</b></p><p> 主存是CPU可直接訪問的信息空間,合理而有效的使用貯存將在很大程度上影響整個(gè)計(jì)算機(jī)系統(tǒng)的性能。</p><p> 本課題要求模擬實(shí)現(xiàn)分區(qū)式主存管理機(jī)制。模擬實(shí)現(xiàn)各種分區(qū)管理方法以及相應(yīng)的主存分
8、配以及回收算法。</p><p><b> 2、目的</b></p><p> 通過該課題進(jìn)一步加深對(duì)可變分區(qū)存儲(chǔ)機(jī)制的理解。加深對(duì)存儲(chǔ)器動(dòng)態(tài)分區(qū)分配算法的認(rèn)識(shí)。掌握“首次適應(yīng)算法”、“下次適應(yīng)算法”、“最佳適應(yīng)算法發(fā)”、“最壞適應(yīng)算法”的內(nèi)存分配過程。掌握內(nèi)存的回收策略。</p><p><b> 課題任務(wù)描述</b&g
9、t;</p><p> 1、設(shè)計(jì)可用的內(nèi)存空閑空間,并能動(dòng)態(tài)輸入用戶作業(yè)所需的內(nèi)存大小。</p><p> 2、編程模擬各種分配算法的實(shí)施過程,允許自行選擇如“首次適應(yīng)算法”、“下次適應(yīng)算法”、“最佳適應(yīng)算法發(fā)”、“最壞適應(yīng)算法”等常用算法,要求實(shí)現(xiàn)不少于三種算法。</p><p> 3、實(shí)現(xiàn)內(nèi)存的回收。要求考慮回收時(shí)的內(nèi)存合并問題。</p>&
10、lt;p> 課題研發(fā)相關(guān)知識(shí) (包含所用庫(kù)函數(shù)的介紹)</p><p> 首次適應(yīng)算法(first fit)</p><p> FF算法要求空閑分區(qū)鏈以地址遞增的次序鏈接。在分配內(nèi)存時(shí),從鏈?zhǔn)组_始順序查找,直至找到一個(gè)大小能男足要求的空閑分區(qū)位置;然后再按照作業(yè)的大小,從該分區(qū)中劃出一塊內(nèi)存空間分配給請(qǐng)求者,余下的空閑分區(qū)仍留在空閑鏈中。若從鏈?zhǔn)字敝伶溛捕疾荒苷业揭粋€(gè)能滿足要求
11、的分區(qū),則此次內(nèi)存分配失敗,返回。但是,低址部分不斷被劃分,會(huì)留下許多難以利用的很小的空閑分區(qū)。</p><p> 最佳適應(yīng)算法(best fit)</p><p> 所謂“最佳”是指每次為作業(yè)分配內(nèi)存時(shí),總是把能滿足要求、又是最小的空閑分區(qū)分配給作業(yè),避免“大材小用”。為了加速尋找,該算法要求將所有的空閑分區(qū)按其容量以從小到大的順序形成一空閑分區(qū)鏈。這樣,第一次找到的能滿足要求的空閑
12、區(qū),必然是最佳的。這樣,在存儲(chǔ)器中會(huì)留下許多難以利用的小空閑區(qū)。</p><p> 最壞適應(yīng)算法(worst fit)</p><p> 要掃描整個(gè)空閑分區(qū)表或鏈表,總是挑選一個(gè)最大的空閑區(qū)分割給作業(yè)使用,其優(yōu)點(diǎn)是可使剩下的空閑區(qū)不至于太小,產(chǎn)生碎片的幾率最小,對(duì)中小作業(yè)有力,查找效率很高。但是它會(huì)使存儲(chǔ)器中缺乏大的空閑分區(qū)。</p><p><b>
13、 回收內(nèi)存</b></p><p> 當(dāng)進(jìn)程運(yùn)行完畢釋放內(nèi)存時(shí),系統(tǒng)根據(jù)會(huì)收取的首址,從空閑區(qū)鏈中找到相應(yīng)的插入點(diǎn),并考慮回收區(qū)前后是否有空閑分區(qū),如果有,則把兩個(gè)分區(qū)合并成一個(gè)大的空閑分區(qū)。</p><p><b> 5、庫(kù)函數(shù)的介紹</b></p><p> 1)stdio 就是指 “standard buffered
14、input&output" 意思就是說帶緩沖的標(biāo)準(zhǔn)輸入輸出! 所以了,用到標(biāo)準(zhǔn)輸入輸出函數(shù)時(shí),就要調(diào)用這個(gè)頭文件!</p><p> 2)Stdlib.h即standard library 標(biāo)準(zhǔn)庫(kù)文件。Stdlib頭文件里包含了C,C++語(yǔ)言的最常用的系統(tǒng)函數(shù)。Stdlib.h里面定義了五中類型,一些宏和通用工具函數(shù)。 類型例如:size_t ,wchar_t, div_t, ldiv_t,l
15、ldiv_t; 宏例如:EXIT_FALIRE,EXIT_SUCCESS,RAND_MAX和MB_CUR_MAX。</p><p> 以下是一些常用的函數(shù):dec 置基數(shù)為10 相當(dāng)于"%d";hex 置基數(shù)為16 相當(dāng)于"%X";oct 置基數(shù)為8 相當(dāng)于"%o";setw(n) 設(shè)域?qū)挒閚個(gè)字符</p><p> 課題設(shè)計(jì)
16、:總體結(jié)構(gòu)、所使用的數(shù)據(jù)結(jié)構(gòu)、主要功能的流程圖、程序的技術(shù)路線</p><p><b> 總體結(jié)構(gòu)</b></p><p> 本系統(tǒng)采用了首次適應(yīng)算法、最佳適應(yīng)算法和最壞適應(yīng)算法模擬存儲(chǔ)器動(dòng)態(tài)分區(qū)。系統(tǒng)利用其中某種分配算法,從空閑分區(qū)鏈中找到滿足請(qǐng)求內(nèi)存大小的分區(qū)并分配內(nèi)存給作業(yè)。假設(shè)總的內(nèi)存大小為size,作業(yè)請(qǐng)求的內(nèi)存大小為request,內(nèi)存碎片最小為f。當(dāng)
17、request>size時(shí),內(nèi)存溢出,出現(xiàn)系統(tǒng)錯(cuò)誤;當(dāng)request<=size時(shí),在內(nèi)存中根據(jù)上述算法尋找最佳的內(nèi)存分區(qū)分配給作業(yè)。尋找到合適的內(nèi)存分區(qū)之后,如果size-request<=f,將此分區(qū)上的內(nèi)存全部分配給作業(yè);如果size-request>f,就在此分區(qū)上分割request大小的內(nèi)存給作業(yè),剩余內(nèi)存繼續(xù)留在當(dāng)前的分區(qū)中。當(dāng)進(jìn)程運(yùn)行完畢,系統(tǒng)找到該進(jìn)程并釋放其內(nèi)存,根據(jù)所釋放內(nèi)存的位置對(duì)內(nèi)存進(jìn)行合
18、并。</p><p><b> 系統(tǒng)流程圖:如圖1</b></p><p><b> 系統(tǒng)框架圖:如圖2</b></p><p><b> 數(shù)據(jù)結(jié)構(gòu)</b></p><p> ?。?)定義的全局變量:</p><p> #define SIZE
19、1000 // 內(nèi)存初始大小</p><p> #define MINSIZE 5 // 碎片最小值</p><p> enum STATE { Free, Busy }//枚舉類型,記錄分區(qū)是否空閑的狀態(tài)量</p><p> (2)定義的結(jié)構(gòu)體:struct subAreaNode。記錄分區(qū)的主要數(shù)據(jù)。</p><p
20、><b> ?。?)函數(shù)</b></p><p> 1)void intSubArea():分配初始分區(qū)內(nèi)存。</p><p> 2)int firstFit(int taskId, int size):首次適應(yīng)算法實(shí)現(xiàn)函數(shù),taskId為作業(yè)名,size為作業(yè)申請(qǐng)的內(nèi)存大小。</p><p> 3)int bestFit(int
21、taskId, int size):最佳適應(yīng)算法實(shí)現(xiàn)函數(shù),taskId為作業(yè)名,size為作業(yè)申請(qǐng)的內(nèi)存大小。</p><p> 4)int worstFit(int taskId, int size):最壞適應(yīng)算法實(shí)現(xiàn)函數(shù),taskId為作業(yè)名,size為作業(yè)申請(qǐng)的內(nèi)存大小。</p><p> 5)int freeSubArea(int taskId):內(nèi)存回收函數(shù),該函數(shù)主要用于實(shí)
22、現(xiàn)內(nèi)存的回收,根據(jù)回收內(nèi)存的位置對(duì)分區(qū)進(jìn)行合并操作。其中taskId為所需回收內(nèi)存的作業(yè)號(hào)。</p><p> 6)void showSubArea():顯示空閑分區(qū)鏈情況。包括起始地址 ,空間大小 。工作狀態(tài) 。作業(yè)號(hào)。</p><p> 7)int main():主函數(shù),主要用于顯示操作界面,調(diào)用各個(gè)子函數(shù)等功能。</p><p> 3、主要功能的流程圖&
23、lt;/p><p> ?。?)首次適應(yīng)算法First_fit(int,int); 流程圖(圖3)</p><p> ?。?)最佳適應(yīng)算法Best_fit(int,int); 流程圖(圖4)</p><p> (3)最壞適應(yīng)算法Worst_fit(int,int); 流程圖(圖5)</p><p><b> 程序的技術(shù)路線</b
24、></p><p> 本程序采用C語(yǔ)言編寫,在windows下的Visual C++中編譯,模擬可變分區(qū)存儲(chǔ)管理方式的內(nèi)存分配與回收。假定系統(tǒng)的最大內(nèi)存空間為1000kb,判斷是否劃分空閑區(qū)的最小限值為MINSIZE=5。初始化用戶可占用內(nèi)存區(qū)的首地址為0,大小為0B。定義一個(gè)結(jié)構(gòu)體及其對(duì)象subHead實(shí)現(xiàn)內(nèi)存的分配回收及分配表和空閑表的登記。用最佳分配算法實(shí)現(xiàn)動(dòng)態(tài)分配時(shí),調(diào)用int bestFit(i
25、nt taskId, int size)內(nèi)存分配函數(shù),設(shè)定循環(huán)條件查找最佳空閑分區(qū),根據(jù)找到的空閑區(qū)大小和作業(yè)大小判斷是整個(gè)分配給作業(yè)還是切割空閑區(qū)后再分配給作業(yè),并在“內(nèi)存分配表”和“空閑分區(qū)表”中作登記。調(diào)用int freeSubArea(int taskId)函數(shù)實(shí)現(xiàn)內(nèi)存的回收。順序循環(huán)“內(nèi)存分配表”找到要回收的作業(yè),設(shè)置標(biāo)志位flag,當(dāng)flag=1時(shí)表示回收成功?;厥諆?nèi)存時(shí)需考慮內(nèi)存的4種合并方式,即合并上下分區(qū)、合并上分區(qū)、
26、合并下分區(qū)、上下分區(qū)都不合并。</p><p> 帶有詳細(xì)注解的源程序</p><p> #include<stdio.h></p><p> #include<time.h></p><p> #include<stdlib.h></p><p> #define SIZ
27、E 1000 // 內(nèi)存初始大小</p><p> #define MINSIZE 5 // 碎片最小值</p><p> enum STATE { Free, Busy };</p><p> static int ss=0,ee=0;</p><p> struct subAreaNode {<
28、;/p><p> int addr; // 起始地址</p><p> int size; // 分區(qū)大小</p><p> int taskId; // 作業(yè)號(hào)</p><p> STATE state; // 分區(qū)狀態(tài)</p&g
29、t;<p> subAreaNode *pre; // 分區(qū)前向指針</p><p> subAreaNode *nxt; // 分區(qū)后向指針</p><p><b> }subHead;</b></p><p> // 初始化空閑分區(qū)鏈</p><p> void int
30、SubArea()</p><p> {// 分配初始分區(qū)內(nèi)存</p><p> subAreaNode *fir = (subAreaNode *)malloc(sizeof(subAreaNode));</p><p> // 給首個(gè)分區(qū)賦值</p><p> fir->addr = 0;</p><
31、p> fir->size = SIZE;</p><p> fir->state = Free;</p><p> fir->taskId = -1;</p><p> fir->pre = &subHead;</p><p> fir->nxt = NULL;</
32、p><p> // 初始化分區(qū)頭部信息</p><p> subHead.pre = NULL;</p><p> subHead.nxt = fir;</p><p><b> }</b></p><p><b> // 首次適應(yīng)算法</b></p>&
33、lt;p> int firstFit(int taskId, int size)</p><p> { subAreaNode *p = subHead.nxt;</p><p> while(p != NULL)</p><p><b> {</b></p><p> if(p->state
34、 == Free && p->size >= size) {</p><p> // 找到要分配的空閑分區(qū)</p><p> if(p->size - size <= MINSIZE) {</p><p><b> // 整塊分配</b></p><p> p->st
35、ate = Busy;</p><p> p->taskId = taskId;</p><p><b> } else {</b></p><p> // 分配大小為size的區(qū)間</p><p> subAreaNode *node = (subAreaNode *)malloc(sizeof(subA
36、reaNode));</p><p> node->addr = p->addr + size;</p><p> node->size = p->size - size;</p><p> node->state = Free;</p><p> node->taskId = -1;</p&
37、gt;<p> // 修改分區(qū)鏈節(jié)點(diǎn)指針</p><p> node->pre = p;</p><p> node->nxt = p->nxt;</p><p> if(p->nxt != NULL) {</p><p> p->nxt->pre = node;</p>
38、;<p><b> }</b></p><p> p->nxt = node;</p><p><b> // 分配空閑區(qū)間</b></p><p> p->size = size;</p><p> p->state = Busy;</p>
39、<p> p->taskId = taskId;</p><p><b> }</b></p><p> printf("內(nèi)存分配成功!\n");</p><p><b> return 1;</b></p><p><b> }</b&
40、gt;</p><p> p = p->nxt;</p><p><b> }</b></p><p> printf("找不到合適的內(nèi)存分區(qū),分配失敗...\n");</p><p><b> return 0;</b></p><p>&
41、lt;b> }</b></p><p><b> // 最佳適應(yīng)算法</b></p><p> int bestFit(int taskId, int size)</p><p><b> {</b></p><p> subAreaNode *tar = NULL;&l
42、t;/p><p> int tarSize = SIZE + 1;</p><p> subAreaNode *p = subHead.nxt;</p><p> while(p != NULL)</p><p> { // 尋找最佳空閑區(qū)間</p><p> if(p->state == Free
43、&& p->size >= size && p->size < tarSize) {</p><p><b> tar = p;</b></p><p> tarSize = p->size;</p><p><b> }</b></p>&
44、lt;p> p = p->nxt;</p><p><b> }</b></p><p> if(tar != NULL) {</p><p> // 找到要分配的空閑分區(qū)</p><p> if(tar->size - size <= MINSIZE) {</p><
45、;p><b> // 整塊分配</b></p><p> tar->state = Busy;</p><p> tar->taskId = taskId;</p><p><b> } else {</b></p><p> // 分配大小為size的區(qū)間</p&
46、gt;<p> subAreaNode *node = (subAreaNode *)malloc(sizeof(subAreaNode));</p><p> node->addr = tar->addr + size;</p><p> node->size = tar->size - size;</p><p>
47、node->state = Free;</p><p> node->taskId = -1;</p><p> // 修改分區(qū)鏈節(jié)點(diǎn)指針</p><p> node->pre = tar;</p><p> node->nxt = tar->nxt;</p><p> if(t
48、ar->nxt != NULL) {</p><p> tar->nxt->pre = node;</p><p><b> }</b></p><p> tar->nxt = node;</p><p><b> // 分配空閑區(qū)間</b></p>
49、<p> tar->size = size;</p><p> tar->state = Busy;</p><p> tar->taskId = taskId;</p><p><b> }</b></p><p> printf("內(nèi)存分配成功!\n");&l
50、t;/p><p><b> return 1;</b></p><p><b> } else {</b></p><p> // 找不到合適的空閑分區(qū)</p><p> printf("找不到合適的內(nèi)存分區(qū),分配失敗...\n");</p><p>
51、<b> return 0;</b></p><p><b> }</b></p><p><b> }</b></p><p> int worstFit(int taskId, int size)</p><p><b> {</b><
52、/p><p> subAreaNode *tar = NULL;</p><p> int tarSize;</p><p><b> int mm=1;</b></p><p> subAreaNode *p = subHead.nxt;</p><p> while(p != NULL&
53、amp;&mm==1)</p><p> { // 尋找最佳空閑區(qū)間</p><p> if(p->state == Free && p->size >= size) {</p><p><b> tar = p;</b></p><p> tarSize = p-
54、>size;</p><p><b> mm=0;</b></p><p><b> }</b></p><p><b> else</b></p><p> p = p->nxt;</p><p><b> }</
55、b></p><p> p=subHead.nxt;</p><p> while(p != NULL)</p><p><b> {</b></p><p> // 尋找最大空閑區(qū)間</p><p> if(p->state == Free && p-&g
56、t;size >= tarSize && p->size>=size) {</p><p><b> tar = p; </b></p><p> tarSize = p->size;//遍歷找到最大空閑區(qū)間</p><p><b> p=p->nxt;</b></
57、p><p><b> }</b></p><p><b> else</b></p><p> p = p->nxt;</p><p><b> }</b></p><p> if(tar != NULL) {</p><
58、p> // 找到要分配的空閑分區(qū)</p><p> if(tar->size-size<= MINSIZE) {</p><p><b> // 整塊分配</b></p><p> tar->state = Busy;</p><p> tar->taskId = taskId;&
59、lt;/p><p><b> } else {</b></p><p> // 分配大小為size的區(qū)間 subAreaNode*node=(subAreaNode*)malloc(sizeof(subAreaNode));</p><p> node->addr = tar->addr + size
60、;</p><p> node->size = tar->size - size;</p><p> node->state = Free;</p><p> node->taskId = -1;</p><p> // 修改分區(qū)鏈節(jié)點(diǎn)指針</p><p> node->pre
61、= tar;</p><p> node->nxt = tar->nxt;</p><p> if(tar->nxt != NULL) {</p><p> tar->nxt->pre = node;</p><p><b> }</b></p><p>
62、 tar->nxt = node;</p><p><b> // 分配空閑區(qū)間</b></p><p> tar->size = size;</p><p> tar->state = Busy;</p><p> tar->taskId = taskId;</p><
63、;p><b> }</b></p><p> printf("內(nèi)存分配成功!\n");</p><p><b> return 1;</b></p><p><b> } else {</b></p><p> // 找不到合適的空閑分區(qū)&l
64、t;/p><p> printf("找不到合適的內(nèi)存分區(qū),分配失敗...\n");</p><p><b> return 0;</b></p><p><b> }</b></p><p><b> }</b></p><p>
65、<b> // 回收內(nèi)存</b></p><p> int freeSubArea(int taskId)</p><p><b> {</b></p><p> int flag = 0;</p><p> subAreaNode *p = subHead.nxt, *pp;</p
66、><p> while(p != NULL)</p><p><b> {</b></p><p> if(p->state == Busy && p->taskId == taskId) {</p><p><b> flag = 1;</b></p>
67、<p> if((p->pre != &subHead && p->pre->state == Free) </p><p> && (p->nxt != NULL && p->nxt->state == Free)) {</p><p> // 情況1:合并上下兩個(gè)分區(qū)</
68、p><p><b> // 先合并上區(qū)間</b></p><p><b> pp = p;</b></p><p> p = p->pre;</p><p> p->size += pp->size;</p><p> p->nxt = pp-&
69、gt;nxt;</p><p> pp->nxt->pre = p;</p><p><b> free(pp);</b></p><p><b> // 后合并下區(qū)間</b></p><p> pp = p->nxt;</p><p> p-&g
70、t;size += pp->size;</p><p> p->nxt = pp->nxt;</p><p> if(pp->nxt != NULL) {</p><p> pp->nxt->pre = p;</p><p><b> }</b></p><
71、p><b> free(pp);</b></p><p> } else if((p->pre == &subHead || p->pre->state == Busy)</p><p> && (p->nxt != NULL && p->nxt->state == Free))
72、{</p><p> // 情況2:只合并下面的分區(qū)</p><p> pp = p->nxt;</p><p> p->size += pp->size;</p><p> p->state = Free;</p><p> p->taskId = -1;</p>
73、<p> p->nxt = pp->nxt;</p><p> if(pp->nxt != NULL) {</p><p> pp->nxt->pre = p;</p><p><b> }</b></p><p><b> free(pp);</b&g
74、t;</p><p> } else if((p->pre != &subHead && p->pre->state == Free)</p><p> && (p->nxt == NULL || p->nxt->state == Busy)) {</p><p> // 情況3:只合
75、并上面的分區(qū)</p><p><b> pp = p;</b></p><p> p = p->pre;</p><p> p->size += pp->size;</p><p> p->nxt = pp->nxt;</p><p> if(pp->
76、nxt != NULL) {</p><p> pp->nxt->pre = p;</p><p><b> }</b></p><p><b> free(pp);</b></p><p><b> } else {</b></p><
77、p> // 情況4:上下分區(qū)均不用合并</p><p> p->state = Free;</p><p> p->taskId = -1;</p><p><b> }</b></p><p><b> }</b></p><p> p = p
78、->nxt;</p><p><b> }</b></p><p> if(flag == 1) {</p><p><b> // 回收成功</b></p><p> printf("內(nèi)存分區(qū)回收成功...\n");</p><p><
79、;b> return 1;</b></p><p><b> } else {</b></p><p> // 找不到目標(biāo)作業(yè),回收失敗</p><p> printf("找不到目標(biāo)作業(yè),內(nèi)存分區(qū)回收失敗...\n");</p><p><b> return 0
80、;</b></p><p><b> }</b></p><p><b> }</b></p><p> /* int start(int task)</p><p><b> {</b></p><p> clock_t s;&l
81、t;/p><p> s=(int)clock();</p><p><b> return s;</b></p><p><b> }</b></p><p> int end(int task)</p><p><b> {</b></p&
82、gt;<p> clock_t s;</p><p> s=(int)clock();</p><p><b> return s;</b></p><p><b> }*/</b></p><p> // 顯示空閑分區(qū)鏈情況</p><p> vo
83、id showSubArea()</p><p><b> {</b></p><p> printf("*********************************************\n");</p><p> printf("** 當(dāng)前的內(nèi)存分配情況如下: **\
84、n");</p><p> printf("*********************************************\n");</p><p> printf("** 起始地址 | 空間大小 | 工作狀態(tài) | 作業(yè)號(hào) **\n");</p><p> subAreaNode *p = subH
85、ead.nxt;</p><p> while(p != NULL)</p><p><b> {</b></p><p> printf("**-----------------------------------------**\n");</p><p> printf("**&
86、quot;);</p><p> printf("%5d k |", p->addr);</p><p> printf("%5d k |", p->size);</p><p> printf(" %5s |", p->state == Free ? "Fre
87、e" : "Busy");</p><p> if(p->taskId > 0) {</p><p> printf("%5d ", p->taskId);</p><p><b> } else {</b></p><p> printf(
88、" ");</p><p><b> }</b></p><p> printf("**\n"); </p><p> p = p->nxt;</p><p><b> }</b></p><p> pri
89、ntf("*********************************************\n");</p><p><b> }</b></p><p> int main()</p><p><b> {</b></p><p> int option, o
90、pe, taskId, size;</p><p> // 初始化空閑分區(qū)鏈</p><p> intSubArea();</p><p><b> // 選擇分配算法</b></p><p> l1: while(1)</p><p><b> {</b><
91、/p><p> printf("**********************\n");</p><p> printf("請(qǐng)選擇要模擬的分配算法:\n0 表示首次適應(yīng)算法\n1 表示最佳適應(yīng)算法\n2 表示最壞適應(yīng)算法\n3 退出\n");</p><p> printf("********************
92、**\n");</p><p> scanf("%d", &option);</p><p> system("cls");</p><p> if(option == 0) {</p><p> printf("你選擇了首次適應(yīng)算法,下面進(jìn)行算法的模擬\n"
93、;);</p><p><b> break;</b></p><p> } else if(option == 1) {</p><p> printf("你選擇了最佳適應(yīng)算法,下面進(jìn)行算法的模擬\n");</p><p><b> break;</b></p&g
94、t;<p> } else if(option == 2) {</p><p> printf("你選擇了最壞適應(yīng)算法,下面進(jìn)行算法的模擬\n");</p><p><b> break;</b></p><p><b> }</b></p><p> e
95、lse if(option == 3){</p><p><b> exit(0);</b></p><p><b> }</b></p><p><b> else {</b></p><p> printf("錯(cuò)誤:請(qǐng)輸入 0/1\n\n");&
96、lt;/p><p><b> }</b></p><p><b> }</b></p><p> // 模擬動(dòng)態(tài)分區(qū)分配算法</p><p><b> while(1)</b></p><p><b> {</b></p
97、><p> printf("\n");</p><p> printf("*********************************************\n");</p><p> printf(" 1: 分配內(nèi)存\n 2: 回收內(nèi)存\n 3: 返回上一級(jí)菜單\n 0: 退出 \
98、n\n");</p><p> printf("*********************************************\n");</p><p> scanf("%d", &ope);</p><p> system("cls");</p><
99、p> if(ope == 0) break;</p><p> if(ope == 1) {</p><p><b> // 模擬分配內(nèi)存</b></p><p> printf("請(qǐng)輸入作業(yè)號(hào): ");</p><p> scanf("%d", &task
100、Id);</p><p> printf("請(qǐng)輸入需要分配的內(nèi)存大小(KB): ");</p><p> scanf("%d", &size);</p><p> if(size <= 0) {</p><p> printf("錯(cuò)誤:分配內(nèi)存大小必須為正值\n"
101、;);</p><p><b> continue;</b></p><p><b> }</b></p><p><b> // 調(diào)用分配算法</b></p><p> if(option == 0) {</p><p> firstFit(
102、taskId, size);</p><p> } else if(option==1){</p><p> bestFit(taskId, size);</p><p><b> }</b></p><p><b> else </b></p><p> wor
103、stFit(taskId, size);</p><p> // 顯示空閑分區(qū)鏈情況</p><p> showSubArea();</p><p> } else if(ope == 2) {</p><p><b> // 模擬回收內(nèi)存</b></p><p> printf(&qu
104、ot;請(qǐng)輸入要回收的作業(yè)號(hào): ");</p><p> scanf("%d", &taskId);</p><p> freeSubArea(taskId);</p><p> // 顯示空閑分區(qū)鏈情況</p><p> showSubArea();</p><p> }
105、 else if(ope==3){</p><p><b> goto l1;</b></p><p><b> }</b></p><p><b> else {</b></p><p> printf("錯(cuò)誤:請(qǐng)輸入 0/1/2\n");<
106、/p><p><b> }</b></p><p><b> }</b></p><p> printf("分配算法模擬結(jié)束\n");</p><p><b> return 0;</b></p><p><b> }
107、</b></p><p> 運(yùn)行與測(cè)試(調(diào)試通過的程序,主要測(cè)試用例和運(yùn)行界面截圖)</p><p> 1.測(cè)試數(shù)據(jù):預(yù)設(shè)總的內(nèi)存大小為100k。選擇首次適應(yīng)算法,分別輸入作業(yè)號(hào)及作業(yè)的大?。?,200k),(2,200k),(3,155k),(4,445k),然后回收作業(yè)2和作業(yè)4,最后退出系統(tǒng)。</p><p><b> 運(yùn)行截圖如下
108、:</b></p><p><b> 主界面:圖6</b></p><p><b> 圖6</b></p><p> 2.選擇首次適應(yīng)算法:圖7</p><p><b> 圖7</b></p><p> 3.利用首次適應(yīng)算法分配內(nèi)存
109、:圖8</p><p><b> 圖8</b></p><p><b> 回收內(nèi)存:圖9</b></p><p><b> 圖9</b></p><p> 5.退出系統(tǒng):圖10</p><p><b> 圖10</b>&l
110、t;/p><p><b> 收獲及改進(jìn)意見</b></p><p> 每一次的實(shí)踐,都會(huì)有很大的收獲。做這個(gè)題目的時(shí)候,就針對(duì)此題要解決的幾個(gè)問題反復(fù)思考,重新翻開教科書把相關(guān)內(nèi)容特別是算法原理認(rèn)真細(xì)致的看了一遍,設(shè)想會(huì)遇到的問題。在內(nèi)存動(dòng)態(tài)分配程序設(shè)計(jì)中,最佳適應(yīng)算法比首次要難一些,要加上對(duì)分配后該分區(qū)是否能最好地利用的判斷。再一個(gè)問題是回收時(shí)候的合并,對(duì)地址的修改
111、不是很有把握。著手寫程序后,半天才理清回收的內(nèi)存和上下鄰合并的條件與關(guān)系,寫此處的代碼時(shí),邏輯上比較混亂,反復(fù)錯(cuò)誤反復(fù)修改了很多次才調(diào)試正確,這也是花了最多時(shí)間才得以正確實(shí)現(xiàn)的部分。之前大多用的c語(yǔ)言,對(duì)結(jié)構(gòu)體,對(duì)象等知識(shí)淡忘了很多,這一次的實(shí)踐讓我找回了很多學(xué)過的知識(shí)點(diǎn),也彌補(bǔ)了很多的不足之處。邏輯思維也得到了鍛煉,寫代碼也不再像初學(xué)的時(shí)候那么繁瑣,自己都能感覺到那一點(diǎn)點(diǎn)的進(jìn)步,頓時(shí)也覺得充實(shí)起來。還有一個(gè)難點(diǎn)就是為作業(yè)找到最佳空閑區(qū)
112、,此處是參照了一些資料后,理清了條件,然后用一個(gè)while()兩個(gè)if()語(yǔ)句循環(huán)嵌套就實(shí)現(xiàn)了此功能。實(shí)踐中也發(fā)現(xiàn)自身很多的不足,比如上理論課時(shí)認(rèn)為已經(jīng)理解了的算法原理在用代碼實(shí)踐時(shí),發(fā)現(xiàn)還是有模糊和思考不周的地方。</p><p> 學(xué)習(xí)著,收獲著,并快樂著,這真是我的感觸。對(duì)于自身不足的地方,我也有了比較清晰的認(rèn)識(shí),對(duì)未來的發(fā)展,也有了個(gè)參照,將遇到的困難一個(gè)個(gè)跨過,并最終完成此次課程設(shè)計(jì),真的感覺很有收獲
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 可變分區(qū)存儲(chǔ)管理算法模擬課程設(shè)計(jì)
- 虛擬存儲(chǔ)器課程設(shè)計(jì)
- 課程設(shè)計(jì)---存儲(chǔ)器管理系統(tǒng)設(shè)計(jì)
- 課程設(shè)計(jì)報(bào)告-可變分區(qū)存儲(chǔ)管理
- 課程設(shè)計(jì)--請(qǐng)求頁(yè)式存儲(chǔ)器管理
- c語(yǔ)言課程設(shè)計(jì)_存儲(chǔ)管理分區(qū)分配算法
- 微機(jī)原理課程設(shè)計(jì)--存儲(chǔ)器擴(kuò)展分析與設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)---動(dòng)態(tài)分區(qū)分配存儲(chǔ)管理
- 虛擬存儲(chǔ)器管理系統(tǒng)操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)--模擬實(shí)現(xiàn)可變分區(qū)存儲(chǔ)管理
- 操作系統(tǒng)原理課程設(shè)計(jì)報(bào)告-可變分區(qū)存儲(chǔ)管理
- 微機(jī)原理與接口技術(shù)課程設(shè)計(jì) --存儲(chǔ)器
- 單片機(jī)課程設(shè)計(jì)-iic總線式eeprom存儲(chǔ)器應(yīng)用設(shè)計(jì)
- 動(dòng)態(tài)隨機(jī)存儲(chǔ)器(DRAM)的BIST設(shè)計(jì)研究.pdf
- 存儲(chǔ)器及其組成設(shè)計(jì)
- 計(jì)算機(jī)組成原理512×16位存儲(chǔ)器課程設(shè)計(jì)報(bào)告
- 《操作系統(tǒng)》課程設(shè)計(jì)---連續(xù)動(dòng)態(tài)分區(qū)內(nèi)存管理模擬實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計(jì)--連續(xù)動(dòng)態(tài)分區(qū)內(nèi)存管理模擬實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計(jì)--連續(xù)動(dòng)態(tài)分區(qū)內(nèi)存管理模擬實(shí)現(xiàn)
- 存儲(chǔ)器類型
評(píng)論
0/150
提交評(píng)論