您的位置:首页 > 其它

操作系统: 最佳适配算法和邻近适配算法的模拟实现(内存分配算法)

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: