1、 char process_namePROCESS_NAME_LEN; struct allocated_block *next;struct allocated_block *allocated_block_head = NULL;/函数声明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_B
2、F();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;
3、 pid=0; free_block= init_free_block(mem_size); /初始化空闲区 while(1) display_menu(); /显示菜单 fflush(stdin); choice=getchar(); /获取用户输入 switch(choice) case 1: set_mem_size(); break; /设置内存大小2 set_algorithm();flag=1;/设置算法3 new_process(); flag=1;/创建新进程4 kill_process();/删除进程5 display_mem_usage(); /显示内存使用0 do_exi
4、t(); exit(0); /释放链表并退出 default: 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;start_addr = DEFAULT_MEM_START;next = NULL; retu
5、rn fb;void display_menu()n1 - Set memory size (default=%d)n, DEFAULT_MEM_SIZE);2 - Select memory allocation algorithmn3 - New process n4 - Terminate a process n5 - Display memory usage n0 - Exitnint set_mem_size() if(flag!=0) /防止重复设置Cannot set memory size againn return 0;Total memory size = scanf(%d
6、, &size); if(size0) mem_size = size; free_block-void set_algorithm() int algorithm; printf(t1 - First Fitnt2 - Best Fit nt3 - Worst Fit n scanf(algorithm); if(algorithm=1 & algorithm start_addr; temp = free_block; while(temp-next!=NULL) if(temp-next-start_addr p = temp; temp = temp-next; if(NULL!=p)
7、 temp = p- p-next = p- temp-next = free_block; free_block = temp; thead = free_block; p = free_block; temp = free_block- while(thead- min_addr = thead- while(temp- if(p-=thead-next) next = thead- thead-next = temp; thead = thead- p = thead; temp = thead-/最佳适应算法int rearrange_BF() /使用头插法,thead为临时头,p为最
8、小内存的数据块的前一个结点 /当前的最小内存 int min_size = free_block-size;size min_size = thead-/最坏适应算法int rearrange_WF() /使用头插法,thead为临时头,p为最大内存的数据块的前一个结点 /当前的最大内存 int max_size = free_block-sizemax_size) max_size = temp- max_size = thead-int new_process() struct allocated_block *ab; int ret; ab = (struct allocated_blo
9、ck *)malloc(sizeof(struct allocated_block); if(!ab) exit(-5); ab- pid+; sprintf(ab-process_name, PROCESS-d, pid);pid = pid;Memory for %s:, ab-process_name); if(size ab-size=size; break; else printf(输入大小有误,请重新输入n ret = allocate_mem(ab); if(ret=1) &(allocated_block_head = NULL) allocated_block_head=ab
10、; else if (ret=1) next = allocated_block_head; allocated_block_head = ab; return 2; else if(ret=-1)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- int
11、 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-request_size) return -1; else while(NULL!=fbt&fbt-request_size) pre = fbt; fbt = fbt- if(NULL=fbt|fbt- =free_block- sum = free
12、_block- temp = free_block- while(NULL!=temp) sum += temp- if(sum=request_size) break; temp = temp- if(NULL=temp) return -1; else pre = free_block; max = free_block- fbt = free_block; while(temp-=pre) if(maxstart_addr) max = pre- fbt = pre; pre = pre- =pre) tp = allocated_block_head; tt = free_block;
13、 if(pre!=fbt) while(NULL!=tp) if(tp-start_addrstart_addr) tp-start_addr = tp-start_addr - pre- tp = tp- =tt) if(tt- tt-start_addr = tt- tt = tt- while(pre!=temp-=fbt) free(pre); free_block = fbt; free_block-size = sum;next = temp- if(free_block-size - request_size size = free_block-start_addr = free
14、_block- pre = free_block; free_block = free_block- free(pre); else start_addr = fbt- free_block-start_addr + request_size;size - request_size; /将内存块全部分配 if(fbt-size = fbt- if(pre-next=free_block) free_block = fbt- else pre-next = fbt- free(fbt); fbt- free(head);void kill_process()Kill Process, pid=pid); ab = find_process(pid); if(ab!=NULL) free_mem(ab); dispose(ab);没有pid为%d的进程!,pid);struct allocated_block *find_process(int pid) struct allocated_blo
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1