實驗四-動態(tài)分區(qū)分配算法.docx_第1頁
實驗四-動態(tài)分區(qū)分配算法.docx_第2頁
實驗四-動態(tài)分區(qū)分配算法.docx_第3頁
實驗四-動態(tài)分區(qū)分配算法.docx_第4頁
實驗四-動態(tài)分區(qū)分配算法.docx_第5頁
已閱讀5頁,還剩9頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

實驗內(nèi)容:存儲器管理實驗一、實驗目的采用首次適應算法(FF),最佳適應算法(BF),最壞適應算法(WF)三種不同的算法,實現(xiàn)對系統(tǒng)空閑區(qū)的動態(tài)分區(qū)分配。二、實驗題目給予順序搜索的動態(tài)分區(qū)算法的程序。三、實驗要求 讀懂給出的核心代碼,進行適當?shù)男薷?,編譯通過后,完成實驗報告。四、核心代碼#include #include #include /常量定義#define PROCESS_NAME_LEN 32 #define MIN_SLICE 10 #define DEFAULT_MEM_SIZE 1024 #define DEFAULT_MEM_START 0 #define MA_FF 1#define MA_BF 2#define MA_WF 3int mem_size=DEFAULT_MEM_SIZE;int ma_algorithm = MA_FF; static int pid = 0; int flag = 0; struct free_block_type int size; int start_addr; struct free_block_type *next; struct free_block_type *free_block;/描述已分配的內(nèi)存塊struct allocated_block int pid; int size; int start_addr; char process_namePROCESS_NAME_LEN; struct allocated_block *next;struct allocated_block *allocated_block_head = NULL;/函數(shù)聲明struct free_block_type* init_free_block(int mem_size);void display_menu();int set_mem_size();void set_algorithm();void rearrange(int algorithm);int rearrange_FF();int rearrange_BF();int rearrange_WF();int new_process();int allocate_mem(struct allocated_block *ab);void kill_process();int free_mem(struct allocated_block *ab);int dispose(struct allocated_block *free_ab);int display_mem_usage();void do_exit();struct allocated_block *find_process(int pid);int main() char choice; pid=0; free_block= init_free_block(mem_size); /初始化空閑區(qū) while(1) display_menu(); /顯示菜單 fflush(stdin); choice=getchar(); /獲取用戶輸入 switch(choice) case 1: set_mem_size(); break; /設置內(nèi)存大小 case 2: set_algorithm();flag=1; break;/設置算法 case 3: new_process(); flag=1; break;/創(chuàng)建新進程 case 4: kill_process(); flag=1; break;/刪除進程 case 5: display_mem_usage(); flag=1; break; /顯示內(nèi)存使用 case 0: do_exit(); exit(0); /釋放鏈表并退出 default: break; return 1;struct free_block_type* init_free_block(int mem_size) struct free_block_type *fb; fb=(struct free_block_type *)malloc(sizeof(struct free_block_type); if(fb=NULL) printf(No memn); return NULL; fb-size = mem_size; fb-start_addr = DEFAULT_MEM_START; fb-next = NULL; return fb;void display_menu() printf(n); printf(1 - Set memory size (default=%d)n, DEFAULT_MEM_SIZE); printf(2 - Select memory allocation algorithmn); printf(3 - New process n); printf(4 - Terminate a process n); printf(5 - Display memory usage n); printf(0 - Exitn);int set_mem_size() int size; if(flag!=0) /防止重復設置 printf(Cannot set memory size againn); return 0; printf(Total memory size =); scanf(%d, &size); if(size0) mem_size = size; free_block-size = mem_size; flag=1; return 1; void set_algorithm() int algorithm; while(1) printf(t1 - First Fitn); printf(t2 - Best Fit n); printf(t3 - Worst Fit n); scanf(%d, &algorithm); if(algorithm=1 & algorithm start_addr; temp = free_block; while(temp-next!=NULL) if(temp-next-start_addrnext-start_addr; p = temp; temp = temp-next; if(NULL!=p) temp = p-next; p-next = p-next-next; temp-next = free_block; free_block = temp; thead = free_block; p = free_block; temp = free_block-next; while(thead-next!=NULL) min_addr = thead-next-start_addr; while(temp-next!=NULL) if(temp-next-start_addrnext-start_addr; p = temp; temp = temp-next; if(p-next!=thead-next) temp = p-next; p-next = p-next-next; temp-next = thead-next; thead-next = temp; thead = thead-next; p = thead; temp = thead-next; return 1;/最佳適應算法int rearrange_BF() struct free_block_type *temp; /使用頭插法,thead為臨時頭,p為最小內(nèi)存的數(shù)據(jù)塊的前一個結點 struct free_block_type *thead=NULL,*p=NULL; /當前的最小內(nèi)存 int min_size = free_block-size; temp = free_block; while(temp-next!=NULL) if(temp-next-sizenext-size; p = temp; temp = temp-next; if(NULL!=p) temp = p-next; p-next = p-next-next; temp-next = free_block; free_block = temp; thead = free_block; p = free_block; temp = free_block-next; while(thead-next!=NULL) min_size = thead-next-size; while(temp-next!=NULL) if(temp-next-sizenext-size; p = temp; temp = temp-next; if(p-next!=thead-next) temp = p-next; p-next = p-next-next; temp-next = thead-next; thead-next = temp; thead = thead-next; p = thead; temp = thead-next; return 1;/最壞適應算法int rearrange_WF() struct free_block_type *temp; /使用頭插法,thead為臨時頭,p為最大內(nèi)存的數(shù)據(jù)塊的前一個結點 struct free_block_type *thead=NULL,*p=NULL; /當前的最大內(nèi)存 int max_size = free_block-size; temp = free_block; while(temp-next!=NULL) if(temp-next-sizemax_size) max_size = temp-next-size; p = temp; temp = temp-next; if(NULL!=p) temp = p-next; p-next = p-next-next; temp-next = free_block; free_block = temp; thead = free_block; p = free_block; temp = free_block-next; while(thead-next!=NULL) max_size = thead-next-size; while(temp-next!=NULL) if(temp-next-sizemax_size) max_size = temp-next-size; p = temp; temp = temp-next; if(p-next!=thead-next) temp = p-next; p-next = p-next-next; temp-next = thead-next; thead-next = temp; thead = thead-next; p = thead; temp = thead-next; return 1;int new_process() struct allocated_block *ab; int size; int ret; ab = (struct allocated_block *)malloc(sizeof(struct allocated_block); if(!ab) exit(-5); ab-next = NULL; pid+; sprintf(ab-process_name, PROCESS-d, pid); ab-pid = pid; while(1) printf(Memory for %s:, ab-process_name); scanf(%d, &size); if(size0) ab-size=size; break; else printf(輸入大小有誤,請重新輸入n); ret = allocate_mem(ab); if(ret=1) &(allocated_block_head = NULL) allocated_block_head=ab; return 1; else if (ret=1) ab-next = allocated_block_head; allocated_block_head = ab; return 2; else if(ret=-1) printf(Allocation failn); pid-; free(ab); return -1; return 3;int allocate_mem(struct allocated_block *ab) struct free_block_type *fbt, *pre,*head,*temp,*tt; struct allocated_block *tp; int request_size=ab-size; int sum=0; int max; head = (struct free_block_type *)malloc(sizeof(struct free_block_type); pre = head; fbt = free_block; pre-next = fbt; if(ma_algorithm=MA_WF) if(NULL=fbt|fbt-sizesizenext; if(NULL=fbt|fbt-sizenext) sum = free_block-size; temp = free_block-next; while(NULL!=temp) sum += temp-size; if(sum=request_size) break; temp = temp-next; if(NULL=temp) return -1; else pre = free_block; max = free_block-start_addr; fbt = free_block; while(temp-next!=pre) if(maxstart_addr) max = pre-start_addr; fbt = pre; pre = pre-next; pre = free_block; while(temp-next!=pre) tp = allocated_block_head; tt = free_block; if(pre!=fbt) while(NULL!=tp) if(tp-start_addrpre-start_addr) tp-start_addr = tp-start_addr - pre-size; tp = tp-next; while(NULL!=tt) if(tt-start_addrpre-start_addr) tt-start_addr = tt-start_addr - pre-size; tt = tt-next; pre = pre-next; pre = free_block; while(pre!=temp-next) if(pre!=fbt) free(pre); pre = pre-next; free_block = fbt; free_block-size = sum; free_block-next = temp-next; if(free_block-size - request_size size = free_block-size; ab-start_addr = free_block-start_addr; pre = free_block; free_block = free_block-next; free(pre); else ab-start_addr = fbt-start_addr; free_block-start_addr = free_block-start_addr + request_size; free_block-size = free_block-size - request_size; else return -1; else /將內(nèi)存塊全部分配 if(fbt-size - request_size size = fbt-size; ab-start_addr = fbt-start_addr; if(pre-next=free_block) free_block = fbt-next; else pre-next = fbt-next; free(fbt); else ab-start_addr = fbt-start_addr; fbt-start_addr = fbt-start_addr + request_size; fbt-size = fbt-size - request_size; free(head); rearrange(ma_algorithm); return 1;void kill_process() struct allocated_block *ab; int pid; printf(Kill Process, pid=); scanf(%d, &pid); ab = find_process(pid); if(ab!=NULL) free_mem(ab); dispose(ab); else printf(沒有pid為%d的進程!n,pid); struct allocated_block *find_process(int pid) struct allocated_block *ab=NULL; ab = allocated_block_head; while(NULL!=ab&ab-pid!=pid) ab = ab-next; return ab;int free_mem(struct allocated_block *ab) int algorithm = ma_algorithm; struct free_block_type *fbt, *pre=NULL,*head; fbt=(struct free_block_type*) malloc(sizeof(struct free_block_type); pre=(struct free_block_type*) malloc(sizeof(struct free_block_type); if(!fbt) return -1; / 進行可能的合并,基本策略如下 / 1. 將新釋放的結點插入到空閑分區(qū)隊列末尾 / 2. 對空閑鏈表按照地址有序排列 / 3. 檢查并合并相鄰的空閑分區(qū) / 4. 將空閑鏈表重新按照當前算法排序 head = pre; fbt-start_addr = ab-start_addr; fbt-size = ab-size; fbt-next = free_block; /新釋放的結點插入到空閑分區(qū)鏈表的表頭 free_block = fbt; rearrange_FF(); /對空閑鏈表按照地址有序排列 pre-next = free_block; /求的pre為fbt的前一個結點 pre-size = 0; while(pre-next-start_addr!=fbt-start_addr) pre = pre-next; /左右分區(qū)都存在 if(0!=pre-size&NULL!=fbt-next) /左右分區(qū)都可合并 if(pre-start_addr+pre-size)=fbt-start_addr & (fbt-start_addr+fbt-size)=fbt-next-start_addr) pre-size = pre-size + fbt-size + fbt-next-size; pre-next = fbt-next-next; free(fbt-next); free(fbt); /左分區(qū)可合并 else if(pre-start_addr+pre-size)=fbt-start_addr) pre-size = pre-size + fbt-size; pre-next = fbt-next; free(fbt); /右分區(qū)可合并 else if(fbt-start_addr+fbt-size)=fbt-next-start_addr) fbt-size = fbt-size + fbt-next-size; fbt-next = fbt-next-next; free(fbt-next); /左分區(qū)不存在 else if(0=pre-size) if(fbt-start_addr+fbt-size)=fbt-next-start_addr) fbt-size = fbt-size + fbt-next-size; fbt-next = fbt-next-next; free(fbt-next); /右分區(qū)不存在 else if(NULL=fbt-next)

溫馨提示

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

評論

0/150

提交評論