计算机操作系统.docx
《计算机操作系统.docx》由会员分享,可在线阅读,更多相关《计算机操作系统.docx(14页珍藏版)》请在冰豆网上搜索。
![计算机操作系统.docx](https://file1.bdocx.com/fileroot1/2022-12/31/bccf0543-32fc-44cf-ba65-27ee382c6105/bccf0543-32fc-44cf-ba65-27ee382c61051.gif)
计算机操作系统
实验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);
}
}