计算机操作系统.docx

上传人:b****6 文档编号:5739580 上传时间:2022-12-31 格式:DOCX 页数:14 大小:18.01KB
下载 相关 举报
计算机操作系统.docx_第1页
第1页 / 共14页
计算机操作系统.docx_第2页
第2页 / 共14页
计算机操作系统.docx_第3页
第3页 / 共14页
计算机操作系统.docx_第4页
第4页 / 共14页
计算机操作系统.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

计算机操作系统.docx

《计算机操作系统.docx》由会员分享,可在线阅读,更多相关《计算机操作系统.docx(14页珍藏版)》请在冰豆网上搜索。

计算机操作系统.docx

计算机操作系统

实验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);

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1