logo资料库

北京邮电大学操作系统实验实验报告--存储管理.pdf

第1页 / 共24页
第2页 / 共24页
第3页 / 共24页
第4页 / 共24页
第5页 / 共24页
第6页 / 共24页
第7页 / 共24页
第8页 / 共24页
资料共24页,剩余部分请下载后查看
北京邮电大学 操作系统实验 实验报告 班号:2011211319 姓名: 马跃 学号: 2011211672 实验日期: 2013-12-16 实验名称:存储管理 一、实验目的 通过模拟实现内存分配的伙伴算法和请求页式存储管理的几种基本页面置换算法,了解存储 技术的特点。掌握虚拟存储请求页式存储管理中几种基本页面置换算法的基本思想和实现过 程,并比较它们的效率。 二、实验内容 1.实现一个内存管理的伙伴算法,实现内存块申请时的分配和释放后的回收。 2.设计一个虚拟存储区和内存工作区,并使用下述算法计算访问命中率。 1) 最佳置换算法(Optimal)看下一个 2) 先进先出法(Fisrt In First Out)直接插入 3) 最近最久未使用(Least Recently Used)上次使用时间 4) 最不经常使用法(Least Frequently Used)(置换次数最小的页) 其中,命中率=1-页面失效次数/页地址流长度。 试对上述算法的性能加以较各:页面个数和命中率间的关系;同样情况下的命中率比较。 3. 实现内存的 slab 分配器: 其基本思想是:一次向内核获取整数页,slab 根据数据结构的大小进行划分为一个个小的 数据结构,当需要时直接从该链表上摘取一个返回应用程序,当应用程序释放时,而非真正 释放,只需要该空间放回到链表中,当分散的一页多块又聚集一页时,又会拼成一页,同时 判断 slab 空闲的页数,如果空闲页超过一定的页数,就会向系统释放一定的页数。一个 slab 分配器只能管理一个指定大小的数据结构分配。 三、项目要求及分析 编写内存管理的伙伴算法 实现内存块申请的分配和释放后的回收 比较四种算法的命中率 四、内存管理伙伴算法 算法分析:设置一个内存的值以及分配的次数,每次通过随机数随机生成一个分配的值,系 统计算出与其最接近的内存,再将剩余的内存部分分配成 2 的 n 次方大小的伙伴块。如果随 机数生成的值小于内存可用值,则声明内存不足;如果随机数大于内存可用值却因为碎片问 题无法分配,输出碎片过多。如果正常分配,则使用的块和碎片大小。 通过随机数生成释放内存的顺序,每次释放一个内存块之后,将释放的内存块和其他内存块 进行合并,若不能合并的,直接输出。 流程 输入:输入内存大小——生成随机数——判断随机数与内存的大小(失败输出内存不足)— —判断随机数与现在可以分配的内存块的关系(失败输出碎片过多)——分配内存,更新可 -1-
int length,uesd,remain; 以使用的内存块大小(设置一个数组,从小到大排列,每次找到一个最适合的块,进行分配, 再重新更新块的大小) 释放:随机数生成——判断内存是否释放——释放内存大小与可用内存能否合并,若可以, 进行合并,如不可以,直接插入 代码 #include #include #include struct block//内容块的数据,块的长度,使用长度和碎片 { }; int total;//内存大小 int num;//分配次数 int layer=0;//层数 int f=0; int uu,nn=0; struct block *a; int *b; int *c; int *e; freeid (int k)//释放内存 { int l,i,j,f; l=a[k].length; i=0; if(uu==-1) { } else { b[0]=l; f=0; uu=0; b[0]=l; uu=0; f=1; while(f==1) { if(b[0]==0) { -2-
l=b[0]+l; for(j=0;j<=uu;j++) b[j]=b[j+1]; uu--; b[uu+1]=l; uu++; j=0; while(b[j]uu) { } else { } for(i=uu+1;i>j;i--) b[i]=b[i-1]; b[j]=l; uu++; } if(f==1) { } else { } } else { f=0; for(j=0;j<=layer-1;j++) if(b[0]+l==c[j]) f=1; } } } divo (int k,int n,int p)//将大内存块分配成小内存块 { a[n].length=k; a[n].uesd=p; a[n].remain=k-p; int i=0,r; while(k>b[i]) i++; -3-
b[0]=0; uu=-1; int j; if(uu==0) { } else { for(j=i;j<=uu-1;j++) b[j]=b[j+1]; b[j]=0; uu--; } if(k==b[i]) { } else { r=b[i]-k; int j; if(uu==0) { } else { } while(r!=0) { b[0]=0; uu=-1; for(j=i;j<=uu-1;j++) b[j]=b[j+1]; uu--; j=0; while(r
while(c[j]>b[d]&&d<=uu) d++; if(c[j]>b[uu]) b[uu+1]=c[j]; else for(l=uu+1;l>d;l--) b[l]=b[l-1]; { } } r=r-c[j]; } b[d]=c[j]; uu++; } main() { int i=0,n=0,p,k; printf("请输入内存大小\n"); scanf("%d",&total); printf("请输入分配次数\n"); scanf("%d",&num); k=1; while(k=0;i--) { } for(i=0;i<=num-1;i++) { } b[0]=total; uu=0; int left; left=total; layer++; k=k*2; c[i]=c[i+1]*2; b[i]=0; -5-
f=0; for(i=0;i<=uu;i++) { } if(pleft) printf("剩下的空间小于分配值,无法分配\n"); else { if(uu==-1) f=0; else { } if(f==0) printf("碎片太多,无法分配\n"); else { k=1; while(k
} } n++; } printf("%d\n",nn); e=malloc(sizeof(int)*nn); for(i=0;i<=nn-1;i++) e[i]=1; n=nn; while(n!=0) { } free(c); free(a); p=rand()%nn; //scanf("%d",&p); if(e[p]==1) { } freeid(p); e[p]=0; printf("释放的内存为"); printf("%d\n",a[p].length); printf("还可以使用的内存为\n"); if(uu==-1) printf("0"); else for(i=0;i<=uu;i++) printf("%d printf("\n"); n--; ",b[i]); free(b); free(e); system("pause"); return 0; } 测试案例 输入内存 2048 分配次数 4 -7-
输入内存为 2048 分配次数为 7 -8-
分享到:
收藏