實驗三 可變分區存儲管理.docx_第1頁
實驗三 可變分區存儲管理.docx_第2頁
實驗三 可變分區存儲管理.docx_第3頁
實驗三 可變分區存儲管理.docx_第4頁
實驗三 可變分區存儲管理.docx_第5頁
已閱讀5頁,還剩1頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

實驗三 可變分區存儲管理1目的和要求通過這次實驗,加深對內存管理的認識,進一步掌握內存的分配、回收算法的思想。2實驗內容閱讀教材計算機操作系統第四章,掌握存儲器管理相關概念和原理。編寫程序模擬實現內存的動態分區法存儲管理。內存空閑區使用自由鏈管理,采用最壞適應算法從自由鏈中尋找空閑區進行分配,內存回收時假定不做與相鄰空閑區的合并。假定系統的內存共640K,初始狀態為操作系統本身占用64K。在t1時間之后,有作業A、B、C、D分別請求8K、16K、64K、124K的內存空間;在t2時間之后,作業C完成;在t3時間之后,作業E請求50K的內存空間;在t4時間之后,作業D完成。要求編程序分別輸出t1、t2、t3、t4時刻內存的空閑區的狀態。3實驗環境Windows操作系統、VC+6.0C語言4. 實驗要求:1) 上機前認真使用C語言編寫好程序,采用Visual C+6.0作為編譯環境;2) 上機時獨立調試程序3) 根據具體實驗要求,填寫好實驗報告(包括目的和要求、實驗內容、實驗環境、設計思想、源程序、實例運行結果、總結)。5. 設計思想:本次實驗編寫的程序主要涉及四個函數start ( ), requireMemo ( ) , freeMemo ( )和past( )。1. start()這個函數主要用來建立自由鏈隊列和占用區隊列,這兩個隊列用來分別存放自由節點和占用節點。在初始狀態下,操作系統本身占用64k,它存放在占用區隊列里,因此自由鏈隊列里只有640-64=576k的空間,且起始地址為64。2. requireMemo()函數是該程序的核心算法,用來分配內存空間,該函數帶兩個參數,用來表示作業或進程名的name和表示作業或者進程名所申請空間的大小的require。由于此算法采用的是最壞適應算法,所以自由鏈隊列中的空閑分區是按其容量從大到小的順序排列的。因此在這里需要分三種情況:自由鏈隊列的第一個空閑分區的容量大于require;自由鏈隊列的第一個空閑分區的容量等于require;自由鏈隊列的第一個空閑分區的容量小于require。在情況下分配完后還需把剩余的部分重新按照容量大小給它在自由鏈隊列里找到新位置。在情況下只需分配,分配即把符合要求的空閑分區從自由鏈隊列刪除,并且插入到占用區隊列的尾部。在刪除需注意把原來處于分配分區的前后鏈接起來,否則隊列將斷掉。在情況下,只需提示用戶無法分配即可。3. freeMemo ()函數也是該程序的核心算法,是用來回收作業完成后不需使用的內存空間,它根據從main()函數中傳遞過來的參數name,遍尋占用區隊列,找到與name匹配的作業,把他從占用區隊列刪除,插入到自由鏈隊列里。在插入時,由于涉及到鄰接區的合并問題,所以必須先遍尋整個自由鏈隊列,找到是否有從占用區隊列回收回來的空間鄰接區,如果有,就將他們合并。做完鄰接區的合并之后,再根據內存空間的大小,將整個自由鏈隊列排序。6. 源程序:1)程序中所定義的數據結構和全局變量/程序中自由鏈隊列的結點類型可描述如下struct freelink int len, address; / len為分區長度 / address為分區起始地址 struct freelink *next;/內存占用區用鏈表描述,其結點類型描述如下struct busylink char name; / 作業或進程名 name=S 表示OS占用 int len , address; struct busylink *next;/并設全程量struct freelink *free_head=NULL; /自由鏈隊列(帶頭結點)隊首指針 struct busylink *busy_head=NULL, /占用區隊列隊(帶頭結點)首指針 *busy_tail=NULL; /占用區隊列隊隊尾指針2)requireMemo()函數的具體實現:/模擬內存分配函數void requireMemo(char name, int require) struct busylink *p; struct freelink *w,*u,*v; if( free_head-next-len=require) if(free_head-next-lenrequire) p=(struct busylink*)malloc(sizeof(struct busylink); p-name=name; p-address=free_head-next-address; p-len=require; p-next=NULL; busy_tail-next=p; busy_tail=p; w=free_head-next; free_head-next=w-next; w-len=w-len-require; w-address=w-address+require; u=free_head; v=free_head-next; while(v!=NULL)u=v; v=v-next; u-next=w; w-next=v;else p=(struct busylink*)malloc(sizeof(struct busylink); p-name=name; p-address=free_head-next-address; p-len=require; p-next=NULL; busy_tail-next=p; busy_tail=p; w=free_head-next; free_head-next=w-next; free(w);else printf(not allocat);3) freeMemo( )函數的具體實現:/模擬內存回收函數void freeMemo(char name) int len,address; struct busylink *p,*q; struct freelink *w,*u,*v; q=busy_head; p= busy_head-next; while(p!=NULL)&(p-name!=name) q=p; p=p-next; if(p=NULL) printf(%c is not exist,name); else if(p=busy_tail) busy_tail=q; q-next=p-next; len=p-len; address=p-address; free(p); w=( struct freelink*) malloc(sizeof(struct freelink); w-len=len; w-address=address; u=free_head; v=free_head-next; while(v!=NULL)&(v-lenw-len) u=v; v=v-next; if(u-address+u-len=w-address)|(w-len+w-address=u-address) /處理w鄰接于u的情況 if(w-address =u-address) w-address=u-address; w-len=u-len+w-len; w-next=v; free(u); if(v!=NULL&(w-address+w-len=v-address)|(v-address+v-len=w-address) /處理v鄰接于w的情況 if(v-addressaddress) w-address=v-address; w-len=w-len+v-len; u-next=v-next; free(v); u=free_head; v=free_head-next; while(v!=NULL)&(v-lenw-len) u=v;v=v-next; w-next=v; u-next =w; 7. 實例運

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論