武汉理工大学
学 生 实 验 报 告 书
操作系统
实验课程
学生姓名
专业班级
签到编号
实验项目名称
动态分区管理模拟
成绩
第一部分:设计目的、功能与要求
1.基础知识
掌握内存管理的相关内容,对内存分配与回收有深入的理解。
2.具体要求
(1)选择 1~3 种内存分配算法(最先适应、最佳适应、最坏适应)实现内存分配。
(2)能够输入给定的内存大小、进程个数、每个进程申请的内存空间。
(3)能够选择分配、回收操作。
(4)能够显示进程在内存的存储地址、大小。
(5)显示每次内存分配、回收后内存空间的使用情况。
第二部分:问题的详细描述、需求分析
1. 内存模拟
为了模拟内存,本次实验定义了内存区域的结构体。为了实现内存的动态变化,本次实
验使用 vector 动态数组进行模拟。
2. 分配内存算法
采用最先适应法(FFA)、最佳适应法(BFA)、最差适应法(WFA)进行分配内存资源。以
最先适应法为例,某一进程或作业请求一部分内存,在内存可用表中按内存地址从低到高查
找,如果找到合适的空闲区,则进行分配,反之请求回收内存。
3. 回收内存策略
根据回收的空闲区在内存中的位置,判断其前后两块内存区域的空闲状态,若空闲则合
并,反之则不合并。
第三部分:数据结构、功能设计
1.数据结构设计
(1) 内存区域 MemoryArea
struct MemoryArea
{
int m_MemoryStart ;
int m_MemoryEnd;
bool m_IsAllocated;
string m_ProcessNum;
//某一分区起始
//某一分区结束
//该分区分配状态
//该区域已分配的进程号
}
vectormemoryArea; //内存情况
(2)可用表 Memory
struct Memory
{
string m_AreaNum;
int m_AreaLength;
int m_AreaBaseAddress;
//分区区号
//分区长度
//分区起始地址
};
vector
availableMemory; //内存可用表
(3)请求进程 Process
struct Process
{
string m_ProcessNum;
//进程号
int m_RequestLength;
//请求内存长度
};
vectorrequestProcess; //已分配进程表
vectornewRequestProcess; //输入的新进程请求表
2.流程图
(1)程序结构
图一 程序结构
(2) 分配回收
图二 分配回收流程
第四部分:开发工具及核心源程序的关键代码段说明
1. 开发工具
(1) 编程语言:C++
(2) 集成开发环境:Visual Studio 2019
2. 核心代码描述
分配算法:
Void Allocation()
{
Input(请求进程);
For(对每个进程进行分配)
{
If(可用表为空||可用表最大空闲区不足)
Recycle(回收进程)
Then
Sort(对可用表排序)
SelectAlgorithm(选择分配算法)
For(遍历排好序的每个空闲区)
{
If(空闲区长度>进程请求长度)
截取空闲区,修改可用表和内存
Else if(空闲区长度=进程请求长度)
删除可用表记录,更新内存
Else(空闲区长度<进程请求长度)
取下一空闲区
}
}
}
}
第五部分:测试用例、运行结果与运行情况分析
1. 说明
(1)本次实验所用初始数据提前保存在 input.txt 文件中,每行分别是:初始内存大小、
请求进程数、各个请求进程请求大小,单位均为 KB。文件内容如下:
图三 初始数据 input.txt 文件
(2)以下仅展示部分运行截图。
2. 初始内存分配
3. 回收 P3 后
3. 有新进程 P5(50KB)、P6(16KB)按最先适应法分配后
第六部分:自我评价与总结
(1)在动态分区管理模拟实验中,由于采用的数据结构是 vector 数组,排序较为方便,但
是在查找更新时,使用 iterator 迭代器进行操作。由于 insert 和 erase 函数会使得之前定
义的迭代器失效,测试过程中经常出现指针越界的问题。在查阅相关资料后终于解决了这个
问题。
(2)磁盘是高速、大容量、旋转型、可直接存取的存储设备。它作为计算机系统的辅助存储
器,担负着繁重的输入输出工作,在现代计算机系统中往往同时会有若干个要求访问磁盘的
输入输出要求。学会一些磁盘调度算法对我们这些计算机专业的学生来说是百益而无一害并
且是非常有必要的,所以较之前儿次实验,我对这次实验所花的心思比之前的更多。
(3)这次实验时本学期这门课程的最后一次实验,心里感觉也是特别的复杂,一方面由于自
己不太喜欢编程,所以很希望它结束;另一方面又在总结这学期的实验到底学到了什么,好像
又没有很大的收获,所以又希望再在这个实验课上学习更多的知识。在这门课中,我很感谢
老师的悉心指导以及老师对我们的容忍,也谢谢同学的热心帮助,为我解决了一些编程上和
操作系统课程中的问题,也很庆幸自己在这学期的实验课中的坚持不懈.
实验项目名称
磁盘调度模拟
成绩
第一部分:设计目的、功能与要求
1.基础知识
掌握磁盘调度的相关内容,对磁盘结构及调度算法有深入的理解。
2.具体要求
(1)选择 2~3 中磁盘调度算法(先来先服务、最短寻道时间优先、电梯算法)。
(2)输入:当前磁头位置、磁头移动方向、磁道访问请求序列。
(3)输出:磁头依次访问的磁道号顺序,计算磁头移动的总磁道数。
第二部分:问题的详细描述、需求分析
1.磁盘模拟
为了动态地输入数据,本次实验采用 vector 模拟磁盘。
第三部分:数据结构、功能设计
1. 数据定义
int start_position;
//起始磁头位置
int current_position;//当前磁头位置
int move_direction;
vectorrequest_order;
int total_instance = 0;
//磁头访问请求序列
//磁头走过的总磁道数
//磁头初始移动方向从低到高
2. 程序结构
图一 程序结构