实现动态分区的分配算法。
(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;
- }
原文地址: http://blog.csdn.net/nk_test/article/details/50413665