计算机操作系统.docx
- 文档编号:5739580
- 上传时间:2022-12-31
- 格式:DOCX
- 页数:14
- 大小:18.01KB
计算机操作系统.docx
《计算机操作系统.docx》由会员分享,可在线阅读,更多相关《计算机操作系统.docx(14页珍藏版)》请在冰豆网上搜索。
计算机操作系统
实验5动态分区分配方式的模拟
一、实验目的
了解动态分区分配方式中使用的数据结构和分配算法,并进一步加深对动态分区存储管理方式及其实现过程的理解。
二、实验内容及步骤
(1)用C语言分别实现采用首次适应算法(地址从小到大)和最佳适应算法(空闲块大小从小到大)的动态分区分配过程myalloc()和回收过程myfree()(即自己编写一个分区分配和释放的函数)。
其中,空闲分区通过空闲分区链来管理;在进行内存分配时,系统优先使用空闲区低端的空间。
(2)假设初始状态下,可用的内存空间为640KB(即程序开始运行时,用malloc()函数一次申请640KB的内存空间,程序结束时用free()函数释放空间。
然后自己编写程序在这640KB的空间上模拟首次适应算法和最佳适应算法的分配过程。
自己编写的分配过程不是真正去向操作系统申请空间,而是在这640KB空间上标记那块占用了;释放过程也不是真正释放空间,只是标记哪块分区空闲),作业请求序列如下:
●作业l申请130KB。
●作业2申请60KB。
●作业3申请100KB。
●作业2释放60KB。
●作业4申请200KB。
●作业3释放100KB。
●作业l释放130KB。
●作业5申请140KB。
●作业6申请60KB。
●作业7申请50KB。
●作业6释放60KB。
请分别采用首次适应算法和最佳适应算法进行内存块的分配和回收,要求每次分配和回收后显示出空闲内存分区链的情况。
三、实验步骤与调试过程:
每个分区有4个数据项,起始地址,大小,状态,进程号,其实地址和大小以KB为单位,状态分为“已分”或“空闲”,进程号:
若分区是已分,则填上此分区的进程号,若分区是空闲,则填入?
这里先采用首次适应算法,首次适应算法是将空闲区按起始地址从小到大排序后,会给出3种选择
1.分配空间:
输入申请空间的进程号,不能与已经存在的进程号相同,申请空间的大小和阀值,如果分配成功,则重新排序,再次给出3种选择
2.回收空间:
则只用输入回收空间的进程号,回收是考虑上下是否邻街空闲区,显示回收后的内存分配情况。
3.结束:
直接退出程序
四、实验结果:
Distributionofmemory:
work1:
130free:
500
Distributionofmemory:
work1:
130work2:
60free:
440
Distributionofmemory:
work1:
130work2:
60work3:
100free:
340
Distributionofmemory:
work1:
130free:
60work3:
100free:
340
Distributionofmemory:
work1:
130free:
60work3:
100work4:
200free:
140
Distributionofmemory:
work1:
130free:
160work4:
200free:
140
Distributionofmemory:
free:
290work4:
200free:
140
Distributionofmemory:
work5:
140free:
150work4:
200free:
140
Distributionofmemory:
work5:
140work6:
60free:
90work4:
200free:
140
Distributionofmemory:
work5:
140work6:
60work7:
50free:
40work4:
200free:
140
Distributionofmemory:
五、主要算法和程序清单:
#include
#definegetpch(type)(type*)malloc(sizeof(type))
structLNode
{intsize;
intstart;
intend;
structLNode*next;
structLNode*front;
}*L;/*L为头指针*/
typedefstructLNodeLN;
LN*find;
intn;
voidInsertList(intsize,intstart)
{//在带头结点的单链线形表头结点后插入
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;
}//endofInsertList
voidPrintList()/*打印*/
{
LN*p;inti;
p=L->next;
printf("\n空闲区号长度起始位置终止位置\n");
for(i=1;i<=n;i++)
{
printf("%3d\t%3d\t%3d\t%4d\n",i,p->size,p->start,p->end);
p=p->next;
}
}
voidBFSortList()/*最佳适应算法的排序*/
{
LN*p,*s,*t;
intmin_size,i;
intsize,start,end;
t=L->next;
p=L->next;
for(i=0;i { s=p->next; 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; p->start=start; p->end=end; t=p->next; p=p->next; } }//endofBF_SortList voidSortList()/*首次和循环首次适应算法的排序*/ { LN*p,*s,*t; intmin_start,i; intsize,start,end; t=L->next; p=L->next; for(i=0;i { s=p->next; 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; 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; } }//endofBF_SortList voidGetFree()/*生成空闲分区链*/ { intsize,start,i; L=getpch(LN);/*生成一个表头结点*/ L->next=NULL; L->front=NULL; printf("请输入空闲区数: "); scanf("%d",&n); for(i=1;i<=n;i++) { printf("请输入第%2d空闲区的大小和始址: ",i); scanf("%3d,%3d",&size,&start); InsertList(size,start); } printf("\n按任意键继续"); //printf("\n空闲链表情况: \n"); //PrintList(); }//endofGetFree voidAssign(intsize)/*最佳适应算法和首次适应算法空闲分区的分配*/ { LN*p,*t; p=L->next; t=L; 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; if(p->size==0) { t->next=p->next; p->next->front=t; n--; free(p); } printf("分配成功! \n"); printf("分配后的空闲链表情况如下: \n"); PrintList(); break; } } }//endofFF_Assign intflag=-1; voidNF_Assign(intsize)/*循环首次适应算法的分配*/ { LN*p,*t; inti=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"); Print(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(L); break; } } } }//endofNF_Assign voidRecover(intstart,intend)/*回收*/ { LN*p,*t; intsize,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; break; } elseif(p->end==start)//回收区在空闲区下方 { flag=1; p->size=p->size+size; p->end=p->end+size; SortList(L); break; } elseif(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++;} printf("回收后的空闲链表情况如下: "); PrintList(); printf("\n按任意键继续"); } voidmain() { intstart,end,size; intm; 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) { switch(m) { case1: SortList();printf("\n空闲链表情况: \n"); PrintList(); printf("请输入进程需要的空闲区大小: "); scanf("%d",&size); Assign(size);printf("\n按任意键继续"); break; case2: SortList();printf("\n空闲链表情况: \n"); PrintList(); printf("请输入进程需要的空闲区大小: "); scanf("%d",&size); NF_Assign(size);printf("\n按任意键继续"); break; case3: BFSortList();printf("\n空闲链表情况: \n"); PrintList(); printf("请输入进程需要的空闲区大小: "); scanf("%d",&size); Assign(size);printf("\n按任意键继续"); break; case4: printf("请输入回收区的首地址和中止地址: "); scanf("%3d,%3d",&start,&end); Recover(start,end); break; case0: exit(0); default: printf("\n\t\t输入错误,请重新输入");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); } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 操作系统
![提示](https://static.bdocx.com/images/bang_tan.gif)