实验二存储器的分配与回收算法实现.docx

上传人:b****1 文档编号:12453848 上传时间:2023-04-19 格式:DOCX 页数:17 大小:22.91KB
下载 相关 举报
实验二存储器的分配与回收算法实现.docx_第1页
第1页 / 共17页
实验二存储器的分配与回收算法实现.docx_第2页
第2页 / 共17页
实验二存储器的分配与回收算法实现.docx_第3页
第3页 / 共17页
实验二存储器的分配与回收算法实现.docx_第4页
第4页 / 共17页
实验二存储器的分配与回收算法实现.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

实验二存储器的分配与回收算法实现.docx

《实验二存储器的分配与回收算法实现.docx》由会员分享,可在线阅读,更多相关《实验二存储器的分配与回收算法实现.docx(17页珍藏版)》请在冰豆网上搜索。

实验二存储器的分配与回收算法实现.docx

实验二存储器的分配与回收算法实现

实验报告

学院(系)名称:

计算机与通信工程学院

姓名

刘俊杰

学号

20115542

专业

信息与计算科学

班级

2011级1班

实验项目

实验二:

存储器的分配与回收算法实现

课程名称

操作系统

课程代码

0668036

实验时间

2013-11-273-4节

2013-11-297-8节

2013-12-43-4节

2013-12-67-8节

实验地点

主校区7-215

批改意见

成绩

 

教师签字:

实验内容:

1.本实验是模拟操作系统的主存分配,运用可变分区的存储管理算法设计主存分配和回收程序,并不实际启动装入作业。

2.采用最先适应法、最佳适应法、最坏适应法分配主存空间。

3.当一个新作业要求装入主存时,必须查空闲区表,从中找出一个足够大的空闲区。

若找到的空闲区大于作业需要量,这是应把它分成二部分,一部分为占用区,加一部分又成为一个空闲区。

4.当一个作业撤离时,归还的区域如果与其他空闲区相邻,则应合并成一个较大的空闲区,登在空闲区表中。

5.设计的模拟系统中,进程数不小于5,进程调度方式可以采用实验一中的任何一种。

6.运行所设计的程序,输出有关数据结构表项的变化和内存的当前状态。

实验要求:

1.详细描述实验设计思想、程序结构及各模块设计思路;

2.详细描述程序所用数据结构及算法;

3.明确给出测试用例和实验结果;

4.为增加程序可读性,在程序中进行适当注释说明;

5.认真进行实验总结,包括:

设计中遇到的问题、解决方法与收获等;

6.实验报告撰写要求结构清晰、描述准确逻辑性强;

7.实验过程中,同学之间可以进行讨论互相提高,但绝对禁止抄袭。

代码实现:

#include

#include

#defineNULL0

#defineLEN1sizeof(structjob)//作业大小

#defineLEN2sizeof(structidle)//空闲区单元大小

#defineLEN3sizeof(structallocate)//已分配区单元大小

intSPACE=100;//定义内存空间大小

intORIGI=1;//定义内存起始地址

structjob//定义作业

{

intname;

intsize;

intaddress;

};

structidle//定义空闲区

{

intsize;

intaddress;

structidle*next;

};

structallocate//定义已分配区

{

intname;

intsize;

intaddress;

structallocate*next;

};

structidle*creatidle(void)//建立空闲表

{

structidle*head;

structidle*p1;

p1=(structidle*)malloc(LEN2);

p1->size=SPACE;

p1->address=ORIGI;

p1->next=NULL;

head=p1;

return(head);

}

structallocate*creatallocate(void)//建立已分配表

{

structallocate*head;

head=NULL;

return(head);

}

structjob*creatjob(void)//建立作业

{

structjob*p;

p=(structjob*)malloc(LEN1);

printf("请输入要运行的作业的名称与大小:

\n");

scanf("%d%d",&p->name,&p->size);

return(p);

}

structidle*init1(structidle*head,structjob*p)//首次适应算法分配内存

{

structidle*p0,*p1;

structjob*a;

a=p;

p0=head;

p1=p0;

while(p0->next!

=NULL&&p0->sizesize)

{

p0=p0->next;

}

if(p0->size>a->size)

{

p0->size=p0->size-a->size;

a->address=p0->address;

p0->address=p0->address+a->size;

}

else

{

printf("无法分配\n");

}

return(head);

}

structidle*init2(structidle*head,structjob*p)//最优

{

structidle*p0,*p1;

structjob*a;

a=p;

p0=head;

if(p0==NULL)

{

printf("无法进行分配!

\n");

}

while(p0->next!

=NULL&&p0->sizesize)

{

p0=p0->next;

}

if(p0->size>a->size)

{

p1=p0;

p0=p0->next;

}

else

{

printf("无法分配!

\n");

}

while(p0!

=NULL)

{

if(p0->size>p1->size)

{

p0=p0->next;

}

elseif((p0->sizesize)&&(p0->size>a->size))

{

p1=p0;

p0=p0->next;

}

}

p1->size=(p1->size)-(a->size);

a->address=p1->address;

p1->address=(p1->address)+(a->size);

return(head);

}

structidle*init3(structidle*head,structjob*p)//最差

{

structidle*p0,*p1;

structjob*a;

a=p;

p0=head;

if(p0==NULL)

{

printf("无法进行分配!

");

}

while(p0->next!

=NULL&&p0->sizesize)

{

p0=p0->next;

}

if(p0->size>a->size)

{

p1=p0;

p0=p0->next;

}

else

{

printf("无法分配!

\n");

}

while(p0!

=NULL)

{

if(p0->sizesize)

{

p0=p0->next;

}

elseif(p0->size>p1->size)

{

p1=p0;

p0=p0->next;

}

}

p1->size=(p1->size)-(a->size);

a->address=p1->address;

p1->address=(p1->address)+(a->size);

return(head);

}

structallocate*reallocate(structallocate*head,structjob*p)//重置已分配表

{

structallocate*p0,*p1,*p2;//*p3,*p4;

structjob*a;

//structidle*b;

a=p;

p0=(structallocate*)malloc(LEN3);

p1=(structallocate*)malloc(LEN3);

if(head==NULL)

{

p0->name=a->name;

p0->size=a->size;

p0->address=ORIGI;

p0->next=NULL;

head=p0;

}

Else

{

p1->name=a->name;

p1->size=a->size;

p1->address=a->address;

p2=head;

while(p2->next!

=NULL)

{

p2=p2->next;

}p2->next=p1;

p1->next=NULL;

}

return(head);

}

structallocate*del(structallocate*head,structjob*p)//删除指定的作业

{

structjob*p1;

structallocate*p2,*p3;

p2=head;

p1=p;

while((p1->name!

=p2->name)&&(p2->next!

=NULL))

{

p3=p2;

p2=p2->next;

}

if(p1->name==p2->name)

{

if(p2==head)

head=p2->next;

else

p3->next=p2->next;

}

return(head);

}

structjob*delejob(structallocate*head)

{

structjob*p1;

structallocate*p2;

intnum;

p1=(structjob*)malloc(LEN1);

printf("请输入要删除的作业的名称\n");

scanf("%d",&num);

p2=head;

while((num!

=p2->name)&&(p2->next!

=NULL))

{

p2=p2->next;

}

if(num==p2->name)

{

p1->name=p2->name;

p1->size=p2->size;

p1->address=p2->address;

}

return(p1);

}

structidle*unite(structjob*p,structidle*head)//合并相邻内存空间

{

structidle*p1,*p2,*p3;

structjob*m;

m=p;

p1=head;

p3=(structidle*)malloc(LEN2);

while((p1->addressaddress)&&(p1->next!

=NULL))

{

p2=p1;

p1=p1->next;

}

if(m->addressaddress)

{

if(head==p1)

{

p3->size=m->size;

p3->address=m->address;

if((p1->address-p3->address)==(p3->size))

{

p1->address=p3->address;

p1->size=p3->size+p1->size;

}

else

{

head=p3;

p3->next=p1;

}

}

else

{

p3->size=m->size;

p3->address=m->address;

if((p1->address-p3->address)==(p3->size))

{

p1->address=p3->address;

p1->size=p3->size+p1->size;

if((p3->address-p2->address)==(p2->size))

{

p2->size=p1->size+p2->size;

p2->next=p1->next;

}

else

{

p2->next=p1;

}

}

else

{

if((p3->address-p2->address)==(p2->size))

{

p2->size=p2->size+p3->size;

}

else

{

p3->next=p1;

p2->next=p3;

}

}

}

}

else

{

p3->size=m->size;

p3->address=m->address;

if((p3->address-p1->address)==(p1->size))

{

p1->size=p1->size+p3->size;

}

else

{

p1->next=p3;

p3->next=NULL;

}

}

return(head);

}

voidprint(structidle*h1,structallocate*h2)

{

structidle*m1;

structallocate*n1;

m1=h1;

n1=h2;

if(m1==NULL)

{

printf("空闲表为空!

\n");

}

else

{

while(m1!

=NULL)

{

printf("空闲单元地址为%d,其大小为%d\n",m1->address,m1->size);

m1=m1->next;

}

}

if(n1==NULL)

{

printf("已分配表为空!

\n");

}

else

{

while(n1!

=NULL)

{

printf("已分配单元地址为%d,其大小为%d,其名称为%d\n",n1->address,n1->size,n1->name);

n1=n1->next;

}

}

}

voidFF(void)

{

structidle*p1;

structallocate*p2;

structjob*p,*q;

inty=1;

intn=0;

inta=1;

intc;

p1=creatidle();

p2=creatallocate();

printf("初始情况为:

\n");

print(p1,p2);

while(a==y)

{

printf("请输入要进行的操作:

1.建立作业2.删除作业3.结束操作\n");

scanf("%d",&c);

switch(c)

{

case1:

p=creatjob();

p1=init1(p1,p);

p2=reallocate(p2,p);

print(p1,p2);break;

case2:

q=delejob(p2);

p2=del(p2,q);

//p2=reallocate(p2,q);

p1=unite(q,p1);

print(p1,p2);break;

case3:

y=0;break;

}

}

}

voidBF(void)

{

structidle*p1;

structallocate*p2;

structjob*p,*q;

inty=1;

intn=0;

inta=1;

intc;

p1=creatidle();

p2=creatallocate();

printf("初始情况为:

\n");

print(p1,p2);

while(a==y)

{

printf("请输入要进行的操作:

1.建立作业2.删除作业3.结束操作\n");

scanf("%d",&c);

switch(c)

{

case1:

p=creatjob();

p1=init2(p1,p);

p2=reallocate(p2,p);

print(p1,p2);break;

case2:

q=delejob(p2);

p2=del(p2,q);

//p2=reallocate(p2,q);

p1=unite(q,p1);

print(p1,p2);break;

case3:

y=0;break;

}

}

}

voidWF(void)

{

structidle*p1;

structallocate*p2;

structjob*p,*q;

inty=1;

intn=0;

inta=1;

intc;

p1=creatidle();

p2=creatallocate();

printf("初始情况为:

\n");

print(p1,p2);

while(a==y)

{

printf("请输入要进行的操作:

1.建立作业2.删除作业3.结束操作\n");

scanf("%d",&c);

switch(c)

{

case1:

p=creatjob();

p1=init3(p1,p);

p2=reallocate(p2,p);

print(p1,p2);break;

case2:

q=delejob(p2);

p2=del(p2,q);

//p2=reallocate(p2,q);

p1=unite(q,p1);

print(p1,p2);break;

case3:

y=0;break;

}

}

}

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

当前位置:首页 > 法律文书 > 起诉状

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

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