《操作系统原理 第2版实验与思考第7章内存管理.docx》由会员分享,可在线阅读,更多相关《操作系统原理 第2版实验与思考第7章内存管理.docx(6页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、【实验与思考】Linux用户程序的内存管理本实验以一个Linux实例程序说明应用程序如何通过系统调用来管理自己用的空闲内存, 目的在于加深读者对操作系统存储管理内容的理解。本实验实例由my-malloc.h、my-malloc.c和test.c三个文件组成。为阅读程序方便,对其中 的主要函数作了说明,读者可结合程序注释理解该程序。(1) 了解通过利用操作系统调用实现用户程序分配内存以及回收所用内存的程序过程,加 深对操作系统存储管理机制的理解。(2)通过阅读和分析Linux实验程序,学习Linux程序设计、调试和运行的方法。1 .工具/准备工作(1)在开始本实验之前,请回顾教科书的相关内容。(
2、2)需要准备一台运行Linux操作系统的计算机。2.实验内容与步骤本实验程序主要定义了一个描述自由存储块的结构,每一个自由块都包含块的大小、指向 下一块的指针以及块区本身,所有的自由块以地址增加顺序排列,并用链表链接起来。这一链 表是本程序维护的一个空闲区域,对于操作系统的当前记录来说是已分出去的区域。因为本程 序是运行在用户态的程序。步骤1 :单击红帽子,在“GNOME帮助” “附件”菜单中单击“文本编辑器”命令,在 文本编辑中键入清单7-1程序并保存为my-malloc.ho清单 7-1 my-ma I I oc. h 文件# include typedef long Align;unio
3、n header struct union header *next;unsigned int size;s;Align x;);/* for alignment to long boundary */* block header: */* next block if on Free list */* size of this block */* force alignment of blocks */typedef union header Header;# define NALLOC 10minimum #units to request * static Header* morecore
4、 (unsigned int nu);void * Malloc (unsigned int nbytes);void Free (void *ap);步骤2:单击红帽子,在“GNOME帮助” “附件”菜单中单击“文本编辑器”命令,在 文本编辑中键入清单7-2程序并保存为my-malloc.co清单 7-2 my-ma I I oc. c 文件# include # include xxmy_malloc . hz,static Header base;/* empy list to get started */static Header*free_list=NULL; /* start of
5、 free list */* Malloc: general-purpose storage allocator */ void * Malloc (unsigned int nbytes) Header *p, *prev;unsigned int nunits;nunits= (nbytes4-sizeof (Header) -1) /sizeof (Header) +1 ; if (prev=free_list) =NULL) /* no free list yet */base , s.next=free_list=prev=&base;base . s.size=0; )for (p
6、=prev-s.next; ; prev=pz p=p-s.next) if (p-s.size=nunits) /* big enough */if (p-s.size=nunits)/* exactly */prev-s . next=p-s.next;else p-s size-=nunits;p+=p-s.size;p-s.size=nunits; )free_list = prev;return (void *) (p+1); )if (p=free_list)/* wrapped around Free list /if (p=morcore (nunits) =NULL)retu
7、rn NULL;/* none left */* endfor */)/* morecore: ask system for more memory */ static Header * morecore (unsigned int nu) char *cp;Header *up;if (nus , size=nu;Free (up+1);return free_list; /* Free: put block ap in Free list */ void Free (void *ap)Header *bp, *p;bp= (Header *) ap-1;/* point to block
8、header */for (p=free_list;! (bpp & bps.next) ; p=p-s.next) if (p=p-s.next & (bpp|bps.next) break; /* freed block at start or end of arena * if (bp+bp-s.size=p-s.next) /* join to upper nbr */bp-s size+=p-s.next-s.size;bp - s.next = p - s.next - s.next; ) elsebp-s , next=p-s.next;if (p+p-s.size=bp) /
9、join to lower nbr /p-s.size+=bp一s.size;p-s.next=bp-s.next;elsep-s , next=bp;free_list=p;)void printlist (void) (Header *p;int i=0;printf (base : %X, base . next: %X, base . next. next: %X, free:%xn,&base,base.s.next,base.s.next-s.next,free_list);for (p=&base;p-s.next!=free_list;p=-s.next) i + + ;pri
10、ntf (block %d, siz;=%d,工,p-s . size);if (pfree_list)printf (used! n);elseprintf (free ! nff);)当请求分配内存时,扫描自由存储块链表,直到找到一个足够大的可供分配的内存块,若 找到的块大小正好等于所请求的大小时,就把这一块从自由链表中取下来,返回给申请者。若 找到的块太大,即对其分割,并将一块大小适合的空间返回给申请者,余下的部分返回链表。 若找不到足够大的块,就通过调用morecore ()函数从操作系统区请求另外一块足够大的内存 区域,并把它链接到自由块链表中,然后再继续搜索。morecore ()
11、函数从操作系统得到存储空间,在Linux中,通过系统调用sbrk (n)向操 作系统申请n个字节的存储空间,返回值为申请到的存储空间的起始地址。由于要求系统分配 存储空间是一个代价较大的操作,故通常一次申请一个较大的内存空间,需要时再将其分割。释放存储块也要搜索自由链表,目的是找到适当的位置将要释放的块插进去,如果被释放 的块的任何一边与链表中的某一块邻接,即对其进行合并操作,直到没有可合并的邻接块为止,这样可防止存储空间变得过于零碎。Linux正是通过采用所谓的Buddy算法防止存储空间由于内 存空间的频繁分配和回收而变得过于零碎。步骤3:单击红帽子,在“GNOME帮助” “附件”菜单中单击“文本编辑器”命令,在 文本编辑中键入清单7-3程序并保存为testeo清单7-3 test.c文件。# include xmy-malloc .int main ()char *p200; int i;for (i=0; i=0;i-) Free (p i);printf (free %dn,i); print_list ();) return 0;步骤4:编译。cc -o test test. c如果有错,请用Text Editor工具修改源程序,直到编译通过。请记录:调试过程是:步骤5:运行。/ test运行结果(如果运行不成功,则可能的原因是什么?):3.实验总结4.教师实验评价
限制150内