1、Linux操作系统实验报告存储管理试验参考模板电子信息学院实验报告书课程名:Linux操作系统实验 题 目: 实验三 存储管理试验 实验类别 【验证】 班 级: BX0907 学 号: 09 姓 名: 吴沛儒 评语:实验态度:认真( ) 一般( ) 差( )实验结果:正确( ) 部分正确( )错( )实验理论:掌握( ) 熟悉( ) 了解( ) 不懂( )操作技能:强( ) 一般( ) 差( )实验报告:好( ) 一般( ) 差( )成绩: 指导教师: 胡静 批阅时间: 年 月 日成绩: 指导教师: 宁建红 批阅时间: 年 月 日1、实验内容或题目(1)模拟初始内存页面分配(数组、结构体均可)
2、 (2)实现Buddy heap算法 (3)通过键盘输入随机产生申请和释放操作请求:r8代表申请8个页面。释放:f4代表释放4个页面。 (4)每个申请或释放操作,都在屏幕上显示操作前与操作后的内存分配的对比图。 (5)实验假设申请和释放的页数都是2的整次幂。(1)建立工作集页面模型。 (2)利用随机函数动态生成进程访问页面的序列号。 (3)实现FIFO页面淘汰算法。 (4)实现页故障率反馈模型。2、实验目的与要求(1) 用C语言是实现模拟Linux系统中连续内存分配用到的伙伴对算法。 (2) 通过链表的形式输出在内存申请和释放过程中内存状态的对比图。(1)了解工作集模型的原理及其特点。 (2)
3、实现页故障率反馈模型。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(size
4、of(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=NUL
5、L; 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-
6、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
7、=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=
8、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
9、-next; else second-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=
10、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 t
11、empId = 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; else temp=temp-next; if(flag=0) tempId+; if(tempId=9) int rs=split(tempId); if(rs=-1) printf(没有合适的空间可分配!n); return -1; else requestb(size)
12、; else printf(没有合适的空间可分配!n); return -1; free(temp); int main() init(); int flag=1; int size; char order; do printf(请输入命令:(以空格相隔,示例:r 8)n); scanf(%c %d,&order,&size); if(order=r) requestb(size); else if(order=f) freeb(size); else printf(error!); printf(是否继续?(1继续,0退出):); scanf(%d,&flag); getchar(); wh
13、ile(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)
14、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; wi
15、ni1=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(procArraynumb
16、er = 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; do run(); print(); feedback(); printf(输入任意字符继续,q退出n); scanf(%c,&quit); getchar(); wh
17、ile(quit != q);4、结果分析与实验体会存储管理是操作系统中最重要的组成部分之一。在早期计算时代,由于人们所需要的内存数目远远大于物理内存,人们设计出了各种各样的策略来解决此问题,其中最成功的是虚拟内存技术。它使得系统中为有限物理内存竞争的进程所需内存空间得到满足。我们以Buddy Heap算法为例,实现模拟Linux系统中连续内存分配。BH算法具有速度快的明显特点,同时解决了外碎片问题,但带来内碎片,这是由于实际请求一般不能恰好与2i相对应,此时必须向上取整。对于更大块的请求内碎片的浪费更严重。为此Linux将剩余的内碎片按2j整数次幂切片并由二次分配器进行单独管理。此外当进程物
18、理空间不要求连续时,内存分配由第三分配器完成。此外,这个实验还需要很好的理解FIFO算法,这是最简单的页面淘汰算法,在实现时,对应每一个页面需要有一个调入时间,该时间可设在内存中并用软件记录,不过最好设在寄存器中并由硬件记录。当内存空间紧张时,调入时间最早的页面将被淘汰。FIFO算法易于理解和编程,但它的效率不高。被置换的页面可能存有一个初始化程序段,很早以前曾用到,以后不会再用到;但也可能存有一组经常访问的全局变量,初始化时被调入内存,在整个程序运行过程中都将会用到。这次实验难点在理论方面,在理解了之后操作比较顺利。 友情提示:范文可能无法思考和涵盖全面,供参考!最好找专业人士起草或审核后使用,感谢您的下载!
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1