操作系统课程设计报告
题目 主存空间的分配和回收
院 系
计算机与控制工程学院
专 业
计算机科学与技术
班 级
姓 名
学 号
指导教师
******
******
************
******
2020 年 07 月 02 日
目录
1 项目描述................................................................................................................................ 1
2 系统结构分析 ........................................................................................................................ 1
3 系统详细设计 ........................................................................................................................ 1
4 系统主要算法 ........................................................................................................................ 2
5 系统程序实现 ........................................................................................................................ 3
6 程序实现结果 ........................................................................................................................ 4
7 课程设计总结 ........................................................................................................................ 8
附录:源程序 ............................................................................................................................ 9
1 项目描述
主存是中央处理器能够直接存取指令和数据的存储器。能否合理而有效地使用它,
在很大程度上将影响整个计算机系统的性能。
提供用户友好的界面设计模拟可变分区管理方式中根据用户的选择使用首次适应
算法、最佳适应算法和最差适应算法实现主存的分配与回收。在此过程中,用户可以随
时查看当前的内存分配情况,包括每个作业在主存中的位置,所占空间,还有剩余的主
存空间。为了更加逼真的模拟主存作业的分配与回收,应该定义该系统所占的内存空间,
并且在运行过程中无法回收。此项目帮助理解在不同的存储管理方式下如何实现主存空
间的分配和回收。
2 系统结构分析
首先,我用了一个结构体,来保存作业的信息:
struct node{
char name[20];
//作业名
int
int
int
size;
begin;
end;
//大小
//开始内存区
//结束内存区
char status;
//状态
}fp[MAX];
然后将功能来进行分块,分别放到不同的文件中实现:
main.cpp----该文件主要是进行函数调用的主程序,完成界面设置和功能选择
head.h----该文件主要是获取程序运行所需要的系统头文件和数据结构
zxt1.h----该文件显示内存区的情况
zxt2.h----该文件主要提供三种算法的选择界面、实现三种算法并且完成内存区的分配
zxt3.h----该文件主要完成空间的回收及空闲区的合并
3 系统详细设计
首先,作业的信息要包括作业名,作业大小,作业开始和结束的内存区,还有作业
的状态,是否是已分配成功的。主函数主要就是完成界面的设计,一些输出语句,还有
1
if-else if 的选择语句来选择功能,别忘记在这之前要对主存进行初始化,包括系统内存
的分配,和空闲区的分配。
其次,就是显示当前的主存信息已使用的和未使用的。注意这里的信息输出是一样
的,所以把信息输出写成了一个函数来减少工作量。
然后,着重就要设计三种算法了,这三种算法重在按照它们自身的特点来找合适的
内存分区。所以将他们分成三个函数来完成,然后再将找到的那个内存分区的序号作为
参数,通过一个分配函数来完成新作业的放入。首次适应算法从头开始找到第一个能放
下作业的空闲区即可;最佳适应算法和最差适应算法其实也无须进行排序,最佳找到满
足条件的最小的分区即可,最差找到满足条件的最大分区即可。然后就是分配了,就是
调整一下主存的分区,能正好放下就放入,块号不用改变,不能正好放下就会有剩余的
空闲区,这时候原本的空闲区就被一分为二,其余这之后的分区的编号就得往后移。
再然后,就要设计回收的算法了,除了改变要回收分区的各种信息,这里还要注意,
采用动态重定位的回收方法,将两个挨着的空闲区合并成一个,后面的作业序号也要跟
着向前移动,这样能够有效的利用内存空间。
主要设计的模块流程图:
4 系统主要算法
(1) 首次适应算法
这种算法把空闲分区按其在存储空间中地址递增的顺序链接在一起。当用户申请
一块内存空间时,从空闲区链表的头指针开始查找,选择第一个满足要求的空闲分区,
2
如果它不等于作业大小,将其分成两部分,一部分给作业,另一部分仍留在空闲区链
表中。
(2) 最佳适应算法
这种算法把空闲分区链表按分区大小由小到大进行组织,当有作业申请内存时,
总是首先找到满足要求的最接近于作业大小的空闲分区。因分区大小与作业相近,从
而避免将较大的分区分成两部分,当有较大的作业要求分配内存时,容易得到满足。
(3) 最差适应算法
这种算法要求把空闲区按从大到小递减的顺序组织成空闲区链表,当用户申请一
个存储区时。总是检查空闲区列表的第一个空闲区是否满足要求,若不满足分配失败,
若满足,则将空闲区分配给用户,然后修改和调整空闲区链表。
(4) 主存的回收算法
当系统回收一个分区时,首先检查是否有前后相邻的空闲区,如有,则进行合并,
合并后的空闲区仍保留在原位置上,但需要修改相应的链表指针和分区大小。
(5) 主存空间的分配算法
主存空间的分配是在以上前三种算法已经找到合适的分区的基础上来完成的。为
了更好的提高时间效率,首先进行判断新的作业的大小是否恰好等于空闲分区的大
小,若是,直接放进内存更改信息即可。否则就要将此空闲区后面的作业往后移动,
新的作业分配到空闲区,剩余的空闲区成为外碎片,也要保留下来。
5 系统程序实现
void init()----初始化主存状态
int main()----主函数设置界面,选择功能
void show_jm()----显示已用、未用分区和作业分配情况
void output(int i)----输出第 i 行信息
void fenpei(int a, char workName[], int workSize)----作业分配到选择的算法所匹配的空
闲区
void fenpei_xz()----分配新作业界面选择
void firstfit(int workSize,char workName[20])----首次适应算法选择合适的空闲区
void bestfit(int workSize,char workName[20],int pFree)----最优适应算法选择合适的空
闲区
3
void worstfit(int workSize,char workName[20],int pFree)----最差适应算法选择合适的空
闲区
void huishou()----回收分区界面选择
void empty_hb()----回收空间并且合并连续的空闲区
具体程序见附录。
6 程序实现结果
主界面:
功能选择 1,查看当前内存的分配情况:
功能选择 2,来存入新的作业:
4
作业名重复,提示重新输入:
5
再次查看内存分配情况:
回收分区:
输入不存在的作业名,提示不存在:
此时再次查看内存分区情况,
6