#include <iostream>
#include <vector>
#include <iterator>
using namespace std;
#define MAX_SIZE 1000
struct process{
int partition_number;//记录分区号
int size;//进程占用内存大小
int address;//进程在内存里面的起始地址
int state;//-1表示还没占用,大于-1的数字表示几号进程在占用
};
class Memory{
public:
vector<process> vt;//记录已使用进程
vector<process> free_vt;//记录剩余可分配空间
Memory();//初始化内存
void add_mission(int index,int size);//添加任务
void print_mission();//打印内存中的数据
void delete_mission(int index);//删除任务
};
Memory::Memory(){
process tend;
tend.partition_number = 0;
tend.size = MAX_SIZE;
tend.address = 0;
tend.state = -1;
free_vt.push_back(tend);
}
void Memory::print_mission(){
vector<process>::iterator it_vt = vt.begin();//构建进程序列的迭代器
vector<process>::iterator it_fvt = free_vt.begin();//构建空闲序列的迭代器
int number = vt.size() + free_vt.size();//记录要打印多少项
int used = 0;//记录已经使用的内存
int surplus = 0;//记录还没被使用的内存
int i = 0;//记录打印次数
while (i<number){
if ((it_vt!=vt.end())&&((*it_vt).address < (*it_fvt).address)){//对比地址先输出地址较前的
used += (*it_vt).size;
cout << "分区号:" << i
<< "大小:" << (*it_vt).size
<< "起址:" << (*it_vt).address
<< "状态:"<<(*it_vt).state<< "号进程占用" ;
it_vt++;
}
else if (it_fvt != free_vt.end()){
surplus += (*it_fvt).size;
cout << "分区号:" << i
<< "大小:" << (*it_fvt).size
<< "起址:" << (*it_fvt).address
<< "状态:可用";
it_fvt++;
}
i++;
cout << endl;
}
cout << "已用" << used << "K内存" << endl;
cout << "剩下" << surplus << "K内存可用" << endl;
}
void Memory::delete_mission(int index){
vector<process>::iterator it_vt = vt.begin();
vector<process>::iterator it_fvt = free_vt.begin();
int size = vt.size();
/*判断释放区域的各种情况(1)上下都不是空闲区(2)上面是空闲区(3)下面是空闲区(4)上面和下面是空闲区*/
for (; it_vt != vt.end(); it_vt++){//释放所用内存
if ((*it_vt).state==index){
process new_free_block = *it_vt;
new_free_block.state = -1;
while ((*it_fvt).address < new_free_block.address){//找到要插入的位置的后面一个
it_fvt++;
}
if ((new_free_block.address + new_free_block.size) == (*it_fvt).address){//(3)修改地址和大小
(*it_fvt).address = new_free_block.address;
(*it_fvt).size += new_free_block.size;
}
if (it_fvt != free_vt.begin()){
it_fvt--;
if (((*it_fvt).address + (*it_fvt).size) == new_free_block.address){//(2)只修改大小
(*it_fvt).size += new_free_block.size;
it_fvt++;
if (new_free_block.address == (*it_fvt).address){//(4)修改大小在(3)时已经修改了地址
(*(it_fvt - 1)).size = (*(it_fvt - 1)).size + (*it_fvt).size - new_free_block.size ;
free_vt.erase(it_fvt);
}
}
else{
if (new_free_block.address != (*(it_fvt+1)).address){
free_vt.insert(it_fvt, new_free_block); //(1)添加新项目
}
}
}
else{
if (new_free_block.address != (*(it_fvt)).address){
free_vt.insert(it_fvt, new_free_block); //(1)
}
}
vt.erase(it_vt);
break;
}
}
if (size == free_vt.size()){
cout << "无法找到该进程" << endl;
}
else{
cout << "释放" << index << "号进程成功!" << endl;
}
}
void Memory::add_mission(int index,int size){
process tend;
tend.partition_number = -1;
tend.size = size;
tend.address = -1;
tend.state = index;
vector<process>::iterator it_vt = vt.begin();
vector<process>::iterator it_fvt = free_vt.begin();
while (it_fvt != free_vt.end()){
if (size <= (*it_fvt).size){//找到可以释放的区域
tend.partition_number = (*it_fvt).partition_number;
tend.address = (*it_fvt).address;
process new_free_block;
new_free_block.partition_number = (*it_fvt).partition_number + 1;
new_free_block.size = (*it_fvt).size - size;
new_free_block.address = (*it_fvt).address + size;
new_free_block.state = -1;
free_vt.erase(it_fvt);
it_fvt = free_vt.begin();
while ((it_fvt!=free_vt.end())&&((*it_fvt).address < new_free_block.address)){//找到要插入的位置
it_fvt++;
}
free_vt.insert(it_fvt,new_free_block);
break;
}
it_fvt++;
}
if (tend.address == -1){
cout << "无可分配的空间" << endl;
}
else{
it_vt = vt.begin();
while ((it_vt!=vt.end())&&((*it_vt).address < tend.address)){//找到要插入的位置
it_vt++;
}
vt.insert(it_vt, tend);
cout << tend.state<<"号进程分配成功!分配大小为"<<tend.size <<"K"<< endl;
}
}
int main(){
Memory Demo;
Demo.add_mission(0, 344);
Demo.add_mission(1, 177);
Demo.add_mission(2, 148);
Demo.add_mission(3, 147);
cout << endl;
Demo.print_mission();
Demo.delete_mission(1);
cout << endl;
Demo.print_mission();
Demo.add_mission(4,122);
cout << endl;
Demo.print_mission();
Demo.delete_mission(2);
cout << endl;
Demo.print_mission();
Demo.add_mission(5, 200);
cout << endl;
Demo.print_mission();
Demo.delete_mission(0);
cout << endl;
Demo.print_mission();
Demo.delete_mission(3);
cout << endl;
Demo.print_mission();
return 0;
}
存储器管理
最新推荐文章于 2025-04-14 22:05:42 发布