实验内容: 模拟操作系统的主存分配, 运用可变分区的存储管理算法设计主存分配和回收程序, 并不实 际启动装入作业。
采用最先适应法、最佳适应法、最坏适应法分配主存空间。
当一个新作业要求装入主存时, 必须查空闲区表, 从中找出一个足够大的空闲区。 若找到的 空闲区大于作业需要量, 这是应把它分成二部分, 一部分为占用区, 加一部分又成为一个空 闲区。 当一个作业撤离时, 归还的区域如果与其他空闲区相邻, 则应合并成一个较大的空闲区, 登 在空闲区表中。
运行所设计的程序,输出有关数据结构表项的变化和内存的当前状态。 实验要求:
详细描述实验设计思想、程序结构及各模块设计思路; 详细描述程序所用数据结构及算法; 明确给出测试用例和实验结果; 为增加程序可读性,在程序中进行适当注释说明; 认真进行实验总结,包括:设计中遇到的问题、解决方法与收获等; 实验报告撰写要求结构清晰、描述准确逻辑性强;
【实验过程记录(源程序、测试用例、测试结果及心得体会等) 】 #include
#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->size
{
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->size
{
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->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->size
{
p0=p0->next; if(p0->size>a->size)
}
{
p1=p0; p0=p0->next;
}
else
{
printf(\无法分配 !\\n\
}
while(p0!=NULL)
{
if(p0->size
{
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->address
{
p2=p1; p1=p1->next;
}
if(m->address
{
{
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
{
存储器的分配与回收算法实现
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)