1、计算机操作系统实验5 动态分区分配方式的模拟一、实验目的了解动态分区分配方式中使用的数据结构和分配算法,并进一步加深对动态分区存储管理方式及其实现过程的理解。二、实验内容及步骤(1)用C 语言分别实现采用首次适应算法(地址从小到大)和最佳适应算法(空闲块大小从小到大)的动态分区分配过程myalloc() 和回收过程myfree()(即自己编写一个分区分配和释放的函数) 。其中,空闲分区通过空闲分区链来管理;在进行内存分配时,系统优先使用空闲区低端的空间。(2)假设初始状态下,可用的内存空间为640 KB(即程序开始运行时,用malloc()函数一次申请640KB的内存空间,程序结束时用free
2、()函数释放空间。然后自己编写程序在这640KB的空间上模拟首次适应算法和最佳适应算法的分配过程。自己编写的分配过程不是真正去向操作系统申请空间,而是在这640KB空间上标记那块占用了;释放过程也不是真正释放空间,只是标记哪块分区空闲),作业请求序列如下:作业l 申请130 KB 。作业2 申请60 KB 。作业3 申请100 KB 。作业2 释放60 KB 。作业4 申请200 KB 。作业3 释放100 KB 。作业l 释放130 KB 。作业5 申请140 KB 。作业6 申请60 KB 。作业7 申请50 KB 。作业6 释放60 KB 。请分别采用首次适应算法和最佳适应算法进行内存块
3、的分配和回收,要求每次分配和回收后显示出空闲内存分区链的情况。三、实验步骤与调试过程:每个分区有4个数据项,起始地址,大小,状态,进程号,其实地址和大小以KB为单位,状态分为“已分”或“空闲”,进程号:若分区是已分,则填上此分区的进程号,若分区是空闲,则填入? 这里先采用首次适应算法,首次适应算法是将空闲区按起始地址从小到大排序后,会给出3种选择 1.分配空间:输入申请空间的进程号,不能与已经存在的进程号相同,申请空间的大小和阀值,如果分配成功,则重新排序,再次给出3种选择 2.回收空间:则只用输入回收空间的进程号,回收是考虑上下是否邻街空闲区,显示回收后的内存分配情况。 3.结束:直接退出程
4、序四、实验结果:Distribution of memory: work1:130 free :500 Distribution of memory: work1:130 work2:60 free :440 Distribution of memory: work1:130 work2:60 work3:100 free :340 Distribution of memory: work1:130 free :60 work3:100 free :340 Distribution of memory: work1:130 free :60 work3:100 work4:200 free :
5、140 Distribution of memory: work1:130 free :160 work4:200 free :140 Distribution of memory: free :290 work4:200 free :140 Distribution of memory: work5:140 free :150 work4:200 free :140 Distribution of memory: work5:140 work6:60 free :90 work4:200 free :140Distribution of memory: work5:140 work6:60
6、work7:50 free :40 work4:200 free :140 Distribution of memory:五、主要算法和程序清单:#include#define getpch(type) (type*)malloc(sizeof(type) struct LNode int size; int start; int end; struct LNode *next; struct LNode *front;*L; /*L为头指针*/typedef struct LNode LN;LN *find;int n;void InsertList(int size,int start)
7、/ 在带头结点的单链线形表头结点后插入 LN *p,*s,*t; p=L; t=p-next; s=getpch(LN); /生成新结点 s-size=size; s-start=start; s-end=start + size ; s-next=t; /插入L中 p-next=s; if(t) t-front=s; s-front=p;/end of InsertListvoid PrintList() /*打印*/ LN *p; int i; p=L-next; printf(n空闲区号 长度 起始位置 终止位置n); for(i=1;isize, p-start,p-end); p=p
8、-next; void BFSortList() /*最佳适应算法的排序*/ LN *p,*s,*t; int min_size,i; int size,start,end; t=L-next; p=L-next; for(i=0;inext; min_size = p-size; while(s) if(min_size s-size) min_size=s-size; t=s; s=s-next; size=t-size; start=t-start; end=t-end; t-size=p-size; t-start=p-start; t-end=p-end; p-size=size;
9、p-start=start; p-end=end; t=p-next; p=p-next; / end of BF_SortListvoid SortList() /*首次和循环首次适应算法的排序*/ LN *p,*s,*t; int min_start,i; int size,start,end; t=L-next; p=L-next; for(i=0;inext; min_start = p-start; while(s) if(min_start s-start) min_start=s-start; t=s; s=s-next; size=t-size; start=t-start;
10、end=t-end; t-size=p-size; t-start=p-start; t-end=p-end; p-size=size; p-start=start; p-end=end; t=p-next; p=p-next; / end of BF_SortListvoid GetFree() /*生成空闲分区链*/ int size,start,i; L=getpch(LN); /*生成一个表头结点*/ L-next=NULL; L-front=NULL; printf(请输入空闲区数:); scanf(%d,&n); for(i=1;inext; t=L; while(p) if(si
11、ze p-size) p=p-next; t=t-next; if(!p) printf(没有足够大的空闲区分配!分配不成功); else p-size = p-size - size; p-start= p-start + size ; if(p-size=0) t-next = p-next ; p-next-front=t; n-; free(p); printf(分配成功!n); printf(分配后的空闲链表情况如下:n); PrintList(); break; / end of FF_Assignint flag=-1;void NF_Assign(int size)/*循环首次
12、适应算法的分配*/ LN *p,*t; int i=n; p=find-next; t=find; while(p) if(size p-size) p=p-next; t=t-next; if(!p) printf(没有足够大的空闲区分配!分配不成功); else p-size = p-size - size; p-start= p-start + size ; find=p; if(p-size=0) t-next = p-next; p-next-front=t; n-; free(p); printf(分配成功!n); flag=1; printf(分配后的空闲链表情况如下:n); P
13、rint(L); break; if(flag=-1) p=L-next; t=L; while(p!=find) if(size p-size) p=p-next; t=t-next; if(!p) printf(没有足够大的空闲区分配!分配不成功); else p-size = p-size - size; p-start= p-start + size ; find=t; if(p-size=0) t-next = p-next ; p-next-front=t; n-; free(p); printf(分配成功!n); printf(分配后的空闲链表情况如下:); PrintList(
14、L); break; / end of NF_Assignvoid Recover(int start, int end) /*回收*/ LN *p,*t; int size,flag=0; size=end-start; p=L-next; t=p-next; while(p) if(t & p-end=start & t-start=end)/回收区在两个空闲区中间 p-size = p-size + size + t-size; p-end = t-end; p-next=t-next; t-next-front=p; free(t); n-; SortList(L); flag=1;
15、break; else if(p-end = start)/回收区在空闲区下方 flag=1; p-size = p-size + size; p-end = p-end + size ; SortList(L); break; else if( p-start = end)/回收区在空闲区上方 p-size= p-size +size; p-start=start; SortList(L); flag=1; break; p=p-next; if(p) t=p-next; /回收区不与任何一个空闲区相邻 if(flag=0) InsertList(size,start); n+; print
16、f(回收后的空闲链表情况如下:); PrintList(); printf(n按任意键继续); void main() int start,end,size; int m; GetFree(); getch(); system(cls);/*清屏*/ printf(请选择服务类型:n); printf(t1:首次适应算法n); printf(t2:循环首次适应算法n); printf(t3:最佳适应算法n); printf(t4:回收内存n); printf(t0:退出n); printf(t输入您要的选项:); scanf(%d,&m); if(m=2) find=L; while(m) s
17、witch(m) case 1: SortList(); printf(n空闲链表情况:n); PrintList(); printf(请输入进程需要的空闲区大小:); scanf(%d,&size); Assign(size); printf(n按任意键继续); break; case 2: SortList(); printf(n空闲链表情况:n); PrintList(); printf(请输入进程需要的空闲区大小:); scanf(%d,&size); NF_Assign(size);printf(n按任意键继续); break; case 3: BFSortList(); print
18、f(n空闲链表情况:n); PrintList(); printf(请输入进程需要的空闲区大小:); scanf(%d,&size); Assign(size);printf(n按任意键继续); break; case 4: printf(请输入回收区的首地址和中止地址:); scanf(%3d,%3d,&start,&end); Recover(start,end); break; case 0: exit(0); default : printf(ntt输入错误,请重新输入); getch(); getch(); system(cls);/*清屏*/ printf(请选择服务类型:n); printf(t1:首次适应算法n); printf(t2:循环首次适应算法n); printf(t3:最佳适应算法n); printf(t4:回收内存n); printf(t0:退出n); printf(t输入您要的选项:); scanf(%d,&m);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1