操作系统: 最佳适配算法和邻近适配算法的模拟实现(内存分配算法)
2016-03-14 13:03
736 查看
实现动态分区的分配算法。
(1) 最佳适配算法:选择内存空闲块中最适合进程大小的块分配。
(2) 邻近适配算法:从上一次分配的地址开始查找符合要求的块,所查找到的第一个满足要求的空闲块就分配给进程。
模拟添加进程的时候,假定内存是一块完整的空闲区,对于算法(1)来说,分配的时候遍历所有的空闲内存块,找出其中最适合的一块,注意此时内存分区的总块数可能已经发生了变化;
对于算法(2)来说,则需要从上次分配的内存块(使用变量记录即可)接着向下找到第一个满足条件的块即可,内存分区的总块可能也已经发生了变化。
模拟删除进程(释放内存)的时候,则需要注意如果当前内存块的上下有空闲块,则需要将其合并为一整个空闲块,也需要注意内存总块的数量变化。
最佳适配算法
[cpp] view
plain copy
#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;
}
邻近适配算法
[cpp] view
plain copy
#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;
}
原文地址: http://blog.csdn.net/nk_test/article/details/50413665
(1) 最佳适配算法:选择内存空闲块中最适合进程大小的块分配。
(2) 邻近适配算法:从上一次分配的地址开始查找符合要求的块,所查找到的第一个满足要求的空闲块就分配给进程。
模拟添加进程的时候,假定内存是一块完整的空闲区,对于算法(1)来说,分配的时候遍历所有的空闲内存块,找出其中最适合的一块,注意此时内存分区的总块数可能已经发生了变化;
对于算法(2)来说,则需要从上次分配的内存块(使用变量记录即可)接着向下找到第一个满足条件的块即可,内存分区的总块可能也已经发生了变化。
模拟删除进程(释放内存)的时候,则需要注意如果当前内存块的上下有空闲块,则需要将其合并为一整个空闲块,也需要注意内存总块的数量变化。
最佳适配算法
[cpp] view
plain copy
#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;
}
邻近适配算法
[cpp] view
plain copy
#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;
}
原文地址: http://blog.csdn.net/nk_test/article/details/50413665
相关文章推荐
- Keysight34401数字多用表远程遥控读取数据
- 在网页中插入百度地图
- Leetcode 6. ZigZag Conversion
- Leetcode 2. Add Two Numbers
- ISP DSP的不同
- 论能写代码的程序员与一个会写代码的程序员
- PHP Ajax
- 在WIN7/8下把XP装入VHD (下)
- Maven学习总结(七)——eclipse中使用Maven创建Web项目
- Leetcode 1. Two Sum
- 亿级Web系统搭建:单机到分布式集群
- SpringMVC + MyBatis整合
- 自动生成小学四则运算题目
- 最多只需三步,彻底解决VB6中不能加载MSCOMCTL.OCX的提示
- 深度学习网址
- Xml数据导入MySQL,SQLite等数据库
- SSDUT集训题
- Impala与HBase整合实践
- 一点思考··
- PHP Function参数传递