版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 電氣信息系</b></p><p> 操作系統(tǒng) 課程設(shè)計(jì)報(bào)告</p><p> 模擬實(shí)現(xiàn)可變分區(qū)存儲(chǔ)管理</p><p><b> 一、設(shè)計(jì)目的</b></p><p> 在熟練掌握計(jì)算機(jī)分區(qū)存儲(chǔ)管理方式的原理的基礎(chǔ)上,利用C程序設(shè)計(jì)語(yǔ)言在windows操作系統(tǒng)
2、下模擬實(shí)現(xiàn)操作系統(tǒng)的可變分區(qū)存儲(chǔ)管理的功能,一方面加深對(duì)原理的理解,另一方面提高根據(jù)已有原理通過(guò)編程解決實(shí)際問(wèn)題的能力,為進(jìn)行系統(tǒng)軟件開(kāi)發(fā)和針對(duì)實(shí)際問(wèn)題提出高效的軟件解決方案打下基礎(chǔ)。</p><p> 二、各功能模塊分析實(shí)現(xiàn)</p><p> 設(shè)計(jì)合理的數(shù)據(jù)結(jié)構(gòu)來(lái)描述存儲(chǔ)空間:</p><p> 對(duì)于未分配出去的部分,用空閑分區(qū)鏈表來(lái)描述。</p>
3、;<p> struct freeList </p><p><b> {</b></p><p> int startAddress; /* 分區(qū)起始地址 */</p><p> int size; /* 分區(qū)大小 */</p>
4、<p> struct freeList *next; /* 分區(qū)鏈表指針 */</p><p><b> }</b></p><p> 對(duì)于已經(jīng)分配出去的部分,由裝入內(nèi)存的作業(yè)占據(jù)。</p><p> struct usedList </p><p><b&g
5、t; {</b></p><p> int startAddress; /* 分區(qū)起始地址 */</p><p> int jobID; /* 分區(qū)中存放作業(yè)ID */</p><p> struct usedList *next; /* 分區(qū)鏈表指針 */</p><p
6、><b> }</b></p><p><b> 將作業(yè)組織成鏈表。</b></p><p> struct jobList</p><p><b> {</b></p><p> int id; /* 作業(yè)ID */<
7、/p><p> int size; /* 作業(yè)大?。ㄐ枰拇鎯?chǔ)空間大?。?*/</p><p> int status; /* 作業(yè)狀態(tài) 0 : new job ,1 : in the memory , 2 : finished . */</p><p> struct jobList *next; /* 作業(yè)鏈表指針
8、*/</p><p><b> }</b></p><p> 以上將存儲(chǔ)空間分為空閑可占用兩部分,在usedlist中設(shè)jobID而不設(shè)size,可以在不增加空間復(fù)雜度(與freelist相比)的同時(shí)更方便的實(shí)現(xiàn)可變分區(qū)存儲(chǔ)管理(從后面的一些函數(shù)的實(shí)現(xiàn)上可以得出這個(gè)結(jié)論)。</p><p> 盡管設(shè)置joblist增加了空間復(fù)雜度,但它的
9、存在,使得該程序可以方便的直接利用C盤(pán)中的Job.txt文件。該文件可以認(rèn)為是一個(gè)和其他進(jìn)程共享的資源。通過(guò)這個(gè)文件,其他進(jìn)程寫(xiě)入數(shù)據(jù)供讀取。這中思想在操作系統(tǒng)設(shè)計(jì)中體現(xiàn)的很多。</p><p> 實(shí)現(xiàn)分區(qū)存儲(chǔ)管理的內(nèi)存分配功能,選擇適應(yīng)算法(首次適應(yīng)算法,最佳適 應(yīng)算法,最后適應(yīng)算法,最壞適應(yīng)算法)。</p><p><b> 基本原理分析: </b>
10、;</p><p> 1) Best fit :將空閑分區(qū)按大小從小到大排序,從頭找到大小合適的分區(qū)。</p><p> 2) Worst fit:將空閑分區(qū)按大小從大到小排序,從頭找到大小合適的分區(qū)。</p><p> 3) First fit :將空閑分區(qū)按起始地址大小從小到大排序,……</p><p> 4) Last fit
11、:將空閑分區(qū)按起始地址大小從大到小排序,……</p><p> 由此,可將空閑分區(qū)先做合適的排序后用對(duì)應(yīng)的適應(yīng)算法給作業(yè)分配存儲(chǔ)空間。排序函數(shù) order(bySize為零則按分區(qū)大小排序,否則按分區(qū)起始地址;inc為零從小到大排序,否則從大到小排序;通過(guò)empty指針?lè)祷亟Y(jié)果)。</p><p> void order(struct freeList **empty,int bySi
12、ze,int inc)</p><p><b> {</b></p><p> struct freeList *p,*q,*temp;</p><p> int startAddress,size;</p><p> for(p = (*empty) -> next;p;p = p -> next)
13、</p><p> { /* 按bySize和inc兩個(gè)參數(shù)尋找合適的節(jié)點(diǎn),用temp指向它 */</p><p> for(temp = q = p;q;q = q -> next)</p><p><b> {</b></p><p> switch(bySize)</p><
14、p><b> {</b></p><p> case 0 : switch(inc)</p><p><b> {</b></p><p> case 0:if(q->size < temp->size)</p><p> temp = q;break;</p
15、><p> default:if(q->size > temp->size)</p><p> temp = q;break;</p><p><b> } break;</b></p><p> default: switch(inc)</p><p><b>
16、 {</b></p><p> case 0:if(q->startAddress < temp->startAddress)</p><p> temp = q;break;</p><p> default:if(q->startAddress > temp->startAddress)</p>
17、<p> temp = q;break;</p><p><b> } break;</b></p><p><b> }</b></p><p> } /* 交換節(jié)點(diǎn)的成員值 */ </p><p> if(
18、temp != p)</p><p><b> { </b></p><p> startAddress = p->startAddress;</p><p> size = p->size;</p><p> p->startAddress = temp->startAddress;&
19、lt;/p><p> p->size = temp->size;</p><p> temp->startAddress = startAddress;</p><p> temp->size = size;</p><p><b> }</b></p><p><
20、;b> }</b></p><p><b> }</b></p><p> 實(shí)現(xiàn)分區(qū)存儲(chǔ)管理的內(nèi)存回收算法:</p><p> void insertFreeNode(struct freeList **empty,int startAddress,int size)</p><p> 插入回
21、收的空節(jié)點(diǎn)分區(qū),處理回收分區(qū)與空閑分區(qū)的四種鄰接關(guān)系。</p><p><b> {</b></p><p> struct freeList *p,*q,*r;</p><p> for(p = *empty;p -> next;p = p -> next) ; /* 處理鏈表尾部的鄰接情況 */</p>
22、<p> if(p == *empty || p -> startAddress + p -> size < startAddress)/* 與尾部不相鄰*/</p><p><b> {</b></p><p> makeFreeNode(&r,startAddress,size); /* 通過(guò)r指針?lè)祷貏?chuàng)建的空閑節(jié)點(diǎn)*
23、/</p><p> r -> next = p -> next; /* 插入獨(dú)立的空閑節(jié)點(diǎn) */</p><p> p -> next = r;</p><p><b> return ;</b></p><p><b> }</b&g
24、t;</p><p> if(p -> startAddress + p -> size == startAddress) /* 與尾部上鄰 */</p><p><b> {</b></p><p> p -> size += size; /* 合
25、并尾部節(jié)點(diǎn) */</p><p><b> return ;</b></p><p><b> }</b></p><p> q = (*empty) -> next; /* 處理鏈表首節(jié)點(diǎn)的鄰接情況 */</p><p> if(startAddr
26、ess + size == q -> startAddress) /* 與首節(jié)點(diǎn)下鄰 */</p><p><b> {</b></p><p> q -> startAddress = startAddress; /* 合并首節(jié)點(diǎn) */</p><p> q -&
27、gt; size += size;</p><p><b> }</b></p><p> else if(startAddress + size < q -> startAddress) /* 與首節(jié)點(diǎn)不相鄰 */</p><p><b> {</b></p><p&
28、gt; makeFreeNode(&r,startAddress,size);</p><p> r -> next = (*empty) -> next;</p><p> (*empty) -> next = r;</p><p><b> }</b></p><p><b&g
29、t; else </b></p><p> { /* 處理鏈表中間的鄰接情況 */</p><p> while(q -> next && q -> startAddress < startAddress)</p><p><b>
30、 {</b></p><p><b> p = q;</b></p><p> q = q -> next;</p><p><b> }</b></p><p> if(p -> startAddress + p -> size == startAddress
31、 &&\</p><p> q -> startAddress == startAddress + size) /* 上下鄰,合并節(jié)點(diǎn) */</p><p><b> {</b></p><p> p -> size += size + q -> size;</p><p&g
32、t; p -> next = q -> next;</p><p> free(q); /* 刪除多余節(jié)點(diǎn) */</p><p><b> }</b></p><p> else if(p -> startAddress + p -> size
33、== startAddress &&\</p><p> q -> startAddress != startAddress + size) /*上鄰,增加節(jié)點(diǎn)的大小*/</p><p><b> {</b></p><p> p -> size += size;</p><p><
34、;b> }</b></p><p> else if(p -> startAddress + p -> size != startAddress &&\</p><p> q -> startAddress == startAddress + size) /* 下鄰 */</p><p&g
35、t;<b> {</b></p><p> q -> startAddress = startAddress; /* 修改節(jié)點(diǎn)起始地址 */</p><p> q -> size += size; /* 修改節(jié)點(diǎn)的大小 */</p><p><b> }<
36、/b></p><p><b> else</b></p><p> { /* 上下不相鄰 */</p><p> makeFreeNode(&r,startAddress,size);</p><p> r
37、-> next = p -> next;</p><p> p -> next = r;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> 當(dāng)碎
38、片產(chǎn)生時(shí),進(jìn)行碎片的拼接。</p><p> void moveFragment(struct jobList *jobs,struct freeList **empty,struct usedList **used)</p><p><b> {</b></p><p> int size,status;</p><
39、p> struct usedList *p;</p><p> int address = memoryStartAddress; /*全局變量,初始化時(shí)分配存儲(chǔ)空間始址*/</p><p> if((*empty)->next == NULL) /* 空閑分區(qū)鏈表為空,提示并返回 */</p><p><b> {<
40、/b></p><p> printf("\nThe memory was used out at all.\nMay be you should finish some jobs first or press any key to try again !");</p><p><b> getch();</b></p>&
41、lt;p><b> return;</b></p><p><b> }</b></p><p> for(p = (*used) -> next;p;p = p-> next) /* 循環(huán)的修改占用分區(qū)的始址 */</p><p><b> {</b></p&
42、gt;<p> p -> startAddress = address;</p><p> getJobInfo(jobs,p -> jobID,&size,&status); /* 由作業(yè)ID獲得作業(yè)大小 */</p><p> address += size;</p><p><b> }</b&
43、gt;</p><p> (*empty)->next->startAddress = address;/*修改空閑分區(qū)的首節(jié)點(diǎn)始址、大小*/</p><p> (*empty) -> next -> size = memorySize - (address - memoryStartAddress);</p><p> (*empty
44、) -> next -> next = NULL; /* 刪除首節(jié)點(diǎn)后的所有節(jié)點(diǎn) */</p><p><b> }</b></p><p> 空閑分區(qū)隊(duì)列顯示:int showFreeList(struct freeList *empty)</p><p> 作業(yè)占用鏈表顯示:int showUsedLis
45、t(struct jobList *jobs,struct usedList *used) </p><p> 從頭到尾顯示used鏈,同時(shí)通過(guò)其中的作業(yè)ID在jobs中查對(duì)應(yīng)的大小。</p><p> 從鍵盤(pán)輸入作業(yè)到D盤(pán)的JOB文件:void inputJob(void)</p><p> 從JOB文件中讀出作業(yè)并創(chuàng)建作業(yè)鏈表:int makeJobLis
46、t(struct jobList **jobs)</p><p> 顯示作業(yè)鏈表:int showJobList(struct jobList *jobs) </p><p> 10.更新作業(yè)鏈表中作業(yè)的狀態(tài): int updateJobFile(struct jobList *jobs)</p><p> 11.根據(jù)作業(yè)鏈表更新JOB文件: int upda
47、teJobFile(struct jobList *jobs) </p><p> 12.為作業(yè)分配存儲(chǔ)空間、狀態(tài)必須為0:int allocate(struct freeList **empty,int size) </p><p> 13.結(jié)束一個(gè)作業(yè)號(hào)為id的作業(yè),釋放存儲(chǔ)空間(由*startAddress返回空間的起始地址):int finishJob(
48、struct usedList **used,int id,int *startAddress)</p><p> 14.插入釋放的空間到used鏈表中(作業(yè)號(hào)為id,startAddress由函數(shù)13返回):</p><p> void insertUsedNode(struct usedList **used,int id,int startAddress)</p>
49、<p> 15.獲取作業(yè)的信息: void getJobInfo(struct jobList *jobs,int id,int *size,int *status)</p><p> 16.初始化存儲(chǔ)空間起始地址、大?。簐oid iniMemory(void)</p><p> 17.選擇適應(yīng)算法:char selectFitMethod(void)</p>
50、<p> 18.根據(jù)參數(shù)startAddress、size創(chuàng)建空閑節(jié)點(diǎn),由empty指針?lè)祷兀?lt;/p><p> void makeFreeNode(struct freeList **empty,int startAddress,int size)</p><p> 19.以要求的方式打開(kāi)文件:void openFile(FILE **fp,char *filename
51、,char *mode)</p><p> 20.出現(xiàn)嚴(yán)重錯(cuò)誤時(shí)顯示信息并結(jié)束程序;void errorMessage(void)</p><p> 三、總體界面與程序流程分析</p><p> Dynamic Zonal Memory Management</p><p> 其中1、Initializiation.按順序利用了ope
52、nFile()、iniMemory()、makeFreeNode()、inputJob()(選擇利用C盤(pán)JOB文件時(shí)提供作業(yè)信息)、makeJobList()、allocate()、insertUsedNode()(選擇利用C盤(pán)JOB文件時(shí)先將狀態(tài)為1的作業(yè)放到存儲(chǔ)空間中,以恢復(fù)上次的模擬實(shí)驗(yàn),或使本次模擬時(shí)不出錯(cuò))selectFitMethod()等自編函數(shù)。</p><p> 2、Put job into
53、memory(allocate memory)</p><p> 按順序利用了showJobList()(選手動(dòng)逐個(gè)為作業(yè)分配存儲(chǔ)空間時(shí))、openFile()、order()、allocate()、errorMessage()、insertUsedNode()、updateJobStatus()updateJobFile()函數(shù)</p><p> (自動(dòng)為如上作業(yè)分配存儲(chǔ)后狀態(tài)的變化
54、——>) </p><p> 3、Finish job(reuse memory)</p><p> 按順序利用了openFile()、showUsedList()、getJobInfo()、insert FreeNode()、updateJobStatus()、updateJobFile()、errorMessage()等自編函數(shù)。 </p>
55、<p> (完成部分作業(yè)后作業(yè)——>)</p><p> 4、Show current free list 按順序利用了openFile()、showFreeList()函數(shù)。 (如下圖為當(dāng)前空閑分區(qū))</p><p> 5、Show current memory used by jobs按順序利用
56、了openFile()、showUsedList()函數(shù)。 (如下圖為當(dāng)前作業(yè)占用的分區(qū))</p><p> 6、Move fragment together按順序利用了openFile()、moveFragment()函數(shù)。</p><p><b> 整理 </b></p><p> 7、Exit按順序利用了ope
57、nFile()、exit(0)函數(shù)。</p><p><b> 四、主程序流程圖</b></p><p><b> step=’1’</b></p><p> step=’2’ </p><p><b> step=’6’</b></p>&l
58、t;p> step=’3’step=’4’ </p><p> step=’5’ </p><p><b> step=’7’</b></p><p><b> 五、結(jié)果分析與總結(jié)</b></p><p> 程序中創(chuàng)建的兩個(gè)文件</p><p> 1)B
59、est fit算法驗(yàn)證: </p><p> 如下圖分配大小為50的8號(hào)作業(yè),恰好占用大小為50的空閑而非大小為240的。</p><p> 2)Worst fit算法驗(yàn)證:</p><p> 如下圖分配大小為50的8號(hào)作業(yè),占用大小為100空閑而非大小為70的。</p><p> 3)First fit算法驗(yàn)證:</p>
60、<p> 如下圖分配大小為50的8號(hào)作業(yè),占用起始地址為110空閑而非350的。</p><p> 4)Last fit算法驗(yàn)證:</p><p> 如下圖分配大小為50的8號(hào)作業(yè),占用起始地址為350空閑而非110的。</p><p> 總結(jié):通過(guò)這次課程設(shè)計(jì)我練習(xí)了用C語(yǔ)言寫(xiě)系統(tǒng)軟件,對(duì)OS中可變分區(qū)存儲(chǔ)管理有了更深刻的了解。在寫(xiě)程序的時(shí)候
61、也遇到了一些困難。比如在設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)時(shí)特別猶豫,總想找一個(gè)很合適的。但是,后來(lái)才知道,關(guān)鍵要多嘗試,而空想是沒(méi)有用的。最后我證實(shí)了自己的設(shè)計(jì)的合理性。還有為了使程序更健壯,我嘗試著將程序中的輸入部分全部改為字符(串)。成功的避免了接受整型數(shù)據(jù)時(shí)輸入字符后引起的錯(cuò)誤,使程序能接受</p><p> 任何輸入而正常結(jié)束。很遺憾的是因?yàn)闀r(shí)間問(wèn)題,沒(méi)有把這個(gè)模擬程序?qū)懗蓜?dòng)畫(huà)形式,還可以加幾句代碼后實(shí)現(xiàn)動(dòng)態(tài)的增加作業(yè)。&
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 操作系統(tǒng)原理課程設(shè)計(jì)報(bào)告-可變分區(qū)存儲(chǔ)管理
- 可變分區(qū)存儲(chǔ)管理算法模擬課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)---動(dòng)態(tài)分區(qū)分配存儲(chǔ)管理
- 課程設(shè)計(jì)報(bào)告-可變分區(qū)存儲(chǔ)管理
- 《操作系統(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)
- 操作系統(tǒng)課程設(shè)計(jì)存儲(chǔ)管理
- 模擬頁(yè)式存儲(chǔ)管理-操作系統(tǒng)課程設(shè)計(jì)
- 模擬頁(yè)式存儲(chǔ)管理 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)——操作系統(tǒng)課程設(shè)計(jì)模擬操作系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)--模擬操作系統(tǒng)的實(shí)現(xiàn)
- 模擬頁(yè)式存儲(chǔ)管理-操作系統(tǒng)課程設(shè)計(jì)報(bào)告
- 操作系統(tǒng)課程設(shè)計(jì)--模擬請(qǐng)求頁(yè)式存儲(chǔ)管理
- 操作系統(tǒng)程序設(shè)計(jì)課程設(shè)計(jì)報(bào)告-操作系統(tǒng)模擬實(shí)現(xiàn)
- 模擬操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)--請(qǐng)求頁(yè)式存儲(chǔ)管理
- 操作系統(tǒng)課程設(shè)計(jì)--請(qǐng)求頁(yè)式存儲(chǔ)管理
- 操作系統(tǒng)課程設(shè)計(jì)--- 請(qǐng)求調(diào)頁(yè)存儲(chǔ)管理
- 操作系統(tǒng)課程設(shè)計(jì)--請(qǐng)求頁(yè)式存儲(chǔ)管理
評(píng)論
0/150
提交評(píng)論