操作系统实验报告
题目: 主存空间的分配与回收实验
学 院 计算机学院
专 业 计算机科学与技术
班 级
学 号
姓 名
指导教师
()
学号: 姓名: 协作者:________
一、实验目的
熟悉主存的分配与回收。理解在不同的存储管理方式下,如何实现主存空间的分配与
回收。掌握动态分区分配方式中的数据结构和分配算法及动态分区存储管理方式及其实现
过程。
二、实验内容和要求
主存的分配和回收的实现是与主存储器的管理方式有关的。所谓分配,就是解决多道
作业或多进程如何共享主存空间的问题。所谓回收,就是当作业运行完成时将作业或进程
所占的主存空间归还给系统。
可变分区管理是指在处理作业过程中建立分区,使分区大小正好适合作业的需求,并
且分区个数是可以调整的。当要装入一个作业时,根据作业需要的主存量查看是否有足够
的空闲空间,若有,则按需要量分割一个分区分配给该作业;若无,则作业不能装入,作
业等待。随着作业的装入、完成,主存空间被分成许多大大小小的分区,有的分区被作业
占用,而有的分区是空闲的。
实验要求使用可变分区存储管理方式,分区分配中所用的数据结构采用空闲分区表和
空闲分区链来进行,分区分配中所用的算法采用首次适应算法、循环首次适应算法、最佳
适应算法三种算法来实现主存的分配与回收。同时,要求设计一个实用友好的用户界面,
并显示分配与回收的过程。
三、实验主要仪器设备和材料
、 机
四、实验原理及设计方案
1、实验原理
(1)使用可变分区存储管理方式
(2)分区分配算法
首次适应算法:将空闲分区链按照其地址由小到大递增的顺序进行排列,每次用户
提出要求分配分区的时候,从链表的链首开始查找,直到查到适合大小的分区为止,
然后,从所找到的分区中划出所要求的内存长度分配给用户,并把剩余部分进行合并 ,
将留在可用表中,同时修改其相应的表项。
最佳适应算法:每次为作业分配内存时,总是把能满足要求又是最少的空闲分区分
配给作业。
最坏适应算法:扫描整个空闲分区表,总是挑选一个最大的空闲区分割给作业使用。
2、设计方案
主存空间分配:
(1) 设计作业申请队列,动态输入构造空间区表,并打印显示构造好的空闲区
表。
(2) 键盘接受内存申请尺寸大小。
(3) 根据申请,实施内存分配,并返回分配所得内存首址。
(4) 分配完成后,调整空闲区表,并显示调整后的空闲区表。
(5) 若分配失败,返回分配失败信息。
(6) 要求每次分配后显示出空闲内存分区表的情况。
主存空间回收:
当一个作业执行完成撤离时,作业所占的分区应该归还给系统。归还的分区
如果与其他空闲区相邻,则应合成一个较大的空闲区,登记在空闲区说明表中。
此时,相邻空闲区的合并问题,要求考虑四种情况:
1) 释放区下邻空闲区
2) 释放区上邻空闲区
3) 释放区上下都与空闲区邻接
4) 释放区上下都与空闲区不邻接
1 动态输入构造空闲区表,并显示构造好的空闲区表。
2 根据空闲区表,按内存回收的四种情况从键盘接收回收区域的内存首址与大
小。
3 回收区域,调整空闲区表,并显示调整后的空闲区表。
4 要求每次回收后显示出空闲分区表的情况。
3、相关数据结构的说明
(1)空闲分区链:双向链
使用链指针把所有的空闲分区链成一条链。
在每个空闲分区的起始部分开辟出一个单元,存放链表指针和该分区的大小,链
表指针指向下一个空闲分区。
分区起始部分:控制分区分配的信息、链接分区的前向指针
分区尾部:设置一后向指针,状态位。
(2)结构体:
struct area //可用空闲分区链结点
{
int num; //分区序号
int base;//首地址
int size;//大小
int state; //状态
struct area *first; //前向指针
struct area *next; //后向指针
};
struct JCB //作业链结点
{
char name[10]; //作业名
int size; //所需空间大小
int base; //起始地址
struct JCB *next;
};
4、程序流程图
5、给出程序中源程序名和可执行程序名。
源程序名:首次适应算法最佳适应算法最坏适应算法
执行程序名:首次适应算法最佳适应算法最坏适应算法
6、程序清单
(1)首次适应算法:
!"#!$%
$!"#!&%$$'($!"#!%%%
)*$%
$)*&%$$'($)*%%%
+(,,可用空闲分区链
结点
-
.,,分区序号
/.,,首地址
'.,,大小
.,,状态
开 始
输入内存的总大小
分 配 作
业?
释 放 作
业?
显示内
存 信
息?
输入作业名及大小
内存空
间 充
足?
输入作业名
作 业 存
在?
分配空间给作业
释放作业及其占用空间
显示 空闲 分区 和
占用分区信息
开 始
是
否
否
是
是
否
是
否
是
否
& .,,前向指针
&.,,后向指针
0!"#!.
!"#!&.,,可用分区链的头结点
+()*,,作业链结点
-
123.,,作业名
'.,,所需空间大小
/.,,起始地址
)*&.
0)*.
)*&45677.,,作业链的表头
$%,,让用户只能输入正整数
-
482.
($9:9;<%.
=$%
-
($9输入只能为正整数,请重新输
入>9%.
($9:9;<%.
0
.
0
)*&?$&%,,检查作业是
否存在,若存在则返回指向该作业的指针
-
)*&;&@.
4.@4.
($%
-
=$%
-
($$8
;%44%
-
48.
.
0
($$8
;%A4%
-
@4.
48.
0
-
@848.
.
0
0
0
5677.
0
B$/;'%,,释放
内存空间
-
!"#!&;&4.
=$8%,,寻找释放区的前
一个空闲区
-
($/ ' 4 88
/%
/?.
48.
0
($/448/8'%,,
低地址相邻
-
($ 8 << 88
/44/'%,,释放区上下都
与空闲区相邻
-
($/44%
-
88/4.
88'4'
88'.
0
-
8'4'8
8'.
48.
- 1
- 2
- 3
前往页