直接附源码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int MaxSize = 1024;
void showblocklist();
typedef struct
{
int size, toploc, botloc,id;
}process;
typedef struct
{
int size, toploc, botloc;
vector<process> processlist;
}block;
vector<block> blocklist;
bool cmpfirst(block a, block b)
{
return a.toploc < b.toploc;
}
bool cmpbest(block a, block b)
{
return a.size < b.size;
}
bool cmpworst(block a, block b)
{
return a.size > b.size;
}
void hebing()
{
sort(blocklist.begin(), blocklist.end(), cmpfirst);
for (int i = 0; i < blocklist.size()-1; i++)
{
if (blocklist[i].botloc+1==blocklist[i+1].toploc)
{
blocklist[i].botloc = blocklist[i + 1].botloc;
blocklist[i].size = blocklist[i].size + blocklist[i + 1].size;
blocklist.erase(blocklist.begin()+i+1);
i = 0;
}
}
return;
}
void creatblock(int choice) {
int tempsize = 0,temploc=0;
cout << "请输入内存大小"<<endl;
cin >> tempsize;
cout << "请输入内存首地址" << endl;
cin >> temploc;
//若内存为空
if (blocklist.empty()) {
if(temploc+tempsize>MaxSize)
{
cout << "超出内存上限无法插入" << endl;
return;
}
else
{
block tempblock;
tempblock.size = tempsize;
tempblock.toploc = temploc;
tempblock.botloc = temploc + tempsize-1;
blocklist.push_back(tempblock);
}
showblocklist();
cout << "新建内存块成功" << endl;
}
// 若内存不为空
else
{
if (temploc + tempsize > MaxSize)
{
cout << "超出内存上限无法插入" << endl;
return;
}
for (int i = 0; i < blocklist.size(); i++)
{
if ((temploc >= blocklist[i].toploc && temploc <= blocklist[i].botloc) || (temploc + tempsize-1 >= blocklist[i].toploc && temploc + tempsize-1 <= blocklist[i].botloc))
{
cout << "该内存块已经被使用" << endl;
return;
}
}
block tempblock;
tempblock.size = tempsize;
tempblock.toploc = temploc;
tempblock.botloc = temploc + tempsize-1;
blocklist.push_back(tempblock);
hebing();
if (choice==1)
{
sort(blocklist.begin(), blocklist.end(), cmpfirst);
}
else if (choice==2)
{
sort(blocklist.begin(), blocklist.end(), cmpbest);
}
else if (choice==3)
{
sort(blocklist.begin(), blocklist.end(), cmpworst);
}
cout << "新建内存块成功" << endl;
showblocklist();
}
}
void showblocklist()
{
if (blocklist.empty())
{
cout << "内存块为空" << endl;
return;
}
cout << "-----------------------------" << endl;
cout << "首地址 内存大小 尾地址" << endl;
cout << "-----------------------------" << endl;
for (int i = 0; i < blocklist.size(); i++)
{
cout<< blocklist[i].toploc<<" "<<blocklist[i].size<<" "<<blocklist[i].botloc << endl;
cout << "-----------------------------" << endl;
}
}
void showprocesslist()
{
int flag = 0;
cout << "-----------------------------" << endl;
cout << "编号 首地址 大小 地址" << endl;
cout << "-----------------------------" << endl;
for (int i = 0; i < blocklist.size(); i++)
{
for (int j = 0; j < blocklist[i].processlist.size(); j++)
{
cout << blocklist[i].processlist[j].id<<" "<< blocklist[i].processlist[j].toploc<<" "<< blocklist[i].processlist[j].size <<" "<< blocklist[i].processlist[j].botloc<< endl;
cout << "-----------------------------"<< endl;
flag = 1;
}
}
if (flag==0)
{
cout << "进程为空" << endl;
return;
}
return;
}
//最先分配
void firstfunc(process waitinsert)
{
int tempsize,tempid;
cout << "请输入进程大小" << endl;
cin >> tempsize;
cout << "请输入进程id" << endl;
cin >> tempid;
waitinsert.size = tempsize;
waitinsert.id = tempid;
for (int i = 0; i < blocklist.size(); i++)
{
if (waitinsert.size<=blocklist[i].size)
{
waitinsert.toploc = blocklist[i].toploc;
waitinsert.botloc = blocklist[i].toploc + waitinsert.size-1;
blocklist[i].toploc = blocklist[i].toploc + waitinsert.size;
blocklist[i].size = blocklist[i].size - waitinsert.size;
blocklist[i].processlist.push_back(waitinsert);
cout << "插入成功" << endl;
return;
}
}
cout << "插入失败" << endl;
return;
}
//最优分配
void bestfunc(process waitinsert)
{
int tempsize, tempid;
cout << "请输入进程大小" << endl;
cin >> tempsize;
cout << "请输入进程id" << endl;
cin >> tempid;
waitinsert.size = tempsize;
waitinsert.id = tempid;
for (int i = 0; i < blocklist.size(); i++)
{
if (waitinsert.size <= blocklist[i].size)
{
waitinsert.toploc = blocklist[i].toploc;
waitinsert.botloc = blocklist[i].toploc + waitinsert.size-1;
blocklist[i].toploc = blocklist[i].toploc + waitinsert.size;
blocklist[i].size = blocklist[i].size - waitinsert.size;
blocklist[i].processlist.push_back(waitinsert);
sort(blocklist.begin(), blocklist.end(), cmpbest);
cout << "插入成功" << endl;
return;
}
}
cout << "插入失败" << endl;
return;
}
//最坏分配
void worstfunc(process waitinsert)
{
int tempsize, tempid;
cout << "请输入进程大小" << endl;
cin >> tempsize;
cout << "请输入进程id" << endl;
cin >> tempid;
waitinsert.size = tempsize;
waitinsert.id = tempid;
if (waitinsert.size <= blocklist[0].size)
{
waitinsert.toploc = blocklist[0].toploc;
waitinsert.botloc = blocklist[0].toploc + waitinsert.size-1;
blocklist[0].toploc = blocklist[0].toploc + waitinsert.size;
blocklist[0].size = blocklist[0].size - waitinsert.size;
blocklist[0].processlist.push_back(waitinsert);
sort(blocklist.begin(), blocklist.end(), cmpworst);
cout << "插入成功" << endl;
return;
}
cout << "插入失败" << endl;
return;
}
void insertprocess(int choice)
{
process temp;
temp.botloc = 0; temp.id = 0; temp.size = 0; temp.toploc = 0;
if (choice==1)
{
sort(blocklist.begin(), blocklist.end(), cmpfirst);
firstfunc(temp);
showblocklist();
}
else if(choice==2)
{
sort(blocklist.begin(), blocklist.end(), cmpbest);
bestfunc(temp);
showblocklist();
}
else if (choice == 3)
{
sort(blocklist.begin(), blocklist.end(), cmpworst);
worstfunc(temp);
showblocklist();
}
}
void deleteprocess(int choice)
{
//为应对存在与上下两个空闲区接壤的情况
sort(blocklist.begin(), blocklist.end(), cmpfirst);
int tempid;
cout << "请输入要回收的进程编号" << endl;
cin >> tempid;
for (int i = 0; i < blocklist.size(); i++)
{
for ( int j = 0; j < blocklist[i].processlist.size(); j++)
{
if (blocklist[i].processlist[j].id==tempid)
{
//与上空闲区接壤
if(blocklist[i].processlist[j].toploc == blocklist[i].botloc+1)
{
blocklist[i].botloc= blocklist[i].processlist[j].botloc;
blocklist[i].size = blocklist[i].size + blocklist[i].processlist[j].size;
blocklist[i].processlist.erase(blocklist[i].processlist.begin() + j);
// 防止出现回收进程后两个相邻内存块能够合并的情况。
hebing();
if (choice == 1)
{
sort(blocklist.begin(), blocklist.end(), cmpfirst);
}
else if (choice == 2)
{
sort(blocklist.begin(), blocklist.end(), cmpbest);
}
else if (choice == 3)
{
sort(blocklist.begin(), blocklist.end(), cmpworst);
}
cout << "删除完成" << endl;
showblocklist();
//此处不return会导致越界问题。
return;
}
//与下空闲区接壤
else if(blocklist[i].processlist[j].botloc == blocklist[i].toploc-1)
{
blocklist[i].toploc = blocklist[i].processlist[j].toploc;
blocklist[i].size = blocklist[i].size + blocklist[i].processlist[j].size;
blocklist[i].processlist.erase(blocklist[i].processlist.begin() + j);
hebing();
if (choice == 1)
{
sort(blocklist.begin(), blocklist.end(), cmpfirst);
}
else if (choice == 2)
{
sort(blocklist.begin(), blocklist.end(), cmpbest);
}
else if (choice == 3)
{
sort(blocklist.begin(), blocklist.end(), cmpworst);
}
cout << "删除完成" << endl;
showblocklist();
return;
}
//不与空闲区接壤
else if(blocklist[i].processlist[j].toploc != blocklist[i].botloc + 1&& blocklist[i].processlist[j].botloc != blocklist[i].toploc - 1)
{
//若当前内存块大小为0
if (blocklist[i].size == 0)
{
blocklist[i].toploc = blocklist[i].processlist[j].toploc;
blocklist[i].botloc = blocklist[i].processlist[j].botloc;
blocklist[i].size = blocklist[i].processlist[j].size;
blocklist[i].processlist.erase(blocklist[i].processlist.begin() + j);
hebing();
if (choice == 1)
{
sort(blocklist.begin(), blocklist.end(), cmpfirst);
}
else if (choice == 2)
{
sort(blocklist.begin(), blocklist.end(), cmpbest);
}
else if (choice == 3)
{
sort(blocklist.begin(), blocklist.end(), cmpworst);
}
cout << "删除完成" << endl;
showblocklist();
return;
}
else
{
block tempblock;
tempblock.toploc = blocklist[i].processlist[j].toploc;
tempblock.botloc = blocklist[i].processlist[j].botloc;
tempblock.size = blocklist[i].processlist[j].size;
blocklist[i].processlist.erase(blocklist[i].processlist.begin() + j);
blocklist.push_back(tempblock);
hebing();
if (choice == 1)
{
sort(blocklist.begin(), blocklist.end(), cmpfirst);
}
else if (choice == 2)
{
sort(blocklist.begin(), blocklist.end(), cmpbest);
}
else if (choice == 3)
{
sort(blocklist.begin(), blocklist.end(), cmpworst);
}
cout << "删除完成" << endl;
showblocklist();
return;
}
}
}
}
}
}
void showcontrollist()
{
cout << "-----------请选择操作----------" << endl;
cout << "0.退出" << endl;
cout << "1.添加内存" << endl;
cout << "2.内存列表" << endl;
cout << "3.添加进程(id不重复)"<<endl;
cout << "4.回收进程" << endl;
cout << "5.进程列表" << endl;
cout << "--------------------------------" << endl;
}
int main()
{
/*
cout << "请选择你要采用的分配策略" << endl;
cout << "1.最先分配策略" << endl;
cout << "2.最优分配策略" << endl;
cout << "3.最坏分配策略" << endl;
cin >> funcchoice;
*/
int funcchoice;
showcontrollist();
int choice;
cout << "请输入操作" << endl;
cin >> choice;
while (choice!=0)
{
if (choice==1)
{
cout << "请选择分配的算法" << endl;
cout << "1.最先分配策略" << endl;
cout << "2.最优分配策略" << endl;
cout << "3.最坏分配策略" << endl;
cin >> funcchoice;
creatblock(funcchoice);
}
else if (choice==2)
{
showblocklist();
}
else if( choice==3)
{
cout << "请选择分配的算法" << endl;
cout << "1.最先分配策略" << endl;
cout << "2.最优分配策略" << endl;
cout << "3.最坏分配策略" << endl;
cin >> funcchoice;
insertprocess(funcchoice);
}
else if (choice == 4)
{
deleteprocess(funcchoice);
}
else if (choice==5)
{
showprocesslist();
}
showcontrollist();
cout << "请输入操作" << endl;
cin >> choice;
}
}