一.实验目的
深入了解动态分区存储管理方式主存分配回收的实现。
二.实验要求
1.使用动态分区存储管理方式分配回收内存。
2.使用最优适应算法完成主存空间的分配。
3.输出空闲表,分配表,内存的分配情况。
三.实验设计
-
算法思想: 利用最优适应算法分配内存,使用合并内存进行回收内存。
-
最优适应算法: 每次为作业分配主存时,总把能满足要求的,又是最小的空闲的主存分配给作业,避免“大材小用”。
-
具体实现: 通过第一次遍历空闲表时,查找满足作业大小的主存空间(所谓的满足,不是指空间大小必须相等,而是主存的空间大小与作业的大小差值小于系统规定的值(这样可以避免分割碎片)),若找到满足的主存空间,即对作业进行分配主存空间,修改空闲表和分配表;若没有找到满足主存空间,则进行第二次遍历空闲表,查找第一个大于作业的大小的主存空间,对主存空间进行分割,修改空闲表和分配表。
-
合并空间回收内存: 进行内存回收时,分为四种情况:
1.回收区与前一个空闲区F1相邻,仅修改空闲区的大小。
2.回收区与后一个空闲区F2相邻,修改空闲区的起始地址和空闲区的地址。
3.回收区既与前一个空闲区F1相邻,又与后一个空闲区F2相邻,修改空闲区的起始地址 和空间大小,将空闲区F2的信息从空闲表中删除。
4.回收区既不与前一个空闲区F1相邻,又不与后一个空闲区F2相邻,直接在空闲表加入回收区的信息。 -
具体实现: 通过输入作业名,进行对作业的回收。首先,在分配表中查找作业名,若找到,则在空闲表中进行遍历查看符合以上四种情况的哪一种,执行回收区回收后,要在分配表中将该作业删除。若没找到,则输出作业名不存在。
-
算法流程图
-
最优适应算法
-
内存回收
四.代码设计:
1.空闲表结构:
struct free_table{
int address;
int size;
int flag;//空闲时为0,分配时为1
};
2.分配表结构:
struct used_table{
string process;//作业名
int address;
int size;
int flag;
};
3.空闲表:
free_table a[1]={0,100,0};
vector<free_table> vec_free(a,a+1);//空闲表初始化
使用向量存放空闲表,对内存空闲表初始化,每次回收或分配一个作业,空闲表变动一次。
4.分配表:
vector<used_table> vec_used;
使用向量存放分配表,开始时分配表为空,每次分配或回收一个作业,分配表变动一次。
5.内存:
vector<used_table> vec;
使用向量存放分配表,开始时内存和空闲表相同,每次分配或回收一个作业,
内存变动一次。
代码实现:
#include<iostream>
#include<algorithm>
#include<windows.h>
#include<string>
#include<vector>
#define MIN 5
using namespace std;
struct