标签:
实现动态分区的分配算法。
(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