《2022年最坏适应算法-动态分区法存储 .pdf》由会员分享,可在线阅读,更多相关《2022年最坏适应算法-动态分区法存储 .pdf(14页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、阅读教材计算机操作系统第四章,掌握存储器管理相关概念和原理。编写程序模拟实现内存的动态分区法存储管理。内存空闲区使用自由链管理,采用最坏适应算法从自由链中寻找空闲区进行分配,内存回收时假定不做与相邻空闲区的合并。假定系统的内存共640K, 初始状态为操作系统本身占用64K。在 t1 时间之后, 有作业A、B、C、D 分别请求8K、16K、64K、124K的内存空间; 在 t2 时间之后,作业 C完成;在 t3 时间之后,作业E 请求 50K 的内存空间;在 t4 时间之后,作业D 完成。要求编程序分别输出t1 、t2 、t3 、t4 时刻内存的空闲区的状态。实验代码带界面系统#include
2、#include typedef struct list int len; char name; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 14 页 - - - - - - - - - int address; struct list *next; listNode,*listlink; char id=1; void init(listlink &q) q=(listlink)malloc(sizeof(listNode); if(!q) exit(-1); q-
3、next=NULL; / 初始化int length(listlink free) listlink q; q=free-next; int len=0; while(q!=NULL) len=len+q-len; q=q-next; return len; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 14 页 - - - - - - - - - / 空闲区总长度listlink Delist(char name,listlink &q) listlink a,b,c
4、; a=q-next; b=q; while(a!=NULL) if(a-name=name) c=a-next; b-next=c; return a; b=b-next; a=a-next; return NULL; / 按作业或进程名删除该结点void insert(listlink &q,int address,int len,char name=F) listlink a=(listlink)malloc(sizeof(listNode); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - -
5、- - - 第 3 页,共 14 页 - - - - - - - - - a-address=address; a-len=len; a-name=name; listlink b=q; while(b-next!=NULL) b=b-next; a-next=NULL; b-next=a; / 插入结点void sort(listlink &q) listlink a,b; int temp1,temp2; a=q-next; if(a=NULL) return; b=a-next; while(a-next!=NULL) while(b!=NULL) if(a-lenlen) temp1=
6、a-address; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 14 页 - - - - - - - - - temp2=a-len; a-len=b-len; a-address=b-address; b-address=temp1; b-len=temp2; b=b-next; a=a-next; b=a-next; / 按长度从大到小排序listlink findpre(listlink free,int address) listlink a; a=free
7、-next; while(a!=NULL) if(a-address+a-len=address) Delist(a-name,free); return a; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 14 页 - - - - - - - - - a=a-next; return NULL; / 查找前连接区listlink findnext(listlink free,int address,int len) listlink a; a=free-next; w
8、hile(a!=NULL) if(a-address=address+len) Delist(a-name,free); return a; a=a-next; return NULL; / 查找后连接区void freeMemo(char name,listlink &free,listlink &busy) listlink a=Delist(name,busy); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 14 页 - - - - - - - - - list
9、link b,c; id+; b=findpre(free,a-address); c=findnext(free,a-address,a-len); if(b!=NULL&c!=NULL) b-len=a-len+b-len+c-len; insert(free,b-address,b-len,id); sort(free); / 前连接区后连接区都存在else if(b=NULL&c!=NULL) a-len=a-len+c-len; insert(free,a-address,a-len,id); sort(free); / 前连接区不存在后连接区存在else if(b!=NULL&c=
10、NULL) b-len=a-len+b-len; insert(free,b-address,b-len,id); sort(free); / 前连接区存在后连接区不存在else insert(free,a-address,a-len,id); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 14 页 - - - - - - - - - / 前连接区不存在后连接区不存在/ 回收内存void requireMemo(char name, int require,listli
11、nk &free,listlink &busy) listlink a; int address; a=free-next; if(a!=NULL&a-len=require) a-len=a-len-require; if(a-len=0) address=a-address; Delist(a-name,free); else address=a-address; a-address=a-address+require; sort(free); insert(busy,address,require,name); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - -
12、 - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 14 页 - - - - - - - - - else printf( 分配失败 n); / 内存分配void visit(listlink free) listlink a; int i=1; a=free-next; printf( 空闲区的情况 n); if(a=NULL) printf( 空n); while(a!=NULL) printf( 空 闲 区 %d 起始地址:%d 长度:%dn,i,a-address,a-len); a=a-next; i+; / 输出空闲区链表情况void v
13、isit1(listlink busy) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 14 页 - - - - - - - - - listlink a; int i=1; a=busy-next; printf( 繁忙区的情况 n); if(a=NULL) printf( 空n); while(a!=NULL) printf( 繁 忙 区 %d 起始地址:%d 长度:%d 进程名:%cn,i,a-address,a-len,a-name); a=a-next; i+
14、; / 输出繁忙区链表情况void show(listlink free,listlink busy) printf( 可变分区存储管理系统n); printf(n); char choice=1; char name; int require; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 14 页 - - - - - - - - - while(choice!=0) printf(-n); printf(| 1:查看空闲区总长度|n); printf(| 2:请求
15、内存分配|n); printf(| 3: 回 收 内 存|n); printf(| 4:查看空闲区状态|n); printf(| 5:查看繁忙区状态|n); printf(| 0: 退 出|n); printf(-n); printf( 请 输 入 你 要 执 行 的 操 作 选 项(0-5):); scanf(n%c,&choice); switch(choice) case 0: 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 14 页 - - - - - - -
16、- - printf( 谢谢使用本系统,欢迎下次使用n); break; case 1: printf(空闲区总长度:%dn,length(free); break; case 2: printf( 请输入作业或进程名:); scanf(n%c,&name); printf( 请输入作业或进程所需内存大小:); scanf(%d,&require); requireMemo(name,require,free,busy); break; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第
17、 12 页,共 14 页 - - - - - - - - - case 3: printf( 请输入需回收的作业或进程名:); scanf(n%c,&name); freeMemo(name,free,busy); break; case 4: visit(free); break; case 5: visit1(busy); break; default: break; printf(n); / 界面系统名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 14 页 - - - - - - - - - void main() listlink free; listlink busy; init(free); init(busy); insert(free,0,640,id); requireMemo(S,64,free,busy); show(free,busy); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 14 页 - - - - - - - - -
限制150内