版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
下載可編輯青島理工大學(xué)操作系統(tǒng)課程設(shè)計(jì)報(bào)告院(系): 計(jì)算機(jī)工程學(xué)院專業(yè): 計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)學(xué)生姓名: __牛利利班級:__ 計(jì)算073 _學(xué)號: 200707106題目: _動(dòng)態(tài)分區(qū)分配模擬 ____起迄日期: _2010年7月5日至7月16日 _設(shè)計(jì)地點(diǎn): 2號實(shí)驗(yàn)樓402室指導(dǎo)教師: 李 蘭2009—2010年度 第2學(xué)期.專業(yè).整理.下載可編輯完成日期: 2010 年7月16日一、課程設(shè)計(jì)目的操作系統(tǒng)是最重要的計(jì)算機(jī)系統(tǒng)軟件 ,同時(shí)也是最活躍的學(xué)科之一 。計(jì)算機(jī)系統(tǒng)由硬件和軟件兩部分組成 。操作系統(tǒng)是配置在計(jì)算機(jī)硬件上的第一層軟件 ,是對硬件的首次擴(kuò)充。本次課程設(shè)計(jì)的主要目的是在學(xué)習(xí)操作系統(tǒng)理論知識的基礎(chǔ)上 ,對操作系統(tǒng)整體的一個(gè)模擬。也是對本學(xué)期所學(xué)知識的一個(gè)總體的檢測 ,使理論知識應(yīng)用到實(shí)際的編程中 ,根據(jù)理論的算法來實(shí)現(xiàn)具體的編程操作 。同時(shí)通過本次課程設(shè)計(jì)加深對操作系統(tǒng)理論知識各個(gè)部分管理功能的感性認(rèn)識 ,進(jìn)一步分析和理解各個(gè)部分之間的聯(lián)系和功能 ,最后達(dá)到對完整系統(tǒng)的理解 。同時(shí),可以提高運(yùn)用操作系統(tǒng)知識和解決實(shí)際問題的能力 ;并且鍛煉自己的編程能力 、創(chuàng)新能力以及開發(fā)軟件的能力 ;還能提高自己的調(diào)查研究 、查閱文獻(xiàn)、資料以及編寫軟件設(shè)計(jì)文檔的能力并提高分析問題的能力 。操作系統(tǒng)課程設(shè)計(jì)的主要任務(wù)是研究計(jì)算機(jī)操作系統(tǒng)的基本原理和算法 ,掌握操作系統(tǒng)的存儲器管理 、設(shè)備管理、文件管理和進(jìn)程管理的基本原理和算法 。使學(xué)生掌握基本的原理和方法,最后達(dá)到對完整系統(tǒng)的理解 。二、課程設(shè)計(jì)內(nèi)容仿真實(shí)現(xiàn)動(dòng)態(tài)可變分區(qū)存儲管理模擬系統(tǒng) 。內(nèi)存調(diào)度策略可采用首次適應(yīng)算法 、循環(huán)首次適應(yīng)算法和最佳適應(yīng)法等 ,并對各種算法進(jìn)行性能比較 。為了實(shí)現(xiàn)分區(qū)分配 ,系統(tǒng)中必須配置相應(yīng)的數(shù)據(jù)結(jié)構(gòu) ,用來描述空閑區(qū)和已分配區(qū)的情況 ,為分配提供依據(jù) 。常用的數(shù)據(jù)結(jié)構(gòu)有兩種形式 :空閑分區(qū)表和空閑分區(qū)鏈 。為把一個(gè)新作業(yè)裝入內(nèi)存 ,須按照一定的算法,從空閑分區(qū)表或空閑分區(qū)鏈中選出一個(gè)分區(qū)分配給該作業(yè) 。三、系統(tǒng)分析與設(shè)計(jì).專業(yè).整理.下載可編輯1、系統(tǒng)分析:動(dòng)態(tài)分區(qū)分配是根據(jù)進(jìn)程的實(shí)際需要 ,動(dòng)態(tài)地為之分配內(nèi)存空間 。在實(shí)現(xiàn)可變分區(qū)分配時(shí),將涉及到分區(qū)分配中所用的數(shù)據(jù)結(jié)構(gòu) 、分區(qū)分配算法和分區(qū)的分配和回收操作這樣三個(gè)問題。為了實(shí)現(xiàn)分區(qū)分配 ,系統(tǒng)中必須配置相應(yīng)的數(shù)據(jù)結(jié)構(gòu) ,用來描述空閑區(qū)和已分配區(qū)的情況,為分配提供依據(jù) 。常用的數(shù)據(jù)結(jié)構(gòu)有兩種形式 :空閑分區(qū)表和空閑分區(qū)鏈 。為把一個(gè)新作業(yè)裝入內(nèi)存 ,須按照一定的算法 ,從空閑分區(qū)表或空閑分區(qū)鏈中選出一個(gè)分區(qū)分配給該作業(yè) 。目前常用的分配算法有 :首次適應(yīng)算法 、循環(huán)首次適應(yīng)算法 、最佳適應(yīng)算法、最壞適應(yīng)算法和快速適應(yīng)算法 。在動(dòng)態(tài)分區(qū)存儲管理方式中 ,主要操作是分配內(nèi)存和回收內(nèi)存。2、系統(tǒng)設(shè)計(jì):系統(tǒng)利用某種分配算法 ,從空閑分區(qū)表中找到所需大小的分區(qū) 。設(shè)請求分區(qū)的大小為u.size,表中每個(gè)空閑分區(qū)的大小可表示為m.size,若m.size-u.size≤size(size為事先規(guī)定的不再切割的剩余分區(qū)的大?。┏闪?,則說明多余部分太小,可不再切割,將整個(gè)分區(qū)分配給請求者;否則,從該分區(qū)中按請求的大小劃分出一塊內(nèi)存空間分配出去,余下的部分留在空閑區(qū)表中,然后將分配區(qū)的首址返回給調(diào)用者。當(dāng)進(jìn)程運(yùn)行完畢釋放內(nèi)存時(shí),系統(tǒng)根據(jù)回收區(qū)的首址,從空閑區(qū)表中找到相應(yīng)的插入點(diǎn),并且按照四種情況進(jìn)行插入。3、模塊設(shè)計(jì):空閑區(qū)說明表結(jié)構(gòu):把空閑區(qū)定義為結(jié)構(gòu)體變量,包括空閑區(qū)始址,空閑區(qū)大小和空閑區(qū)狀態(tài),用0表示空表目,1為可用空閑塊。structfreearea{intstartaddress;/* 空閑區(qū)始址*/.專業(yè).整理.下載可編輯intsize;/*空閑區(qū)大小*/intstate;/* 空閑區(qū)狀態(tài):0為空表目,1為可用空閑塊 */}freeblock[N]= {{1,20,20,1},{2,80,50,1},{3,150,30,1},{4,300,30,1},{5,500,10,1}}; (2)為作業(yè)分配主存空間的函數(shù) alloc(),三個(gè)算法分別對應(yīng)三個(gè)分配主存空間的算法 。applyarea為作業(yè)申請量,tag為檢查是否有滿足作業(yè)需要的空閑區(qū)的標(biāo)志 。○1首次適應(yīng)算法 :檢查空閑區(qū)說明表是否有滿足作業(yè)要求的空閑區(qū)時(shí) ,如果大于作業(yè)要求 ,則分配給作業(yè) ,修改地址和空閑區(qū)大小 ,并將 tag 置“1”,表示有滿足作業(yè)要求的空閑區(qū) ,返回為作業(yè)分配主存的地址.程序如下所示:if(freeblock[i].state==1&&freeblock[i].size>applyarea){freeblock[i].startaddress=freeblock[i].startaddress+applyarea;freeblock[i].size=freeblock[i].size-applyarea;tag=1;returnfreeblock[i].startaddress-applyarea;}如果空閑區(qū)等于作業(yè)要求 ,則分配給作業(yè) ,修改地址和空閑區(qū)大小 ,并將tag置“1”,表示有滿足作業(yè)要求的空閑區(qū) ,返回為作業(yè)分配主存的地址 .if(freeblock[i].state==1&&freeblock[i].size==applyarea){freeblock[i].state=0;tag=1;returnfreeblock[i].startaddress;.專業(yè).整理.下載可編輯}如果沒有滿足條件的空閑區(qū) ,分配不成功,返回-1if(tag==0)return-1;2alloc()函數(shù)與首次適應(yīng)算法的alloc()函數(shù)區(qū)別在于從哪里開始找是○循環(huán)首次適應(yīng)算法的否有滿足作業(yè)要求的空閑區(qū),它是從上次找到的空閑區(qū)的下一個(gè)空閑分區(qū)開始找,只需要改變for循環(huán)的條件即可。for(i=s;i<N;i++)○3最佳適應(yīng)算法 :該算法總是把滿足要求 、又是最小的空閑區(qū)分配給作業(yè) 。檢查空閑區(qū)說明表是否有滿足作業(yè)要求的空閑區(qū) ,也分為三種情況 :大于,等于,小于。若檢查到有“等于”的情況,就可以直接分配 ,若沒有,則繼續(xù)檢查是否有 “大于”的情況:if(freeblock[i].state==1&&freeblock[i].size==applyarea){freeblock[i].state=0;tag=1;returnfreeblock[i].startaddress;}檢查“大于”的情況:先把所有大于所要求的空閑區(qū)放入數(shù)組 ,for(i=0;i<N;i++){if(freeblock[i].state==1&&freeblock[i].size>applyarea)a[j++]=i;}再從數(shù)組中挑出最小的那個(gè) :.專業(yè).整理.下載可編輯果數(shù)組中的元素大于一個(gè) ,則需要一個(gè)個(gè)比較過去 ,然后取出最小的那個(gè)分配給作業(yè) :if(j>1){h=a[0];min=freeblock[h];for(k=1;k<j;k++){h=a[k];if(freeblock[h].size<min.size){mid.size=freeblock[h].size;mid.state=freeblock[h].state;mid.startaddress=freeblock[h].startaddress;freeblock[h].size=min.size;freeblock[h].state=min.state;freeblock[h].startaddress=min.startaddress;min.size=mid.size;min.state=mid.state;min.startaddress=mid.startaddress;}}min.startaddress=min.startaddress+applyarea;.專業(yè).整理.下載可編輯min.size=min.size-applyarea;tag=1;returnmin.startaddress-applyarea;}如果數(shù)組中只有一個(gè)元素 ,則直接分配給作業(yè) :if(j==1){h=a[0];min=freeblock[h];min.startaddress=min.startaddress+applyarea;min.size=min.size-applyarea;tag=1;returnmin.startaddress-applyarea;}如果沒有滿足條件的空閑區(qū) ,分配不成功,返回-1if(tag==0)return-1;(3)主存回收函數(shù) setfree():tag1代表釋放區(qū)的高地址是否鄰接一個(gè)空閑區(qū) ,tag2代表釋放區(qū)的高低地址是否都鄰接一個(gè)空閑區(qū) ,tag3 代表釋放區(qū)的低地址是否鄰接一個(gè)空閑區(qū)。分為四種情況 :○1回收分區(qū)的上鄰和下鄰分區(qū)都不是空閑的 ,則直接將回收區(qū)的相關(guān)信息記錄在空閑區(qū)表中。if(tag3==0).專業(yè).整理.下載可編輯{for(j=0;j<N;j++){ if(freeblock[j].state==0){freeblock[j].startaddress=s;freeblock[j].size=l;freeblock[j].state=1;break;}}}○2回收分區(qū)的上鄰分區(qū)是空閑的 ,需要將這兩個(gè)相鄰的空閑區(qū)合并成一個(gè)較大的空閑區(qū) ,然后修改空閑區(qū)表 。if(freeblock[i].startaddress==s+l&&freeblock[i].state==1){l=l+freeblock[i].size;tag1=1;}○3回收分區(qū)的下鄰分區(qū)是空閑區(qū) ,需要將這兩個(gè)相鄰的空閑區(qū)合并成一個(gè)空閑區(qū) ,并修改閑區(qū)表。if(freeblock[i].startaddress+freeblock[i].size==s&&freeblock[i].state==1){.專業(yè).整理.下載可編輯freeblock[i].size=freeblock[i].size+l;tag3=1;break;}4回收分區(qū)的上鄰和下鄰都是空閑區(qū),則需要將這三個(gè)空閑區(qū)合并成一個(gè)更大的空閑○區(qū),2然后修改空閑區(qū)表。先判斷有上鄰空閑區(qū)(如○所示),再判斷有下鄰3空閑區(qū)(如○所示),若都有,則將tag2置1。(4)對空閑區(qū)表中的空閑區(qū)調(diào)整的函數(shù)adjust():使空閑區(qū)按始地址從小到大排列,空表目放在最后面。打印空閑區(qū)說明表函數(shù):print()(6)首次適應(yīng)算法函數(shù) First_fit():若有作業(yè)需要分配內(nèi)存 ,則對空閑區(qū)表中的空閑區(qū)進(jìn)行調(diào)整,調(diào)用調(diào)整函數(shù) adjust(),再將其打印出來 ;輸入作業(yè)申請量 ,調(diào)用alloc()函數(shù)為作業(yè)分配空間,分配結(jié)束后,要進(jìn)行主存回收 ,再次調(diào)整空閑區(qū)表后 ,打印出來。循環(huán)執(zhí)行直到?jīng)]有作業(yè)為止 。循環(huán)首次適應(yīng)算法Next_fit():與首次適應(yīng)算法不同的是,循環(huán)首次適應(yīng)算法要記錄上次找到的空閑區(qū)地址,并在下次分配時(shí)從這個(gè)地址開始。最佳時(shí)應(yīng)算法Best_fit():該算法在分配內(nèi)存時(shí),把所有滿足要求的空閑區(qū)中最小的那個(gè)空閑區(qū)分配給請求進(jìn)程。(9)主函數(shù)main():主要用于調(diào)用各個(gè)函數(shù)來實(shí)現(xiàn)各項(xiàng)功能和顯示主界面 。4、數(shù)據(jù)結(jié)構(gòu)說明:(1)空閑區(qū)說明表結(jié)構(gòu) structfreearea :把空閑區(qū)定義為結(jié)構(gòu)體變量 ,包括空閑區(qū)始址 ,空閑區(qū)大小和空閑區(qū)狀態(tài) ,用0表示空表目,1為可用空閑塊 。.專業(yè).整理.下載可編輯(2)為作業(yè)分配主存空間的函數(shù)alloc(),三個(gè)算法分別對應(yīng)三個(gè)分配主存空間的算法。applyarea為作業(yè)申請量,tag為檢查是否有滿足作業(yè)需要的空閑區(qū)的標(biāo)志。(3)主存回收函數(shù)setfree():tag1代表釋放區(qū)的高地址是否鄰接一個(gè)空閑區(qū),tag2代表釋放區(qū)的高低地址是否都鄰接一個(gè)空閑區(qū),tag3代表釋放區(qū)的低地址是否鄰接一個(gè)空閑區(qū)。分為四種情況。(4)對空閑區(qū)表中的空閑區(qū)調(diào)整的函數(shù)adjust():使空閑區(qū)按始地址從小到大排列,空表目放在最后面。打印空閑區(qū)說明表函數(shù):print()(6)首次適應(yīng)算法函數(shù) First_fit():若有作業(yè)需要分配內(nèi)存 ,則對空閑區(qū)表中的空閑區(qū)進(jìn)行調(diào)整,調(diào)用調(diào)整函數(shù) adjust(),再將其打印出來 ;輸入作業(yè)申請量 ,調(diào)用alloc()函數(shù)為作業(yè)分配空間,分配結(jié)束后,要進(jìn)行主存回收 ,再次調(diào)整空閑區(qū)表后 ,打印出來。循環(huán)執(zhí)行直到?jīng)]有作業(yè)為止 。循環(huán)首次適應(yīng)算法Next_fit():與首次適應(yīng)算法不同的是,循環(huán)首次適應(yīng)算法要記錄上次找到的空閑區(qū)地址,并在下次分配時(shí)從這個(gè)地址開始。最佳時(shí)應(yīng)算法Best_fit():該算法在分配內(nèi)存時(shí),把所有滿足要求的空閑區(qū)中最小的那個(gè)空閑區(qū)分配給請求進(jìn)程。(9)主函數(shù)main():主要用于調(diào)用各個(gè)函數(shù)來實(shí)現(xiàn)各項(xiàng)功能和顯示主界面 。5、算法流程圖.專業(yè).整理.下載可編輯從頭開始查表是檢索完畢?否
返回否繼續(xù)檢索下一個(gè)表項(xiàng)m.size>u.size?是是m.size-u.size≤size?否將該分區(qū)從表中移出從該分區(qū)中劃出 u.size大小的分區(qū)將該分區(qū)分配給請求者并修改有關(guān)數(shù)據(jù)結(jié)構(gòu)返回內(nèi)存分配流程.專業(yè).整理.下載可編輯開始否ch=1?是否First_fit() ch=2?是ch=3? Next_fit是Best_fit()是Choice=0?否否choice=1?是否分配內(nèi)存 Choice=2?是回收內(nèi)存 Choice=3?是查看空閑區(qū)表結(jié)束主函數(shù)流程圖四、模塊調(diào)試與系統(tǒng)測試.專業(yè).整理.下載可編輯1、模塊調(diào)試輸入的形式和輸入值的范圍首先打開主界面輸入整形常數(shù)選擇所要使用的算法 ,再根據(jù)界面上的提示內(nèi)容進(jìn)行輸入整形常數(shù)選擇所要進(jìn)行的操作 ,主要包括作業(yè)的申請量 、釋放的起始地址 、釋放區(qū)的大小。輸出的形式輸出形式主要包括空閑區(qū)表的狀態(tài) 、申請作業(yè)的起始地址和作業(yè)的申請量 。程序所能達(dá)到的功能程序所能達(dá)到的功能主要包括 :初始化空閑區(qū)表的狀態(tài) ,按照首次適應(yīng)算法 、循環(huán)首次適應(yīng)算法和最佳適應(yīng)算法對內(nèi)存空間進(jìn)行分配 ,對內(nèi)存空間進(jìn)行回收并輸出進(jìn)行各項(xiàng)操作后的空閑區(qū)表的狀態(tài) 。2、系統(tǒng)測試測試方法本系統(tǒng)采用黑盒測試方法進(jìn)行測試 。測試數(shù)據(jù)及測試報(bào)告試用例數(shù)據(jù) 預(yù)測結(jié)果 實(shí)際結(jié)果 是否相符合法: 成功進(jìn)入下一步 成功進(jìn)入下一步 相符輸入1—3進(jìn)行算法選擇非法: 顯示出錯(cuò)提示“有 顯示出錯(cuò)提示 “有 相符輸入1—3以外 誤,請重新輸入” 誤,請重新輸入”的數(shù)據(jù).專業(yè).整理.下載可編輯合法:成功選擇所要進(jìn)行成功選擇所要進(jìn)行的相符輸入0—3選擇的操作操作操作非法:顯示“輸入有誤,請顯示“輸入有誤,請相符輸入1—3以外重試”重試”的數(shù)據(jù)合法:顯示:申請作業(yè)的顯示:申請作業(yè)的起相符輸入分配內(nèi)存起始地址、申請量始地址、申請量和內(nèi)操作下的申請和內(nèi)存分配成功存分配成功量為20非法:顯示:作業(yè)申請量顯示:作業(yè)申請量過相符輸入內(nèi)存分配過大,分配失敗大,分配失敗操作下的申請量為603、調(diào)試分析:在調(diào)試過程中定義為作業(yè)分配主存的空間函數(shù) alloc2()時(shí)程序出現(xiàn)錯(cuò)誤 ,主要原因是由于for循環(huán)的編寫出現(xiàn)錯(cuò)誤 ,由于alloc2()與alloc()的主要差異就在于 for循環(huán),最終經(jīng)過查閱課本從根本上理解了首次適應(yīng)算法和循環(huán)首次適應(yīng)算法的本質(zhì)區(qū)別 ,最終使錯(cuò)誤得以解決程序正確運(yùn)行 。在編寫alloc3()時(shí),引入數(shù)組將總體情況分為大的兩種 ,并在數(shù)組中又分為兩種小的情況 。但是在考慮所有大于所要求的空閑區(qū)放入數(shù)組時(shí) ,落拉了只有一個(gè)數(shù)組的情況,最終經(jīng)過自己的仔細(xì)檢查和同學(xué)的幫助使錯(cuò)誤得以解決 。.專業(yè).整理.下載可編輯在編寫主存回收函數(shù) setfree()時(shí)由于對在空閑表中的適當(dāng)位置進(jìn)行插入時(shí)的情況考慮不全面,使得其中一種情況落拉導(dǎo)致編程出現(xiàn)錯(cuò)誤 ,最后經(jīng)過仔細(xì)閱讀課本和同學(xué)的幫助并在網(wǎng)上收索相關(guān)的知識使得錯(cuò)誤得以解決 。在編寫對空閑區(qū)表中的空閑區(qū)調(diào)整的函數(shù) adjust()時(shí)也多次出現(xiàn) 錯(cuò)誤,最終經(jīng)過同學(xué)的幫助和在網(wǎng)上收索相關(guān)知識 ,借鑒別人的算法使得錯(cuò)誤得以解決 。五、用戶手冊本系統(tǒng)是用 C++語言編寫的,使用Microsoft Visual C++平臺開發(fā),不需要安裝。經(jīng)運(yùn)行驗(yàn)證本程序可正常運(yùn)行 。具體使用步驟如下 :(1) 經(jīng)過編譯、鏈接無誤后便可正常運(yùn)行 ,出現(xiàn)主界面根據(jù)主界面上的顯示選擇所要使用的動(dòng)態(tài)分區(qū)分配算法。(2)選擇所要使用的算法之后就會顯示所要進(jìn)行的各項(xiàng)操作如下.專業(yè).整理.下載可編輯① 若選擇1分配內(nèi)存則根據(jù)界面提示輸入作業(yè)的申請量則會彈出申請作業(yè)的起始地址和作業(yè)的申請量② 若選擇2回收內(nèi)存則界面提示輸入釋放區(qū)的起始地址和釋放區(qū)的大小 ,輸入之后則會自動(dòng)顯示空閑區(qū)表的狀態(tài)③ 若選擇3查看空閑區(qū)表則輸入 3之后界面就會自動(dòng)顯示當(dāng)前的空閑區(qū)表的狀態(tài)④ 若選擇0退出則系統(tǒng)會回到剛開始的初始界面狀態(tài)重新選擇動(dòng)態(tài)分區(qū)分配的算法六、程序清單/*動(dòng)態(tài)分區(qū)的分配與回收演示程序 */#include <iostream.h>#include <stdio.h>#define N5.專業(yè).整理.下載可編輯int start;//存放首址struct freearea /*定義一個(gè)空閑區(qū)說明表結(jié)構(gòu) ,并初始化變量 */{int ID;/*分區(qū)號*/int startaddress;/* 空閑區(qū)始址*/int size;/*空閑區(qū)大小*/int state;/*空閑區(qū)狀態(tài):0為空表目,1為可用空閑塊 */}freeblock[N]={{1,20,20,1},{2,80,50,1},{3,150,30,1},{4,300,30,1},{5,500,10,1}};/*定義為作業(yè)分配主存空間的函數(shù) alloc(),給首次適應(yīng)算法調(diào)用 */int alloc(int applyarea){int i,tag=0; /*applyarea 為作業(yè)申請量 ,tag為檢查是否有滿足作業(yè)需要的空閑區(qū)的標(biāo)志 */for(i=0;i<N;i++) /*檢查空閑區(qū)說明表是否有滿足作業(yè)要求的空閑區(qū) */if(freeblock[i].state==1&&freeblock[i].size>applyarea){freeblock[i].startaddress=freeblock[i].startaddress+applyarea;freeblock[i].size=freeblock[i].size-applyarea;tag=1; /*有滿足條件的空閑區(qū)時(shí) ,tag置1*/return freeblock[i].startaddress-applyarea; /*返回為作業(yè)分配的主存地址*/.專業(yè).整理.下載可編輯}elseif(freeblock[i].state==1&&freeblock[i].size==applyarea){freeblock[i].state=0;tag=1; /*有滿足條件的空閑區(qū)時(shí) ,tag置1*/return freeblock[i].startaddress; /*返回為作業(yè)分配的主存地址 */}if(tag==0)return -1; /*沒有滿足條件的空閑區(qū) ,分配不成功,返回-1*/}/*定義為作業(yè)分配主存空間的函數(shù) alloc2(),給循環(huán)首次適應(yīng)算法調(diào)用 */int alloc2(int applyarea,int s) /*applyarea 為作業(yè)申請量*/{int i,tag=0; /*tag 為檢查是否有滿足作業(yè)需要的空閑區(qū)的標(biāo)志 */for(i=s;i<N;i++)/* 檢查空閑區(qū)說明表是否有滿足作業(yè)要求的空閑區(qū) ,從上次找到的空閑去的下一個(gè)空閑分區(qū)開始找 */if(freeblock[i].state==1&&freeblock[i].size>applyarea){freeblock[i].startaddress=freeblock[i].startaddress+applyarea;freeblock[i].size=freeblock[i].size-applyarea;.專業(yè).整理.下載可編輯tag=1; /*有滿足條件的空閑區(qū)時(shí) ,tag置1*/start=freeblock[i].startaddress-applyarea;return i;}elseif(freeblock[i].state==1&&freeblock[i].size==applyarea){freeblock[i].state=0;tag=1; /*有滿足條件的空閑區(qū)時(shí) ,tag置1*/start=freeblock[i].startaddress; /*返回為作業(yè)分配的主存地址 */return i;}if(tag==0)return -1; /*沒有滿足條件的空閑區(qū) ,分配不成功,返回-1*/}/*定義為作業(yè)分配主存空間的函數(shù) alloc3(),給最佳適應(yīng)算法調(diào)用 */int alloc3(int applyarea) /*applyarea 為作業(yè)申請量 */{int i,k,h,flag,tag=0,j=0; /*tag 為檢查是否有滿足作業(yè)需要的空閑區(qū)的標(biāo)志*/int a[N];.專業(yè).整理.下載可編輯struct freearea min;struct freearea mid;for(i=0;i<N;i++) /*檢查空閑區(qū)說明表是否有滿足作業(yè)要求的空閑區(qū) */{if(freeblock[i].state==1&&freeblock[i].size==applyarea)// 大小剛好相等{freeblock[i].state=0;tag=1; /*有滿足條件的空閑區(qū)時(shí) ,tag置1*/return freeblock[i].startaddress; /*返回為作業(yè)分配的主存地址 */}}for(i=0;i<N;i++)// 把所有大于所要求的空閑區(qū)放入數(shù)組 ,挑出最小的那個(gè){if(freeblock[i].state==1&&freeblock[i].size>applyarea)a[j++]=i;}if(j>1){h=a[0];min=freeblock[h];//min.startaddress=freeblock[h].startaddress;//min.size=freeblock[h].size;//min.state=freeblock[h].stat.專業(yè).整理.下載可編輯for(k=1;k<j;k++){h=a[k];if(freeblock[h].size<min.size){mid.size=freeblock[h].size;mid.state=freeblock[h].state;mid.startaddress=freeblock[h].startaddress;freeblock[h].size=min.size;freeblock[h].state=min.state;freeblock[h].startaddress=min.startaddress;min.size=mid.size;min.state=mid.state;min.startaddress=mid.startaddress;}}min.startaddress=min.startaddress+applyarea;min.size=min.size-applyarea;tag=1; /*有滿足條件的空閑區(qū)時(shí) ,tag置1*/return min.startaddress-applyarea;}.專業(yè).整理.下載可編輯elseif(j==1){h=a[0];min=freeblock[h];min.startaddress=min.startaddress+applyarea;min.size=min.size-applyarea;tag=1;/*有滿足條件的空閑區(qū)時(shí) ,tag置1*/return min.startaddress-applyarea;}if(tag==0)return -1; /*沒有滿足條件的空閑區(qū) ,分配不成功,返回-1*/}/*定義主存回收函數(shù) :setfree()tag1代表釋放區(qū)的高地址是否鄰接一個(gè)空閑區(qū),tag2代表釋放區(qū)的高低地址是否都鄰接一個(gè)空閑區(qū),tag3代表釋放區(qū)的低地址是否鄰接一個(gè)空閑區(qū)*/voidsetfree(){int s,l,tag1=0,tag2=0,tag3=0,i,j;printf("請輸入釋放區(qū)的起始地址 :");scanf("%d",&s); /*輸入釋放區(qū)的開始地址 */.專業(yè).整理.下載可編輯printf("請輸入釋放區(qū)的大小 :");scanf("%d",&l); /*輸入釋放區(qū)的大小 */printf("************ 回收內(nèi)存后空閑區(qū)表的狀態(tài)如下 **********\n");for(i=0;i<N;i++){if(freeblock[i].startaddress==s+l&&freeblock[i].state==1){l=l+freeblock[i].size;tag1=1; /*有與釋放區(qū)高地址鄰接的空閑區(qū) ,tag1置1*/for(j=0;j<N;j++)if(freeblock[j].startaddress+freeblock[j].size==s&&freeblock[j].state==1){freeblock[i].state=0;freeblock[j].size=freeblock[j].size+l;tag2=1;/* 有與釋放區(qū)上下都鄰接的空閑區(qū) ,tag2置1*/break;}if(tag2==0) /*無與釋放區(qū)高低地址鄰接的空閑區(qū) */{freeblock[i].startaddress=s;.專業(yè).整理.下載可編輯freeblock[i].size=l;break;}}}if(tag1==0)/* 無與釋放區(qū)高地址鄰接的空閑區(qū) ,并檢查是否低地址有鄰接空閑區(qū) */{for(i=0;i<N;i++)if(freeblock[i].startaddress+freeblock[i].size==s&&freeblock[i].state==1){freeblock[i].size=freeblock[i].size+l;tag3=1; /*有與釋放區(qū)低地址鄰接的空閑區(qū) */break;}if(tag3==0) /*無與釋放區(qū)低地址鄰接的空閑區(qū) */for(j=0;j<N;j++)if(freeblock[j].state==0)/* 找一個(gè)空表目 ,將釋放區(qū)放入表中 */{freeblock[j].startaddress=s;freeblock[j].size=l;freeblock[j].state=1;.專業(yè).整理.下載可編輯break;}}}/*定義對空閑區(qū)表中的空閑區(qū)調(diào)整的函數(shù) adjust(),使空閑區(qū)按始地址從小到大排列 ,空表目放在最后面 */void adjust(){int i,j;struct freearea middata;for(i=0;i<N;i++) /*將空閑區(qū)按始地址順序在表中排列 */for(j=0;j<N;j++)if(freeblock[j].startaddress>freeblock[j+1].startaddress){middata.startaddress=freeblock[j].startaddress;middata.size=freeblock[j].size;middata.state=freeblock[j].state;freeblock[j].startaddress=freeblock[j+1].startaddress;freeblock[j].size=freeblock[j+1].size;freeblock[j].state=freeblock[j+1].state;freeblock[j+1].startaddress=middata.startaddress;freeblock[j+1].size=middata.size;.專業(yè).整理.下載可編輯freeblock[j+1].state=middata.state;}for(i=0;i<N;i++) /*將空表目放在表后面 */for(j=0;j<N;j++)if(freeblock[j].state==0&&freeblock[j+1].state==1){middata.startaddress=freeblock[j].startaddress;middata.size=freeblock[j].size;middata.state=freeblock[j].state;freeblock[j].startaddress=freeblock[j+1].startaddress;freeblock[j].size=freeblock[j+1].size;freeblock[j].state=freeblock[j+1].state;freeblock[j+1].startaddress=middata.startaddress;freeblock[j+1].size=middata.size;freeblock[j+1].state=middata.state;}}/*定義打印空閑區(qū)說明表函數(shù) :print()*/void print(){int i;printf(" |---------------------------------------------------------------|\n");.專業(yè).整理.下載可編輯printf(" | ID start size state |\n");printf(" |---------------------------------------------------------------|\n");for(i=0;i<N;i++){printf(" | %3d %3d %3d %3d|\n",freeblock[i].ID,freeblock[i].startaddress,freeblock[i].size,freeblock[i].state);printf(" |---------------------------------------------------------------|\n");}}首次void First_fit(){int applyarea,start;{printf("請輸入作業(yè)的申請量 :");scanf("%d",&applyarea);/* 輸入作業(yè)的申請量 */start=alloc(applyarea);/* 調(diào)用alloc()函數(shù)為作業(yè)分配空間 ,start為返回的始地址*/if(start==-1) /*alloc()分配不成功時(shí),返回-1*/printf("作業(yè)申請量過大 ,空閑區(qū)表中的存儲空間無法滿足 ,分配失敗\n");.專業(yè).整理.下載可編輯else{adjust();printf("申請作業(yè)的起始地址為 :%d\n",start);printf("作業(yè)的申請量為 :%d\n",applyarea);printf("內(nèi)存分配成功 \n");}}}循環(huán)首次void Next_fit(){int applyarea,i=0;printf("請輸入作業(yè)的申請量 :");scanf("%d",&applyarea);/* 輸入作業(yè)的申請量 */if(i==N-1){i=alloc2(applyarea,i);if(i==-1)i=0;}elseif(i<N-1).專業(yè).整理.下載可編輯i=alloc2(applyarea,i);//start=alloc2(applyarea,start);/* 調(diào)用alloc2()函數(shù)為作業(yè)分配空間 ,start為返回的始地址*/if(i==-1) /*alloc2()分配不成功時(shí),返回-1*/printf("作業(yè)申請量過大 ,空閑區(qū)表中的存儲空間無法滿足 ,分配失敗\n");else{adjust();printf("申請作業(yè)的起始地址為 :%d\n",start);printf("作業(yè)的申請量為 :%d\n",applyarea);printf("內(nèi)存分配成功 \n");}}最佳void Best_fit(){int applyarea,start;printf("請輸入作業(yè)的申請量 :");scanf("%d",&applyarea);/* 輸入作業(yè)的申請量 */start=alloc3(applyarea);/* 調(diào)用alloc()函數(shù)為作業(yè)分配空間 ,start為返回的始地址*/.專業(yè).整理.下載可編輯if(start==-1) /*alloc()分配不成功時(shí),返回-1*/printf("作業(yè)申請量過大 ,空閑區(qū)表中的存儲空間無法滿足 ,分配失敗\n");else{adjust();printf("申請作業(yè)的起始地址為 :%d\n",start);printf("作業(yè)的申請量為 :%d\n",applyarea);printf("內(nèi)存分配成功 \n");}}/*主函數(shù)*/void main(){loop:int ch;//算法選擇標(biāo)記cout<<" 動(dòng)態(tài)分區(qū)分配方式的模擬 \n";cout<<"*********************************************************\n";cout<<"** 1)首次適應(yīng)算法 2)循環(huán)首次適應(yīng)算法 3)最佳適應(yīng)算法 **\n";cout<<"*********************************************************\n";cout<<" 請選擇分配算法 :";cin>>ch;intchoice; //操作選擇標(biāo)記.專業(yè).整理.下載可編輯while(1){cout<<"*************************************************\n";cout<<"** 1:分配內(nèi)存 2:回收內(nèi)存 **\n";cout<<"** 3:查看空閑分區(qū)表 0:退 出 **\n";cout<<"*************************************************\n";cout<<" 請輸入您的操作 :";cin>>choice;if(choice==1) // 分配內(nèi)存{int ch;if(ch==1){First_fit();}if(ch==2){Next_fit();}else{Best_fit();
溫馨提示
- 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年群路密碼機(jī)系列合作協(xié)議書
- 人教版一年級語文下冊《吃水不忘挖井人》教學(xué)設(shè)計(jì)
- 2025年速凍丸類制品合作協(xié)議書
- 2025年個(gè)體診所合作協(xié)議(三篇)
- 2025年買賣別墅合同模板(三篇)
- 2025年產(chǎn)品區(qū)域代理合同協(xié)議常用版(2篇)
- 2025年產(chǎn)品設(shè)計(jì)合同(三篇)
- 2025年二年級教研組工作總結(jié)(2篇)
- 2025年個(gè)人幼兒園的課題總結(jié)范文(二篇)
- 2025年個(gè)人房屋防水施工合同模板(2篇)
- 城市隧道工程施工質(zhì)量驗(yàn)收規(guī)范
- 2025年湖南高速鐵路職業(yè)技術(shù)學(xué)院高職單招高職單招英語2016-2024年參考題庫含答案解析
- 五 100以內(nèi)的筆算加、減法2.筆算減法 第1課時(shí) 筆算減法課件2024-2025人教版一年級數(shù)學(xué)下冊
- 2025江蘇太倉水務(wù)集團(tuán)招聘18人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2024-2025學(xué)年人教新版高二(上)英語寒假作業(yè)(五)
- 2025年八省聯(lián)考陜西高考生物試卷真題答案詳解(精校打印)
- 石油化工、煤化工、天然氣化工優(yōu)劣勢分析
- Q∕GDW 12118.3-2021 人工智能平臺架構(gòu)及技術(shù)要求 第3部分:樣本庫格式
- 客戶的分級管理培訓(xùn)(共60頁).ppt
- 廣東省義務(wù)教育階段學(xué)生轉(zhuǎn)學(xué)轉(zhuǎn)出申請表(樣本)
- 如何成為一個(gè)優(yōu)秀的生產(chǎn)經(jīng)理
評論
0/150
提交評論