Linux操作系统实验报告存储管理试验.doc_第1页
Linux操作系统实验报告存储管理试验.doc_第2页
Linux操作系统实验报告存储管理试验.doc_第3页
Linux操作系统实验报告存储管理试验.doc_第4页
Linux操作系统实验报告存储管理试验.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

电子信息学院实验报告书课程名:Linux操作系统实验 题 目: 实验三 存储管理试验 实验类别 【验证】 班 级: BX0907 学 号: 09 姓 名: 吴沛儒 评语:实验态度:认真( ) 一般( ) 差( )实验结果:正确( ) 部分正确( )错( )实验理论:掌握( ) 熟悉( ) 了解( ) 不懂( )操作技能:强( ) 一般( ) 差( )实验报告:好( ) 一般( ) 差( )成绩: 指导教师: 胡静 批阅时间: 年 月 日成绩: 指导教师: 宁建红 批阅时间: 年 月 日1、 实验内容或题目(1)模拟初始内存页面分配(数组、结构体均可) (2)实现Buddy heap算法 (3)通过键盘输入随机产生申请和释放操作 请求:r8代表申请8个页面。 释放:f4代表释放4个页面。 (4)每个申请或释放操作,都在屏幕上显示操作前与操作后的内存分配的对比图。 (5)实验假设申请和释放的页数都是2的整次幂。(1)建立工作集页面模型。 (2)利用随机函数动态生成进程访问页面的序列号。 (3)实现FIFO页面淘汰算法。 (4)实现页故障率反馈模型。2、 实验目的与要求(1) 用C语言是实现模拟Linux系统中连续内存分配用到的伙伴对算法。 (2) 通过链表的形式输出在内存申请和释放过程中内存状态的对比图。(1)了解工作集模型的原理及其特点。 (2)实现页故障率反馈模型。3、 实验步骤与源程序1. Buddy heap算法模拟源程序; #include #include typedef struct block int size; int start; int loc; struct block *next; struct block *prior; block;int maxsize=512; block *note; block *id10;void printmem()int i;for(i=9; i=0;i-)printf(%d -,i);block * temp = (struct block *)malloc(sizeof(struct block);temp = idi-next;while(temp!=NULL)printf(%d(%s)(%d)-,temp-size,temp-loc=1?占用:空闲,temp-start); temp=temp-next;printf(n);void init()int i;for(i=0;iprior=idi;idi-next=NULL;note=(struct block *)malloc(sizeof(struct block);note-size=maxsize;note-start=0;note-loc=0;note-next=NULL;id9=(struct block *)malloc(sizeof(struct block);id9-next=note;id9-prior=id9;note-prior=id9;printmem();int power(int x,int y) int k=0,tmp=1;for(;knext;int flag=0,isFirst=0;while(pend!=NULL)if(pend-loc=0) if(isFirst=0)idtempId-next=pend-next;else pend-prior-next=pend-next;int size=(pend-size)/2;int start=pend-start;newu-size=size;newu-start=start;newf-start=start+size;newu-loc=0;newf-size=size;newf-loc=0;newf-prior=newu;newu-next=newf;newf-next=NULL;tempId-;cend=idtempId;while(cend-next!=NULL)cend=cend-next;cend-next=newu; newu-prior=cend;flag=1;return 1;else pend=pend-next;isFirst+;if(flag=0)tempId=tempId+1;if(tempIdnext;int nextStart=first-start+first-size;int preStart=first-start-first-size;int flag=0,isFirst=0;while(second!=NULL)if(second-start=nextStart | second-start=preStart) & second-loc=0)merger-size=(first-size)+(second-size);merger-loc=0;merger-start=(first-start)start)?(first-start):(second-start);if(first-next!=NULL)first-next-prior=first-prior;if(first-prior-prior)=first-prior)idtempId-next=first-next;else first-prior-next=first-next;if(second-next!=NULL)second-next-prior=second-prior;if(isFirst=0)idtempId-next=second-next;elsesecond-prior-next=second-next;tempId+;merger-next=idtempId-next;merger-prior=idtempId;if(idtempId-next!=NULL) idtempId-next-prior=merger;idtempId-next=merger;if(tempIdnext;isFirst+;return 1;int freeb(int size)block * first=(struct block *)malloc(sizeof(struct block);int tempId=root(2,size);first=idtempId-next;int flag=0;while(first!=NULL)if(first-loc=1)first-loc=0;flag=1;break;else first=first-next;if(flag=1)merge(tempId,first); printmem();else printf(需要释放的内存块不存在!n);return 1;int requestb(int size)block * temp=(struct block *)malloc(sizeof(struct block);int tempId = root(2,size);int flag=0;temp=idtempId-next;while(temp!=NULL)if(temp-loc=0 & temp-size=size) temp-loc=1;flag=1;printf(分配成功!n);printmem();return 1;elsetemp=temp-next;if(flag=0)tempId+;if(tempId=9)int rs=split(tempId);if(rs=-1) printf(没有合适的空间可分配!n);return -1;else requestb(size);else printf(没有合适的空间可分配!n);return -1;free(temp);int main()init();int flag=1; int size; char order; doprintf(请输入命令:(以空格相隔,示例:r 8)n);scanf(%c %d,&order,&size);if(order=r) requestb(size);else if(order=f) freeb(size);elseprintf(error!);printf(是否继续?(1继续,0退出):);scanf(%d,&flag);getchar();while(flag=1);结果图:2. 页故障率反馈模型源程序; #include #include #include #define MAX_WORKSET 10#define WINDOW_SIZE 20int mempage=10; int procArrayWINDOW_SIZE; int winMAX_WORKSET2;double maxRate=0.8,minRate=0.2;double curRate;int cur_workset=3;int conflictCount=0;void print()curRate=(double)conflictCount/(double)WINDOW_SIZE;printf(缺页故障率:%g,故障率上限/下限:%g/%gn,curRate,maxRate,minRate);void changeArray()int i;for(i=0;iWINDOW_SIZE;i+)procArrayi=rand()%mempage;printf(进程调用页面序列:);for(i=0;iWINDOW_SIZE;i+)printf(%d|,procArrayi);printf(n);void init()int i,j;/changeArray();for(i=0;iMAX_WORKSET;i+)wini0=-1;wini1=cur_workset;void changePage(int number)int i,flag=0;for(i=1;icur_workset;i+)if(winflag1 = wini1)flag=i;winflag0=procArraynumber;winflag1=1;conflictCount+;for(i=0;icur_workset;i+)if(i!=flag & wini1!=-1)wini1+;void step(int number)int i,hit=0;for(i=0;icur_workset;i+)if(procArraynumber = wini0)/number+;hit=1;break;if(hit=0)changePage(number);void run()int i;conflictCount=0;changeArray();for(i=0;imaxRate)cur_workset+;else if(curRateminRate)cur_workset-;int main()init();char quit;dorun();print();feedback();printf(输入任意字符继续,q退出n);scanf(%c,&quit);getchar();while(quit != q);4、 结果分析与实验体会存储管理是操作系统中最重要的组成部分之一。在早期计算时代,由于人们所需要的内存数目远远大于物理内存,人们设计出了各种各样的策略来解决此问题,其中最成功的是虚拟内存技术。它使得系统中为有限物理内存竞争的进程所需内存空间得到满足。我们以Buddy Heap算法为例,实现模拟Linux系统中连续内存分配。BH算法具有速度快的明显特点,同时解决了外碎片问题,但带来内碎片,这是由于实际请求一般不能恰好与2i相对应,此时必须向上取整。对于更大块的请求内碎片的浪费更严重。为此Linux将剩余的内碎片按2j整数次幂切片并由二次分配器进行单独管理。此外当进程物理空间不

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论