smilesword.com
1.实验目的
一个好的计算机系统不仅要有一个足够容量的、存取速度高的、稳定可靠的主存储器,而且要能合理地分配和使用这些存储空间。当用户提出申请存储器空间时,存储管理必须根据申请者的要求,按一定的策略分析主存空间的使用情况,找出足够的空闲区域分配给申请者。当作业撤离或主动归还主存资源时,则存储管理要收回作业占用的主存空间或归还部分主存空间。主存的分配和回收的实现虽与主存储器的管理方式有关的,通过本实验帮助学生理解在不同的存储管理方式下应怎样实现主存空间的分配和回收。
2.实验内容
本实验模拟在两种存储管理方式下的主存分配和回收。
3.提示与讲解
本实验有两个题,学生可选择其中的一题做实验。
第一题:在可变分区管理方式下采用最先适应算法实现主存分配和实现主存回收。
可变分区方式是按作业需要的主存空间大小来分割分区的。当要装入一个作业时,根据作业需要的主存量查看是否有足够的空闲空间,若有,则按需要量分割一个分区分配给该作业;若无,则作业不能装入。随着作业的装入、撤离,主存空间被分成许多个分区,有的分区被作业占用,而有的分区是空闲的。例如:
操 0 5k 10k 14k 26k 32k 128k 作系统 |
作业1 |
作业3 |
空闲区 |
作业2 |
空闲区 |
为了说明哪些区是空闲的,可以用来装入新作业,必须要有一张空闲区说明表,格式如下:
|
起址 |
长度 |
状态 |
第一栏 |
14 K |
12 K |
未分配 |
第二栏 |
32 K |
96 K |
未分配 |
|
|
|
空表目 |
|
|
空表目 |
|
|
|
|
其中,起址——指出一个空闲区的主存起始地址。
长度——指出从起始地址开始的一个连续空闲的长度。
状态——有两种状态,一种是“未分配”状态,指出对应的由起址指出的某个长度的区域是空闲区;另一种是“空表目”状态,表示表中对应的登记项目是空白(无效),可用来登记新的空闲区(例如,作业撤离后,它所占的区域就成了空闲区,应找一个“空表目”栏登记归还区的起址和长度且修改状态)。由于分区的个数不定,所以空闲区说明表中应有适量的状态为“空表目”的登记栏目,否则造成表格“溢出”无法登记。
上述的这张说明表的登记情况是按提示(1)中的例所装入的三个作业占用的主存区域后填写的。
(2)当有一个新作业要求装入主存时,必须查空闲区说明表,从中找出一个足够大的空闲区。有时找到的空闲区可能大于作业需要量,这时应把原来的空闲区变成两部分:一部分分给作业占用;另一部分又成为一个较小的空闲区。为了尽量减少由于分割造成的空闲区,而尽量保存高地址部分有较大的连续空闲区域,以利于大型作业的装入。为此,在空闲区说明表中,把每个空闲区按其地址顺序登记,即每个后继的空闲区其起始地址总是比前者大。为了方便查找还可使表格“紧缩”,总是让“空表目”栏集中在表格的后部。
(3)采用最先适应算法(顺序分配算法)分配主存空间。
按照作业的需要量,查空闲区说明表,顺序查看登记栏,找到第一个能满足要求的空闲区。当空闲区大于需要量时,一部分用来装入作业,另一部分仍为空闲区登记在空闲区说明表中。
由于本实验是模拟主存的分配,所以把主存区分配给作业后并不实际启动装入程序装入作业,而用输出“分配情况”来代替。最先适应分配算法如图4-1。
(4)当一个作业执行结束撤离时,作业所占的区域应该归还,归还的区域如果与其它空闲区相邻,则应合成一个较大的空闲区,登记在空闲区说明表中。例如,在提示(1)中列举的情况下,如果作业2撤离,归还所占主存区域时,应与上、下相邻的空闲区一起合成一个大的空闲区登记在空闲区说明表中。归还主存时的回收算法如图4-2。
(5)请按最先适应算法设计主存分配和回收的程序。然后按(1)中假设主存中已装入三个作业,且形成两个空闲区,确定空闲区说明表的初值。现有一个需要主存量为6K的作业4申请装入主存;然后作业3撤离;再作业2撤离。请你为它们进行主存分配和回收,把空闲区说明表的初值以及每次分配或回收后的变化显示出来或打印出来。
说实话我对这个做的很不满意,可能因为通宵加上时间紧,代码写的非常糟糕()...不过还是贴上来,有时间自己看看改改...
#include
#include
typedef struct task
{
int name; /*作业名*/
int add;
int length; /*作业长度,所需主存大小*/
struct task *next;/*指向下一个作业控制块的指针*/
}
nodet;
typedef struct chart
{
int add;
int length;
int status;
struct chart *next;
}
nodec;
nodet* headt;
nodec* headc;
void init()
{
nodet* t;
nodec* c;
headt = (nodet*)malloc(sizeof(nodet));
headc = (nodec*)malloc(sizeof(nodec));
t = headt->next = (nodet*)malloc(sizeof(nodet));
c = headc->next = (nodec*)malloc(sizeof(nodec));
t->name = 1;
t->add = 5;
t->length = 5;
c->add = 14;
c->length = 12;
c->status = 0;
t = t->next = (nodet*)malloc(sizeof(nodet));
c = c->next = (nodec*)malloc(sizeof(nodec));
t->name = 3;
t->add = 10;
t->length = 4;
c->add = 32;
c->length = 96;
c->status = 0;
c->next = NULL;
t = t->next = (nodet*)malloc(sizeof(nodet));
t->name = 2;
t->add = 26;
t->length = 6;
t->next = NULL;
}
void printLink()
{
nodec* p;
p = headc->next;
printf(" ADD LENGTH\n");
while(p)
{
printf(" %dK %dK\n",p->add,p->length);
p=p->next;
}
}
int taskIn(int name,int length)
{
int done = 0,add;
nodec *b,*c;
c = headc->next;
if (!c)
{
return 0;
}
else
{
while(c)
{
if (c->length < length)
{
b = c;
c = c->next;
}
else if (c->length > length)
{
c->length = c->length - length;
//c->add = c->add - length;
add = c->add;
done = 1;
break;
}
else if (c->length == length)
{
if (headc->next == c)
{
add = c->add;
headc->next = c->next;
free(c);
}
else
{
add = c->add;
b->next = c->next;
free(c);
}
done = 1;
break;
}
}
if (done == 0)
{
return 0;
}
}
nodet* t;
t = headt->next;
if (t != NULL)
{
while(t->next)
{
t = t->next;
}
t->next = (nodet*)malloc(sizeof(nodet));
t = t->next;
t->name = name;
t->add = add;
t->length = length;
}
else
{
t = headt->next = (nodet*)malloc(sizeof(nodet));
t->name = name;
t->add = add;
t->length = length;
}
printLink();
return 1;
}
int taskOut(int name)
{
int add,length;
nodet *t,*k;
t = headt->next;
while (t)
{
if (t->name == name && headt->next == t)
{
add = t->add;
length = t->length;
headt->next = t->next;
free(t);
break;
}
else if (t->name != name)
{
k = t;
t = t->next;
}
else if (t->name == name && headt->next != t)
{
add = t->add;
length = t->length;
k->next = t->next;
free(t);
break;
}
}
nodec *c,*b;
c = headc->next;
if (c != NULL)
{
while(c)
{
if (c == headc->next && add < c->add)
{
if ((add + length) == c->add)
{
c->add = add;
c->length = c->length + length;
printLink();
return 1;
}
b = (nodec*)malloc(sizeof(nodec));
b->add = add;
b->length = length;
headc->next = b;
b->next = c;
printLink();
return 1;
}
else if (c != headc->next)
{
if ((b->add + b->length) != add && (add + length) != c->add)
{
b->next = (nodec*)malloc(sizeof(nodec));
b->next->next = c;
b->next->add = add;
b->next->length = length;
printLink();
return 1;
}
else if ((b->add + b->length) == add && (add + length) != c->add)
{
b->length = b->length + length;
printLink();
return 1;
}
else if ((b->add + b->length) != add && (add + length) == c->add)
{
c->add = add;
c->length = c->length + length;
printLink();
return 1;
}
else if ((b->add + b->length) == add && (add + length) == c->add)
{
b->length = b->length + length + c->length;
b->next = c->next;
free(c);
printLink();
return 1;
}
else
{
b = c;
c = c->next;
}
}
else if (c == headc->next && add < c->add)
{
if ((add + length) < c->add)
{
headc->next = (nodec*)malloc(sizeof(nodec));
headc->next->next = c;
c = headc->next;
c->add = add;
c->length = length;
printLink();
return 1;
}
else if ((add + length) == c->add)
{
c->add = add;
c->length = c->length + length;
printLink();
return 1;
}
}
else
{
b = c;
c = c->next;
}
}
}
}
int main(void)
{
init();
printLink();
taskIn(4,6);
taskOut(3);
taskOut(2);
}