好文档 - 专业文书写作范文服务资料分享网站

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

天下 分享 时间: 加入收藏 我要投稿 点赞

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

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

当一个新作业要求装入主存时, 必须查空闲区表, 从中找出一个足够大的空闲区。 若找到的 空闲区大于作业需要量, 这是应把它分成二部分, 一部分为占用区, 加一部分又成为一个空 闲区。 当一个作业撤离时, 归还的区域如果与其他空闲区相邻, 则应合并成一个较大的空闲区, 登 在空闲区表中。

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

详细描述实验设计思想、程序结构及各模块设计思路; 详细描述程序所用数据结构及算法; 明确给出测试用例和实验结果; 为增加程序可读性,在程序中进行适当注释说明; 认真进行实验总结,包括:设计中遇到的问题、解决方法与收获等; 实验报告撰写要求结构清晰、描述准确逻辑性强;

【实验过程记录(源程序、测试用例、测试结果及心得体会等) 】 #include #include #define NULL 0

#define LEN1 sizeof(struct job)// 作业大小 #define LEN2 sizeof(struct idle)// 空闲区单元大小 #define LEN3 sizeof(struct allocate)// 已分配区单元大小 int SPACE=100;// 定义内存空间大小 int ORIGI=1;// 定义内存起始地址 struct job// 定义作业

{

int name; int size; int address; };

struct idle// 定义空闲区

{

int size; int address; struct idle *next; };

struct allocate// 定义已分配区

{

int name; int size; int address; struct allocate *next; };

struct idle *creatidle(void)// 建立空闲表

{

struct idle *head; struct idle *p1;

p1=(struct idle*)malloc(LEN2); p1->size=SPACE; p1->address=ORIGI; p1->next=NULL; head=p1; return(head);

}

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

{

struct allocate *head; head=NULL; return(head);

}

struct job *creatjob(void)// 建立作业

{

struct job *p;

p=(struct job*)malloc(LEN1);

printf(\请输入要运行的作业的名称与大小 :\\n\return(p);

}

struct idle *init1(struct idle *head,struct job *p)// 首次适应算法分配内存 {

struct idle *p0,*p1; struct job *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);

}

struct idle *init2(struct idle *head,struct job *p)//

{

最优

struct idle *p0,*p1; struct job *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;

}

else if((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);

}

struct idle *init3(struct idle *head,struct job *p)// 最差

{

struct idle *p0,*p1; struct job *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;

}

else if(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);

}

struct allocate *reallocate(struct allocate *head,struct job *p)// { 重置已分配表

struct allocate *p0,*p1,*p2;//*p3,*p4; struct job *a; //struct idle *b; a=p;

p0=(struct allocate*)malloc(LEN3);

p1=(struct allocate*)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);

}

struct allocate *del(struct allocate *head,struct job *p)// 删除指定的作业 {

struct job *p1;

struct allocate *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);

}

struct job *delejob(struct allocate *head)

{

struct job *p1; struct allocate *p2; int num;

p1=(struct job*)malloc(LEN1); printf(\请输入要删除的作业的名称 \\n\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);

}

struct idle *unite(struct job *p,struct idle *head)// 合并相邻内存空间

{

struct idle *p1,*p2,*p3; struct job *m; m=p; p1=head;

p3=(struct idle*)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

{

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

实验内容:模拟操作系统的主存分配,运用可变分区的存储管理算法设计主存分配和回收程序,并不实际启动装入作业。采用最先适应法、最佳适应法、最坏适应法分配主存空间。当一个新作业要求装入主存时,必须查空闲区表,从中找出一个足够大的空闲区。若找到的空闲区大于作业需要量,这是应把它分成二部分,一部分为占用区,加一部分又成为一个空闲区
推荐度:
点击下载文档文档为doc格式
6kkk9112fo8n6j4879hw6x2111f27v00bgb
领取福利

微信扫码领取福利

微信扫码分享