实现动态分区的分配算法。
(1) 最佳适配算法:选择内存空闲块中最适合进程大小的块分配。
(2) 邻近适配算法:从上一次分配的地址开始查找符合要求的块,所查找到的第一个满足要求的空闲块就分配给进程。
模拟添加进程的时候,假定内存是一块完整的空闲区,对于算法(1)来说,分配的时候遍历所有的空闲内存块,找出其中最适合的一块,注意此时内存分区的总块数可能已经发生了变化;
对于算法(2)来说,则需要从上次分配的内存块(使用变量记录即可)接着向下找到第一个满足条件的块即可,内存分区的总块可能也已经发生了变化。
模拟删除进程(释放内存)的时候,则需要注意如果当前内存块的上下有空闲块,则需要将其合并为一整个空闲块,也需要注意内存总块的数量变化。
嵌入式进阶教程分门别类整理好了,看的时候十分方便,由于内容较多,这里就截取一部分图吧。
需要的朋友私信【内核】即可领取
最佳适配算法
#include <iostream>
#include <vector>
#include <string>
#include <cstring>
#include <map>
#include <algorithm>
using namespace std;
struct node
{
int num;
int is_data;
};
int main()
{
vector<node> cluster;
vector<node> TTemp;
map <int,int> mp;
mp.clear();
node temp;
int R_num;
int curnum;
temp.is_data=0;
temp.num=10;
cluster.push_back(temp);
cout<<"请使用add命令添加一个进程,delete命令删除一个进程!"<<endl;
while(1)
{
string s;
cin>>s;
if(s=="add")
{
cout<<"请输入进程号及其的大小"<<endl;
cin>>R_num>>curnum;
int flag=0;
int curIndex;
int cmp=11;
for(int i=0;i<cluster.size();i++)
{
if(cluster[i].is_data==0&&cluster[i].num>=curnum)
{
flag=1;
if(cluster[i].num-curnum<cmp)
{
curIndex=i;
cmp=cluster[i].num-curnum;
}
}
}
if(flag)
{
cluster[curIndex].is_data=1;
mp[R_num]=curIndex;
node op;
TTemp.clear();
int is_flag=0;
if(cluster[curIndex].num>curnum)
{
op.is_data=0;
op.num=cluster[curIndex].num-curnum;
is_flag=1;
}
for(int i=0;i<cluster.size();i++)
{
if(i==curIndex)
{
cluster[curIndex].num=curnum;
TTemp.push_back(cluster[curIndex]);
mp[R_num]=i;
if(is_flag)
{
TTemp.push_back(op);
}
}
else
TTemp.push_back(cluster[i]);
}
cluster.swap(TTemp);
for(int i=0;i<cluster.size();i++)
cout<<"大小 "<<cluster[i].num<<" 是否分配 "<<cluster[i].is_data<<endl;
}
else
{
cout<<"内存不足!"<<endl;
}
}
else if(s=="delete")
{
int deletenum;
cout<<"请输入删除的进程:"<<endl;
cin>>deletenum;
int i=mp[deletenum];
while(--i>=0 && cluster[i].is_data==0)
{
}
int j=mp[deletenum];
while(++j<cluster.size() && cluster[j].is_data==0)
{
}
node kk;
kk.num=0;
for(int e=i+1;e<=j-1;e++)
{
kk.num+=cluster[e].num;
}
kk.is_data=0;
TTemp.clear();
for(int p=0;p<cluster.size();)
{
if(p==i+1)
{
p=j;
TTemp.push_back(kk);
}
else{
TTemp.push_back(cluster[p]);
p++;
}
}
cluster.swap(TTemp);
for(int i=0;i<cluster.size();i++)
cout<<"大小 "<<cluster[i].num<<" 是否分配 "<<cluster[i].is_data<<endl;
}
}
return 0;
}
邻近适配算法
#include <iostream>
#include <vector>
#include <string>
#include <cstring>
#include <map>
#include <algorithm>
using namespace std;
struct node
{
int num;
int is_data;
};
int main()
{
vector<node> cluster;
vector<node> TTemp;
map <int,int> mp;
mp.clear();
node temp;
int R_num;
int curnum;
int last_ID=0;
temp.is_data=0;
temp.num=10;
cluster.push_back(temp);
cout<<"请使用add命令添加一个进程,delete命令删除一个进程!"<<endl;
while(1)
{
string s;
cin>>s;
if(s=="add")
{
cout<<"请输入进程号及其的大小"<<endl;
cin>>R_num>>curnum;
int flag=0;
int curIndex;
//for(int i=beg_pos;i<cluster.size();i++)
int i=last_ID+1;
while(1)
{
if(i==cluster.size())
i=0;
if(cluster[i].is_data==0&&cluster[i].num>=curnum)
{
flag=1;
curIndex=i;
break;
}
i++;
}
if(flag)
{
cluster[curIndex].is_data=1;
mp[R_num]=curIndex;
node op;
TTemp.clear();
int is_flag=0;
if(cluster[curIndex].num>curnum)
{
op.is_data=0;
op.num=cluster[curIndex].num-curnum;
is_flag=1;
}
for(int i=0;i<cluster.size();i++)
{
if(i==curIndex)
{
cluster[curIndex].num=curnum;
TTemp.push_back(cluster[curIndex]);
mp[R_num]=i;
last_ID=i;
if(is_flag)
{
TTemp.push_back(op);
}
}
else
TTemp.push_back(cluster[i]);
}
cluster.swap(TTemp);
for(int i=0;i<cluster.size();i++)
cout<<"大小 "<<cluster[i].num<<" 是否分配 "<<cluster[i].is_data<<endl;
}
else
{
cout<<"内存不足!"<<endl;
}
}
else if(s=="delete")
{
int deletenum;
cout<<"请输入删除的进程:"<<endl;
cin>>deletenum;
int i=mp[deletenum];
while(--i>=0 && cluster[i].is_data==0)
{
}
int j=mp[deletenum];
while(++j<cluster.size() && cluster[j].is_data==0)
{
}
node kk;
kk.num=0;
for(int e=i+1;e<=j-1;e++)
{
kk.num+=cluster[e].num;
}
kk.is_data=0;
TTemp.clear();
for(int p=0;p<cluster.size();)
{
if(p==last_ID)
last_ID=TTemp.size();
if(p==i+1)
{
p=j;
TTemp.push_back(kk);
}
else{
TTemp.push_back(cluster[p]);
p++;
}
}
cluster.swap(TTemp);
for(int i=0;i<cluster.size();i++)
cout<<"大小 "<<cluster[i].num<<" 是否分配 "<<cluster[i].is_data<<endl;
}
}
return 0;
}