操作系統(tǒng)課程設(shè)計報告動態(tài)分區(qū)分配

上傳人:搶*** 文檔編號:108489109 上傳時間:2022-06-15 格式:DOC 頁數(shù):19 大?。?84KB
收藏 版權(quán)申訴 舉報 下載
操作系統(tǒng)課程設(shè)計報告動態(tài)分區(qū)分配_第1頁
第1頁 / 共19頁
操作系統(tǒng)課程設(shè)計報告動態(tài)分區(qū)分配_第2頁
第2頁 / 共19頁
操作系統(tǒng)課程設(shè)計報告動態(tài)分區(qū)分配_第3頁
第3頁 / 共19頁

下載文檔到電腦,查找使用更方便

10 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《操作系統(tǒng)課程設(shè)計報告動態(tài)分區(qū)分配》由會員分享,可在線閱讀,更多相關(guān)《操作系統(tǒng)課程設(shè)計報告動態(tài)分區(qū)分配(19頁珍藏版)》請在裝配圖網(wǎng)上搜索。

1、青島理工大學(xué)操作系統(tǒng)課程設(shè)計報告院(系): 計算機工程學(xué)院 專業(yè): 計算機科學(xué)與技術(shù)專業(yè) 學(xué)生姓名: 牛利利 班級: 計算073 學(xué)號: 200707106 題目: 動態(tài)分區(qū)分配模擬 起迄日期: 2010年7月5日至7月16日 設(shè)計地點: 2號實驗樓402室 指 導(dǎo) 教 師: 李 蘭 20092010年度 第 2 學(xué)期完成日期: 2010 年 7 月 16 日一、 課程設(shè)計目的操作系統(tǒng)是最重要的計算機系統(tǒng)軟件,同時也是最活躍的學(xué)科之一。計算機系統(tǒng)由硬件和軟件兩部分組成。操作系統(tǒng)是配置在計算機硬件上的第一層軟件,是對硬件的首次擴充。本次課程設(shè)計的主要目的是在學(xué)習(xí)操作系統(tǒng)理論知識的基礎(chǔ)上,對操作系

2、統(tǒng)整體的一個模擬。也是對本學(xué)期所學(xué)知識的一個總體的檢測,使理論知識應(yīng)用到實際的編程中,根據(jù)理論的算法來實現(xiàn)具體的編程操作。同時通過本次課程設(shè)計加深對操作系統(tǒng)理論知識各個部分管理功能的感性認識,進一步分析和理解各個部分之間的聯(lián)系和功能,最后達到對完整系統(tǒng)的理解。同時,可以提高運用操作系統(tǒng)知識和解決實際問題的能力;并且鍛煉自己的編程能力、創(chuàng)新能力以及開發(fā)軟件的能力;還能提高自己的調(diào)查研究、查閱文獻、資料以及編寫軟件設(shè)計文檔的能力并提高分析問題的能力。操作系統(tǒng)課程設(shè)計的主要任務(wù)是研究計算機操作系統(tǒng)的基本原理和算法,掌握操作系統(tǒng)的存儲器管理、設(shè)備管理、文件管理和進程管理的基本原理和算法。使學(xué)生掌握基本

3、的原理和方法,最后達到對完整系統(tǒng)的理解。二、 課程設(shè)計內(nèi)容仿真實現(xiàn)動態(tài)可變分區(qū)存儲管理模擬系統(tǒng)。內(nèi)存調(diào)度策略可采用首次適應(yīng)算法、循環(huán)首次適應(yīng)算法和最佳適應(yīng)法等,并對各種算法進行性能比較。為了實現(xiàn)分區(qū)分配,系統(tǒng)中必須配置相應(yīng)的數(shù)據(jù)結(jié)構(gòu),用來描述空閑區(qū)和已分配區(qū)的情況,為分配提供依據(jù)。常用的數(shù)據(jù)結(jié)構(gòu)有兩種形式:空閑分區(qū)表和空閑分區(qū)鏈。為把一個新作業(yè)裝入內(nèi)存,須按照一定的算法,從空閑分區(qū)表或空閑分區(qū)鏈中選出一個分區(qū)分配給該作業(yè)。三、 系統(tǒng)分析與設(shè)計1、系統(tǒng)分析:動態(tài)分區(qū)分配是根據(jù)進程的實際需要,動態(tài)地為之分配內(nèi)存空間。在實現(xiàn)可變分區(qū)分配時,將涉及到分區(qū)分配中所用的數(shù)據(jù)結(jié)構(gòu)、分區(qū)分配算法和分區(qū)的分配和

4、回收操作這樣三個問題。為了實現(xiàn)分區(qū)分配,系統(tǒng)中必須配置相應(yīng)的數(shù)據(jù)結(jié)構(gòu),用來描述空閑區(qū)和已分配區(qū)的情況,為分配提供依據(jù)。常用的數(shù)據(jù)結(jié)構(gòu)有兩種形式:空閑分區(qū)表和空閑分區(qū)鏈。為把一個新作業(yè)裝入內(nèi)存,須按照一定的算法,從空閑分區(qū)表或空閑分區(qū)鏈中選出一個分區(qū)分配給該作業(yè)。目前常用的分配算法有:首次適應(yīng)算法、循環(huán)首次適應(yīng)算法、最佳適應(yīng)算法、最壞適應(yīng)算法和快速適應(yīng)算法。在動態(tài)分區(qū)存儲管理方式中,主要操作是分配內(nèi)存和回收內(nèi)存。2、系統(tǒng)設(shè)計: 系統(tǒng)利用某種分配算法,從空閑分區(qū)表中找到所需大小的分區(qū)。設(shè)請求分區(qū)的大小為u.size,表中每個空閑分區(qū)的大小可表示為m.size,若 m.size-u.sizesize

5、(size為事先規(guī)定的不再切割的剩余分區(qū)的大?。┏闪?,則說明多余部分太小,可不再切割,將整個分區(qū)分配給請求者;否則,從該分區(qū)中按請求的大小劃分出一塊內(nèi)存空間分配出去,余下的部分留在空閑區(qū)表中,然后將分配區(qū)的首址返回給調(diào)用者。當(dāng)進程運行完畢釋放內(nèi)存時,系統(tǒng)根據(jù)回收區(qū)的首址,從空閑區(qū)表中找到相應(yīng)的插入點,并且按照四種情況進行插入。3、模塊設(shè)計:(1) 空閑區(qū)說明表結(jié)構(gòu):把空閑區(qū)定義為結(jié)構(gòu)體變量,包括空閑區(qū)始址,空閑區(qū)大小和空閑區(qū)狀態(tài),用0表示空表目,1為可用空閑塊。struct freearea int startaddress;/*空閑區(qū)始址*/ int size;/*空閑區(qū)大小*/ int s

6、tate;/*空閑區(qū)狀態(tài):0為空表目,1為可用空閑塊*/freeblockN= 1,20,20,1,2,80,50,1,3,150,30,1,4,300,30,1,5,500,10,1; (2) 為作業(yè)分配主存空間的函數(shù)alloc(),三個算法分別對應(yīng)三個分配主存空間的算法。applyarea為作業(yè)申請量,tag為檢查是否有滿足作業(yè)需要的空閑區(qū)的標(biāo)志。首次適應(yīng)算法:檢查空閑區(qū)說明表是否有滿足作業(yè)要求的空閑區(qū)時,如果大于作業(yè)要求,則分配給作業(yè),修改地址和空閑區(qū)大小,并將tag置“1”,表示有滿足作業(yè)要求的空閑區(qū),返回為作業(yè)分配主存的地址.程序如下所示:if(freeblocki.state=1&

7、freeblocki.sizeapplyarea)freeblocki.startaddress=freeblocki.startaddress+applyarea; freeblocki.size=freeblocki.size-applyarea; tag=1; return freeblocki.startaddress-applyarea;如果空閑區(qū)等于作業(yè)要求,則分配給作業(yè),修改地址和空閑區(qū)大小,并將tag置“1”,表示有滿足作業(yè)要求的空閑區(qū),返回為作業(yè)分配主存的地址.if(freeblocki.state=1&freeblocki.size=applyarea) freeblock

8、i.state=0; tag=1; return freeblocki.startaddress;如果沒有滿足條件的空閑區(qū),分配不成功,返回-1if(tag=0)return -1;循環(huán)首次適應(yīng)算法的alloc()函數(shù)與首次適應(yīng)算法的alloc()函數(shù)區(qū)別在于從哪里開始找是否有滿足作業(yè)要求的空閑區(qū),它是從上次找到的空閑區(qū)的下一個空閑分區(qū)開始找,只需要改變for循環(huán)的條件即可。for(i=s;iN;i+)最佳適應(yīng)算法:該算法總是把滿足要求、又是最小的空閑區(qū)分配給作業(yè)。檢查空閑區(qū)說明表是否有滿足作業(yè)要求的空閑區(qū),也分為三種情況:大于,等于,小于。若檢查到有“等于”的情況,就可以直接分配,若沒有,則

9、繼續(xù)檢查是否有“大于”的情況:if(freeblocki.state=1&freeblocki.size=applyarea) freeblocki.state=0; tag=1; return freeblocki.startaddress; 檢查“大于”的情況:先把所有大于所要求的空閑區(qū)放入數(shù)組,for(i=0;iapplyarea)aj+=i;再從數(shù)組中挑出最小的那個:果數(shù)組中的元素大于一個,則需要一個個比較過去,然后取出最小的那個分配給作業(yè):if(j1) h=a0; min=freeblockh; for(k=1;kj;k+) h=ak; if(freeblockh.sizemin.s

10、ize) mid.size=freeblockh.size; mid.state=freeblockh.state; mid.startaddress=freeblockh.startaddress; freeblockh.size=min.size; freeblockh.state=min.state; freeblockh.startaddress=min.startaddress; min.size=mid.size; min.state=mid.state; min.startaddress=mid.startaddress; min.startaddress=min.startad

11、dress+applyarea; min.size=min.size-applyarea; tag=1; return min.startaddress-applyarea; 如果數(shù)組中只有一個元素,則直接分配給作業(yè):if(j=1) h=a0; min=freeblockh; min.startaddress=min.startaddress+applyarea; min.size=min.size-applyarea; tag=1; return min.startaddress-applyarea; 如果沒有滿足條件的空閑區(qū),分配不成功,返回-1if(tag=0)return -1; (3

12、) 主存回收函數(shù)setfree():tag1代表釋放區(qū)的高地址是否鄰接一個空閑區(qū),tag2代表釋放區(qū)的高低地址是否都鄰接一個空閑區(qū),tag3代表釋放區(qū)的低地址是否鄰接一個空閑區(qū)。分為四種情況:回收分區(qū)的上鄰和下鄰分區(qū)都不是空閑的,則直接將回收區(qū)的相關(guān)信息記錄在空閑區(qū)表中。if(tag3=0)for(j=0;ju.size?m.size-u.sizesize?從該分區(qū)中劃出u.size大小的分區(qū)將該分區(qū)分配給請求者并修改有關(guān)數(shù)據(jù)結(jié)構(gòu)返回返回繼續(xù)檢索下一個表項將該分區(qū)從表中移出 內(nèi)存分配流程 是否是否是是否是否否是是開始ch=1?First_fit()ch=2?Next_fit()ch=3?Bes

13、t_fit()Choice=0?choice=1?分配內(nèi)存Choice=2?回收內(nèi)存Choice=3?查看空閑區(qū)表結(jié)束 主函數(shù)流程圖四、 模塊調(diào)試與系統(tǒng)測試1、模塊調(diào)試l 輸入的形式和輸入值的范圍 首先打開主界面輸入整形常數(shù)選擇所要使用的算法,再根據(jù)界面上的提示內(nèi)容進行輸入整形常數(shù)選擇所要進行的操作,主要包括作業(yè)的申請量、釋放的起始地址、釋放區(qū)的大小。l 輸出的形式 輸出形式主要包括空閑區(qū)表的狀態(tài)、申請作業(yè)的起始地址和作業(yè)的申請量。l 程序所能達到的功能 程序所能達到的功能主要包括:初始化空閑區(qū)表的狀態(tài),按照首次適應(yīng)算法、循環(huán)首次適應(yīng)算法和最佳適應(yīng)算法對內(nèi)存空間進行分配,對內(nèi)存空間進行回收并輸

14、出進行各項操作后的空閑區(qū)表的狀態(tài)。2、系統(tǒng)測試l 測試方法本系統(tǒng)采用黑盒測試方法進行測試。l 測試數(shù)據(jù)及測試報告試用例數(shù)據(jù)預(yù)測結(jié)果實際結(jié)果是否相符合法:輸入13進行算法選擇成功進入下一步成功進入下一步相符非法:輸入13以外的數(shù)據(jù)顯示出錯提示“有誤,請重新輸入”顯示出錯提示“有誤,請重新輸入”相符合法:輸入03選擇操作成功選擇所要進行的操作成功選擇所要進行的操作相符非法:輸入13以外的數(shù)據(jù)顯示“輸入有誤,請重試”顯示“輸入有誤,請重試”相符合法:輸入分配內(nèi)存操作下的申請量為20顯示:申請作業(yè)的起始地址、申請量和內(nèi)存分配成功顯示:申請作業(yè)的起始地址、申請量和內(nèi)存分配成功相符非法:輸入內(nèi)存分配操作下

15、的申請量為60顯示:作業(yè)申請量過大,分配失敗顯示:作業(yè)申請量過大,分配失敗相符3、調(diào)試分析:在調(diào)試過程中定義為作業(yè)分配主存的空間函數(shù)alloc2()時程序出現(xiàn)錯誤,主要原因是由于for循環(huán)的編寫出現(xiàn)錯誤,由于alloc2()與alloc()的主要差異就在于for循環(huán),最終經(jīng)過查閱課本從根本上理解了首次適應(yīng)算法和循環(huán)首次適應(yīng)算法的本質(zhì)區(qū)別,最終使錯誤得以解決程序正確運行。在編寫alloc3()時,引入數(shù)組將總體情況分為大的兩種,并在數(shù)組中又分為兩種小的情況。但是在考慮所有大于所要求的空閑區(qū)放入數(shù)組時,落拉了只有一個數(shù)組的情況,最終經(jīng)過自己的仔細檢查和同學(xué)的幫助使錯誤得以解決。在編寫主存回收函數(shù)s

16、etfree()時由于對在空閑表中的適當(dāng)位置進行插入時的情況考慮不全面,使得其中一種情況落拉導(dǎo)致編程出現(xiàn)錯誤,最后經(jīng)過仔細閱讀課本和同學(xué)的幫助并在網(wǎng)上收索相關(guān)的知識使得錯誤得以解決。在編寫對空閑區(qū)表中的空閑區(qū)調(diào)整的函數(shù)adjust()時也多次出現(xiàn) 錯誤,最終經(jīng)過同學(xué)的幫助和在網(wǎng)上收索相關(guān)知識,借鑒別人的算法使得錯誤得以解決。五、 用戶手冊本系統(tǒng)是用C+語言編寫的,使用Microsoft Visual C+平臺開發(fā),不需要安裝。經(jīng)運行驗證本程序可正常運行。具體使用步驟如下:(1) 經(jīng)過編譯、鏈接無誤后便可正常運行,出現(xiàn)主界面 根據(jù)主界面上的顯示選擇所要使用的動態(tài)分區(qū)分配算法。(2) 選擇所要使用

17、的算法之后就會顯示所要進行的各項操作如下 若選擇1分配內(nèi)存則根據(jù)界面提示輸入作業(yè)的申請量則會彈出申請作業(yè)的起始地址和作業(yè)的申請量 若選擇2回收內(nèi)存則界面提示輸入釋放區(qū)的起始地址和釋放區(qū)的大小,輸入之后則會自動顯示空閑區(qū)表的狀態(tài) 若選擇3查看空閑區(qū)表則輸入3之后界面就會自動顯示當(dāng)前的空閑區(qū)表的狀態(tài) 若選擇0退出則系統(tǒng)會回到剛開始的初始界面狀態(tài)重新選擇動態(tài)分區(qū)分配的算法六、 程序清單/*動態(tài)分區(qū)的分配與回收演示程序*/#include #include #define N 5int start;/存放首址 struct freearea/*定義一個空閑區(qū)說明表結(jié)構(gòu),并初始化變量*/ int ID;

18、/*分區(qū)號*/ int startaddress;/*空閑區(qū)始址*/ int size;/*空閑區(qū)大小*/ int state;/*空閑區(qū)狀態(tài):0為空表目,1為可用空閑塊*/freeblockN=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;iapplyarea) freeblocki.sta

19、rtaddress=freeblocki.startaddress+applyarea; freeblocki.size=freeblocki.size-applyarea; tag=1;/*有滿足條件的空閑區(qū)時,tag置1*/ return freeblocki.startaddress-applyarea; /*返回為作業(yè)分配的主存地址*/elseif(freeblocki.state=1&freeblocki.size=applyarea) freeblocki.state=0; tag=1;/*有滿足條件的空閑區(qū)時,tag置1*/ return freeblocki.startaddr

20、ess;/*返回為作業(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;iapplyarea) freeblocki.startaddress=freeblocki.startaddress+applyarea; freeblocki.size=freeblocki.siz

21、e-applyarea; tag=1;/*有滿足條件的空閑區(qū)時,tag置1*/ start=freeblocki.startaddress-applyarea; return i;else if(freeblocki.state=1&freeblocki.size=applyarea) freeblocki.state=0; tag=1;/*有滿足條件的空閑區(qū)時,tag置1*/ start=freeblocki.startaddress;/*返回為作業(yè)分配的主存地址*/ return i; if(tag=0)return -1;/*沒有滿足條件的空閑區(qū),分配不成功,返回-1*/ /*定義為作業(yè)

22、分配主存空間的函數(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 aN; struct freearea min; struct freearea mid; for(i=0;iN;i+)/*檢查空閑區(qū)說明表是否有滿足作業(yè)要求的空閑區(qū)*/ if(freeblocki.state=1&freeblocki.size=applyarea)/大小剛好相等 freeblocki.state=0; tag=1;/*

23、有滿足條件的空閑區(qū)時,tag置1*/ return freeblocki.startaddress;/*返回為作業(yè)分配的主存地址*/ for(i=0;iapplyarea)aj+=i; if(j1) h=a0; min=freeblockh; /min.startaddress=freeblockh.startaddress; /min.size=freeblockh.size; /min.state=freeblockh.stat for(k=1;kj;k+) h=ak; if(freeblockh.sizemin.size) mid.size=freeblockh.size; mid.st

24、ate=freeblockh.state; mid.startaddress=freeblockh.startaddress; freeblockh.size=min.size; freeblockh.state=min.state; freeblockh.startaddress=min.startaddress; min.size=mid.size; min.state=mid.state; min.startaddress=mid.startaddress; min.startaddress=min.startaddress+applyarea; min.size=min.size-ap

25、plyarea; tag=1;/*有滿足條件的空閑區(qū)時,tag置1*/ return min.startaddress-applyarea; else if(j=1) h=a0; min=freeblockh; min.startaddress=min.startaddress+applyarea; min.size=min.size-applyarea; tag=1;/*有滿足條件的空閑區(qū)時,tag置1*/ return min.startaddress-applyarea; if(tag=0)return -1;/*沒有滿足條件的空閑區(qū),分配不成功,返回-1*/*定義主存回收函數(shù):setf

26、ree()tag1代表釋放區(qū)的高地址是否鄰接一個空閑區(qū),tag2代表釋放區(qū)的高低地址是否都鄰接一個空閑區(qū),tag3代表釋放區(qū)的低地址是否鄰接一個空閑區(qū)*/void setfree() int s,l,tag1=0,tag2=0,tag3=0,i,j; printf(請輸入釋放區(qū)的起始地址:); scanf(%d,&s);/*輸入釋放區(qū)的開始地址*/ printf(請輸入釋放區(qū)的大小:); scanf(%d,&l);/*輸入釋放區(qū)的大小*/ printf(*回收內(nèi)存后空閑區(qū)表的狀態(tài)如下*n); for(i=0;iN;i+) if(freeblocki.startaddress=s+l&freeb

27、locki.state=1) l=l+freeblocki.size; tag1=1;/*有與釋放區(qū)高地址鄰接的空閑區(qū),tag1置1*/ for(j=0;jN;j+) if(freeblockj.startaddress+freeblockj.size=s&freeblockj.state=1) freeblocki.state=0; freeblockj.size=freeblockj.size+l; tag2=1;/*有與釋放區(qū)上下都鄰接的空閑區(qū),tag2置1*/ break;if(tag2=0)/*無與釋放區(qū)高低地址鄰接的空閑區(qū)*/freeblocki.startaddress=s;fr

28、eeblocki.size=l;break; if(tag1=0)/*無與釋放區(qū)高地址鄰接的空閑區(qū),并檢查是否低地址有鄰接空閑區(qū)*/ for(i=0;iN;i+)if(freeblocki.startaddress+freeblocki.size=s&freeblocki.state=1)freeblocki.size=freeblocki.size+l;tag3=1;/*有與釋放區(qū)低地址鄰接的空閑區(qū)*/break; if(tag3=0)/*無與釋放區(qū)低地址鄰接的空閑區(qū)*/ for(j=0;jN;j+) if(freeblockj.state=0)/*找一個空表目,將釋放區(qū)放入表中*/ fre

29、eblockj.startaddress=s; freeblockj.size=l; freeblockj.state=1; break;/*定義對空閑區(qū)表中的空閑區(qū)調(diào)整的函數(shù)adjust(),使空閑區(qū)按始地址從小到大排列,空表目放在最后面*/void adjust() int i,j; struct freearea middata; for(i=0;iN;i+)/*將空閑區(qū)按始地址順序在表中排列*/ for(j=0;jfreeblockj+1.startaddress) middata.startaddress=freeblockj.startaddress; middata.size=f

30、reeblockj.size; middata.state=freeblockj.state; freeblockj.startaddress=freeblockj+1.startaddress; freeblockj.size=freeblockj+1.size; freeblockj.state=freeblockj+1.state; freeblockj+1.startaddress=middata.startaddress; freeblockj+1.size=middata.size; freeblockj+1.state=middata.state;for(i=0;iN;i+)/*

31、將空表目放在表后面*/for(j=0;jN;j+)if(freeblockj.state=0&freeblockj+1.state=1) middata.startaddress=freeblockj.startaddress; middata.size=freeblockj.size; middata.state=freeblockj.state; freeblockj.startaddress=freeblockj+1.startaddress; freeblockj.size=freeblockj+1.size; freeblockj.state=freeblockj+1.state;

32、freeblockj+1.startaddress=middata.startaddress; freeblockj+1.size=middata.size; freeblockj+1.state=middata.state;/*定義打印空閑區(qū)說明表函數(shù):print()*/void print() int i; printf(|-|n); printf(| ID start size state |n); printf(|-|n); for(i=0;iN;i+)printf(| %3d %3d %3d %3d |n, freeblocki.ID,freeblocki.startaddress,

33、freeblocki.size,freeblocki.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()分配不成功時,返回-1*/ printf(作業(yè)申請量過大,空閑區(qū)表中的存儲空間無法滿足,分配失敗n); else adjust(); printf(申請作

34、業(yè)的起始地址為:%dn,start); printf(作業(yè)的申請量為:%dn,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; else if(iN-1) i=alloc2(applyarea,i); /start=alloc2(applyarea,start);/*調(diào)用alloc2()函數(shù)為作業(yè)分配空間,st

35、art為返回的始地址*/ if(i=-1)/*alloc2()分配不成功時,返回-1*/ printf(作業(yè)申請量過大,空閑區(qū)表中的存儲空間無法滿足,分配失敗n); else adjust(); printf(申請作業(yè)的起始地址為:%dn,start); printf(作業(yè)的申請量為:%dn,applyarea); printf(內(nèi)存分配成功n); /最佳void Best_fit() int applyarea,start; printf(請輸入作業(yè)的申請量:); scanf(%d,&applyarea);/*輸入作業(yè)的申請量*/ start=alloc3(applyarea);/*調(diào)用al

36、loc()函數(shù)為作業(yè)分配空間,start為返回的始地址*/ if(start=-1)/*alloc()分配不成功時,返回-1*/ printf(作業(yè)申請量過大,空閑區(qū)表中的存儲空間無法滿足,分配失敗n); else adjust(); printf(申請作業(yè)的起始地址為:%dn,start); printf(作業(yè)的申請量為:%dn,applyarea); printf(內(nèi)存分配成功n); /*主函數(shù)*/void main()loop:int ch;/算法選擇標(biāo)記 cout 動態(tài)分區(qū)分配方式的模擬 n; cout*n; cout* 1)首次適應(yīng)算法 2)循環(huán)首次適應(yīng)算法 3)最佳適應(yīng)算法 *n;

37、 cout*n; coutch;int choice; /操作選擇標(biāo)記while(1) cout*n; cout* 1: 分配內(nèi)存 2: 回收內(nèi)存 *n; cout* 3: 查看空閑分區(qū)表 0: 退 出 *n; cout*n; coutchoice; if(choice=1) / 分配內(nèi)存 int ch;if(ch=1)First_fit();if(ch=2)Next_fit();elseBest_fit(); else if(choice=2) / 回收內(nèi)存 setfree(); adjust();print(); else if(choice=3) print();/顯示空閑分區(qū)表 els

38、e if(choice=0) goto loop; /退出 else /輸入操作有誤 cout輸入有誤,請重試!endl; continue; 七、 體會與自我評價本次操作系統(tǒng)課程設(shè)計讓我掌握了動態(tài)分區(qū)分配的實質(zhì):動態(tài)分區(qū)分配是根據(jù)進程的實際需要,動態(tài)地為之分配內(nèi)存空間。分區(qū)管理是滿足多道程序運行的最簡單的存儲管理方式,為了實現(xiàn)對內(nèi)存空間的有效管理,需要采取一些方法和策略,用以實現(xiàn)對內(nèi)存空間的分配或回收。在實現(xiàn)可變分區(qū)分配時,將涉及到分區(qū)分配中所用的數(shù)據(jù)結(jié)構(gòu)、分區(qū)分配算法和分區(qū)的分配和回收操作這樣三個問題。并從根本上掌握了分區(qū)分配算法,分區(qū)分配算法就是系統(tǒng)在尋找空閑的分區(qū)分配給某一用戶作業(yè),具

39、體可采用首次適應(yīng)算法、循環(huán)首次適應(yīng)算法和最佳適應(yīng)算法等。首次適應(yīng)算法要求空閑區(qū)按其起始地址由小到大排列,當(dāng)某一用戶作業(yè)要求裝入內(nèi)存時,存儲分配程序從起始地址最小的空間區(qū)開始掃描,直到找到滿足該作業(yè)要求的空閑區(qū)為止。循環(huán)首次適應(yīng)算法在查找空閑區(qū)時,不再每次從鏈?zhǔn)组_始查找,而是從上一次找到的空閑區(qū)的下一個空閑分區(qū)開始查找,直到找到一個能滿足要求的空閑區(qū)為止,并從中劃出一塊與請求大小相等的內(nèi)存空間分給該作業(yè)。最佳適應(yīng)算法該算法總是把滿足要求,又是最小的空閑區(qū)分配給請求進程,即在空閑區(qū)表中,按空閑區(qū)的大小由小到大排序,建立索引,當(dāng)用戶進程請求分配內(nèi)存時,從索引表中找到第一個滿足該進程大小要求的空閑區(qū)分

40、配給它。從程序的運行結(jié)果使我更加深刻的體會到各種算法的性能的差異:采用首次適應(yīng)算法,會使空閑表低地址部分得到充分利用,但隨作業(yè)增多,會在低地址部分留下很多的難以利用的空閑分區(qū),還有每次查找都是從低址部分開始,必然會增加查找的時間。而循環(huán)首次適應(yīng)算法使得內(nèi)存中剩余空閑區(qū)的大小更加均勻地分布,減少平均查找的時間,但實驗表明,在內(nèi)存利用率方面它比首次適應(yīng)算法略差一點。并且我在實驗中發(fā)現(xiàn),最佳算法在內(nèi)存的利用率并不是最佳的,甚至比首次適應(yīng)算法和循環(huán)首次適應(yīng)算法更差。因為所選用的空閑區(qū)剛好或略大于請求進程,那么剩余的碎片通常太小而無法使用,因此最佳適應(yīng)算法會產(chǎn)生數(shù)量很多的碎片,此外算法的查找時間也相對較

41、長。三個分配算法,其主要區(qū)別就在于如何為作業(yè)分配主存空間。此次課程設(shè)計不但加深我對操作系統(tǒng)的理論知識的理解,更增強了我的實際編程能力,豐富了編程經(jīng)驗,鍛煉了自己動手解決實際問題的能力??傊?jīng)過這次課程設(shè)計使我學(xué)到了很多在課堂上無法學(xué)到知識,增強了編程的實踐經(jīng)驗,使把實際問題轉(zhuǎn)換成抽象算法的能力增強,為我以后參加工作奠定了堅實的基礎(chǔ)。同時十分感謝指導(dǎo)教師的指點,在老師的細心指點下使我對問題的理解更加的透徹,對編程起了至關(guān)重要的作用。并且本次課程設(shè)計更加鍛煉了我的學(xué)習(xí)能力和自己收集資料的能力??傊?,此次實習(xí)讓我獲益匪淺,希望在以后的學(xué)習(xí)中有更多的這樣的鍛煉機會。八、 參考文獻1、湯子嬴 編著,計算機操作系統(tǒng)(修訂版),西安電子科技大學(xué)出版社,2001年2、滕艷平 編著,計算機操作系統(tǒng),哈爾濱工業(yè)大學(xué)出版社,2008年3、譚浩強 編著,C程序設(shè)計,清華大學(xué)出版社,2005年4、Anany Levitin(美) 編著, 潘彥 譯算法設(shè)計與分析,清華大學(xué)出版社,2004年5、王紅梅 編著,數(shù)據(jù)結(jié)構(gòu)(C+版),清華大學(xué)出版社,2005年九、 課程設(shè)計評價課程設(shè)計評價 成績: 教師: 年 月 日

展開閱讀全文
溫馨提示:
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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!