分区存储管理算法模拟Word文档下载推荐.docx
《分区存储管理算法模拟Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《分区存储管理算法模拟Word文档下载推荐.docx(13页珍藏版)》请在冰豆网上搜索。
理
用最先使用算法模拟内存的分配和回收
环
境
C语言
方
案
设
计
内
容
1.可变分区方式是按作业需要的主存空间大小来分割分区的。
当要装入一个作业时,根据作业需要的主存量查看是否有足够的空闲空间,若有,则按需要量分割一个分区分配给该作业;
若无,则作业不能装入。
随着作业的装入、撤离,主存空间被分成许多个分区,有的分区被作业占用,而有的分区是空闲的。
如下图3.1所示。
图3.1主存分区分配示意图
为了说明哪些区是空闲的,可以用来装入新作业,必须要有一张空闲区说明表,格式如下表3.1所示。
其中,起址——指出一个空闲区的主存起始地址。
长度——指出从起始地址开始的一个连续空闲的长度。
状态——有两种状态,一种是“未分配”状态,指出对应的由起址指出的某个长度的区域是空闲区;
另一种是“空表目”状态,表示表中对应的登记项目是空白(无效),可用来登记新的空闲区(例如,作业撤离后,它所占的区域就成了空闲区,应找一个“空表目”栏登记归还区的起址和长度且修改状态)。
由于分区的个数不定,所以空闲区说明表中应有适量的状态为“空表目”的登记栏目,否则造成表格“溢出”无法登记。
表3.1空闲区说明表
起址
长度
状态
第一栏
14K
12K
未分配
第二栏
32K
96K
空表目
上述的这张说明表的登记情况是按图3.1中的例子所装入的三个作业占用的主存区域后填写的。
2.当有一个新作业要求装入主存时,必须查空闲区说明表,从中找出一个足够大的空闲区。
有时找到的空闲区可能大于作业需要量,这时应把原来的空闲区变成两部分:
一部分分给作业占用;
另一部分又成为一个较小的空闲区。
为了尽量减少由于分割造成的空闲区,而尽量保存高地址部分有较大的连续空闲区域,以利于大型作业的装入。
为此,在空闲区说明表中,把每个空闲区按其地址顺序登记,即每个后继的空闲区其起始地址总是比前者大。
为了方便查找还可使表格“紧缩”,总是让“空表目”栏集中在表格的后部。
3.采用最先适应算法(顺序分配算法)分配主存空间。
按照作业的需要量,查空闲区说明表,顺序查看登记栏,找到第一个能满足要求的空闲区。
当空闲区大于需要量时,一部分用来装入作业,另一部分仍为空闲区登记在空闲区说明表中。
由于本实验是模拟主存的分配,所以把主存区分配给作业后并不实际启动装入程序装入作业,而用输出“分配情况”来代替。
最先适应分配算法如图3.2。
4.当一个作业执行结束撤离时,作业所占的区域应该归还,归还的区域如果与其它空闲区相邻,则应合成一个较大的空闲区,登记在空闲区说明表中。
例如,在图3.1中列举的情况下,如果作业2撤离,归还所占主存区域时,应与上、下相邻的空闲区一起合成一个大的空闲区登记在空闲区说明表中。
归还主存时的回收算法如图3.3。
5.请按最先适应算法设计主存分配和回收的程序。
然后按图3.1中假设主存中已装入三个作业,且形成两个空闲区,确定空闲区说明表的初值。
现有一个需要主存量为6K的作业4申请装入主存;
然后作业3撤离;
再作业2撤离。
请你为它们进行主存分配和回收,把空闲区说明表的初值以及每次分配或回收后的变化显示出来或打印出来。
调
试
过
程
及
结
果
总
此实验还可以写一个用户自己的输入来验证,增加验证的准确性
附
录
<
>
<
512
{
名称
起始位置
大小
是否分配的标志
};
[]数组
被分成的块数统计
;
c;
先对数组进行初始化,使没有分配的名称为p
()
1;
[0]='
P'
;
[0]=0;
[0];
[0]=1;
}
对数组的插入操作
()
i;
(>
1)
{
[i][1];
}
[m];
移动操作,即对数组的删除操作
(m)
(<
}
如果相邻块都没有分配,则要合并到一起
([1][1])
[m]='
[m]=1;
([1])
[1][1];
(m);
[m][m][1];
(1);
}
打印输出
("
名称标识起址长度状态\n"
);
(0<
)
([i])
("
P"
"
[i]);
("
%1.0f%1.0f"
[i][i]);
未分配\n"
已分配\n"
从键盘输入数据
请输入申请或者释放的进程名称及资源数量:
\n"
();
"
0;
()提出申请资源
(<
{
([i]>
[i])
{
([i])
{
[i];
[i]=0;
}
(1[i][i]);
[1]=1;
[1]='
[i][i];
1;
}
;
}
()
申请成功!
1;
申请失败!
没有足够大的空闲空间。
0;
}
提出释放资源
([i])
([i])
([i][i]);
([i]>
{
(1[i][i]);
[1]='
[1]=0;
[i];
[i]=1;
([1])
{
([i][i]);
}
}
("
释放失败,因为正使用的数量小于要求释放的数量。
0;
}
{
释放成功!
释放失败!
未找到匹配的进程名称。
(1)
();
指导教师评语及成绩