1、实验目的:用高级语言编写和调试一个内存连续分配模拟程序,以加深对内存连续分配算法的理解.
2、实验内容:内存连续分配动态分区分配流程图如下:
设计程序模拟内存动态分区分配流程,要求如下
1、实验目的:用高级语言编写和调试一个内存连续分配模拟程序,以加深对内存连续分配算法的理解.
2、实验内容:内存连续分配动态分区分配流程图如下:
设计程序模拟内存动态分区分配流程,要求如下
1、 实现三项功能:分配内存、回收内存、显示内存使用情况
2、 内存分配表建议使用顺序表或者单链表实现,逻辑结构如下图(a)
3、 分区分配算法建议使用最佳分配算法
4、假设内存大小为1024K,起始地址为0,都可以被用户程序使用,size数值设为2K
1、 实现三项功能:分配内存、回收内存、显示内存使用情况
2、 内存分配表建议使用顺序表或者单链表实现,逻辑结构如下图(a)
3、 分区分配算法建议使用最佳分配算法
4、假设内存大小为1024K,起始地址为0,都可以被用户程序使用,size数值设为2K
3.源程序:
#include<bits/stdc++.h>
using namespace std;
struct PCB
{
string name;
int begin;
int num;
bool status;
};
vector<PCB> RAM;
void menu()
{
printf("1. 分配内存\n");
printf("2. 回收内存\n");
printf("3. 显示内存使用情况\n");
printf("4. 退出\n");
printf("\n请输入选择: ");
}
void init()
{
RAM.push_back({"空闲",0,1024,false});
}
void output()
{
printf("\n\t分区号\t作业名\t起始地址\t分区大小\t状态\n");
for(int i=0; i<RAM.size(); i++)
{
cout<<"\t"<<i<<"\t"<<RAM[i].name<<"\t"<<RAM[i].begin<<"\t\t"<<RAM[i].num<<"\t\t"<<RAM[i].status<<endl;
}
printf("\n\n");
}
void Distribution()
{
string name;
int num;
printf("作业名(字符串): ");
cin>>name;
printf("作业占内存大小:");
scanf("%d",&num);
//开始分区,从开始找,状态为0并且分区大小
int f = 0;
for(int i = 0; i < RAM.size() ; i++)
{
if(RAM[i].status == false && RAM[i].num>=num)
{
PCB p = {name,RAM[i].begin,num,true};
RAM[i].begin = p.num + p.begin;
RAM[i].num = RAM[i].num - num;
RAM.insert(RAM.begin()+i,p);
f = 1;
break;
}
}
output();
if(f == 0) //没找到
printf("\t请求失败!空间不够!\n\n");
else
printf("\t请求成功!\n\n");
}
void Recover()
{
string name;
printf("输入要回收分区的作业名(字符串): ");
cin>> name;
for(int i=0; i<RAM.size(); i++)
{
if(RAM[i].name == name) //找到要回收的作业
{
if(i == 0) // 如果第一个单独
{
if(RAM[i+1].status == true)
{
RAM[i].name = "空闲";
RAM[i].status = false;
break;
}
else
{
RAM[i].status = false;
RAM[i].name = "空闲";
RAM[i].num += RAM[i+1].num;
RAM.erase(RAM.begin()+1);
break;
}
}
if(RAM[i-1].status == true && RAM[i+1].status == true) //左右都为 1 ,直接回收
{
RAM[i].name = "空闲";
RAM[i].status = false;
break;
}
else if(RAM[i-1].status == false && RAM[i+1].status == true)
{
RAM[i-1].num += RAM[i].num;
RAM.erase(RAM.begin()+i);
break;
}
else if(RAM[i-1].status == true && RAM[i+1].status == false)
{
RAM[i].name = "空闲";
RAM[i].status = false;
RAM[i].num += RAM[i+1].num;
RAM.erase(RAM.begin()+i+1);
break;
}
else if(RAM[i-1].status == false && RAM[i+1].status == false)
{
//
RAM[i-1].status = false;
RAM[i-1].num += (RAM[i].num+RAM[i+1].num);
RAM.erase(RAM.begin()+i);
RAM.erase(RAM.begin()+i);
}
}
}
output();
// for(int i=0; i<RAM.size(); i++)
// {
// cout<<"\t"<<RAM[i].name<<"\t"<<RAM[i].begin<<"\t"<<RAM[i].num<<"\t"<<RAM[i].status<<endl;
// }
}
int main()
{
int n;
init();
while(1)
{
menu();
scanf("%d",&n);
switch (n)
{
case 1:
Distribution();
break;
case 2:
Recover();
break;
case 3:
output();
break;
case 4:
exit(0);
break;
}
}
}
4.测试数据
分区号 作业名 起始地址 分区大小 状态
0 q1 0 20 1
1 q2 20 20 1
2 q3 40 20 1
3 q4 60 24 1
4 空闲 84 940 0
运行结果:
分配内存
回收内存
出现问题及解决方法
运行代码时VC不能运行,而DEV C++可以运行
考虑到可能是机房电脑VC版本太老,自行下载DEV来进行测试代码,分配内存回收内存都成功运行测试。
实验心得
成功运行测试内存连续分配方式实验,加上书本内容,切实了解了几种分配算法的各个特点及缺点,从而对实验的理解更加充实