伙伴算法 (Buddy Algorithm)简单描诉和自己的简单实现
来源:互联网 发布:武汉软件测试招聘 编辑:程序博客网 时间:2024/04/30 10:40
1:简单描诉
a)内存依据不同的order 分成了不同大小的块,order_i 的块大小为k* 2^order_i,其实k为最小块,也就是order_0的块的大小。
b)分配内存的时候,去最小的能够满足你大小的order级别里找空闲块,比如order_i,找到了就分配,找不到去order_(i+1)里找,找到的话分解成两个order_i级别的内存块,其中一个分配出去,如果还是找不到继续向上找并进行分解。分解出来的两个空闲块是伙伴关系。
c)内存释放的时候,如果等大小的伙伴已经被释放了,就要和伙伴一起结合成一个更大的(下一级别的)块。
下面是我用一个二位数组作map实现的简单的伙伴算法,内核里的肯定更高级。改天研究以下。
#include <iostream>#include <cmath>#include <vector>using namespace std;const int mem_size= 256;const char memory[mem_size]={0};const int minimumSize= 4;const int orderNum= 9;vector< vector<int> > memoryMap;int init_map(){int bloSize= 4;while(bloSize<=mem_size){vector<int> tmp;for(int i=0; i<mem_size; i+=bloSize)tmp.push_back(0);memoryMap.push_back(tmp);bloSize*= 2;}memoryMap[memoryMap.size()-1][0]= 1;//for(int i=0; i<memoryMap.size(); i++){//for(int j=0; j<memoryMap[i].size(); j++)//cout<<memoryMap[i][j]<<' ';//cout<<endl;//}return 1;}int alloc(int size){int miniBloNum= ceil((double)size/minimumSize);int orderID= 0;while(miniBloNum!=1){miniBloNum= ceil((double)miniBloNum/2);orderID++;}//orderID is the smallest block's id that can store itint i, j;//i is the free orderID, and j is the free block in this idbool find= false;for(i= orderID; i<memoryMap.size(); i++){for(j=0; j<memoryMap[i].size(); j++){if(memoryMap[i][j]==1){find= true;break;}}if(find)break;}if(!find)return -1;//splitwhile(i>orderID){memoryMap[i][j]= 0;memoryMap[i-1][j*2]= memoryMap[i-1][j*2+1]=1;i= i-1; j=j*2;}memoryMap[i][j]=0;int begIndex= j*pow(2.0, orderID)*minimumSize;return begIndex;}int free(int beg, int size){int miniBloNum= ceil((double)size/minimumSize);int orderID= 0;while(miniBloNum!=1){miniBloNum= ceil((double)miniBloNum/2);orderID++;}int bloSize= minimumSize*pow(2.0, orderID);int i= orderID, j= beg/bloSize;while(1){memoryMap[i][j]=1;int buddy= (0==j%2)?j+1:j-1;if(memoryMap[i][buddy]==1){memoryMap[i][j]= memoryMap[i][buddy]=0;i++; j/=2;}else break;}return 1;}void printMap(){int bloSize=1;//minimumSize;for(int i=0; i<memoryMap.size(); i++){for(int j=0; j<memoryMap[i].size()*bloSize; j++){if(j%bloSize==0)cout<<memoryMap[i][j/bloSize];else cout<<'_';}cout<<endl;bloSize*=2;}}int main(){init_map();//printMap();string cmd= "";int num=0;int begIndex= 0;while(1){cin>>cmd>>num;if(cmd[0]=='N'||cmd[0]=='n'){int beg= alloc(num);cout<<"new "<<beg<<' '<<num<<endl;printMap();}else {cin>>begIndex;free(begIndex, num);cout<<"free "<<begIndex<<' '<<num<<endl;printMap();}}return 0;}
0 0
- 伙伴算法 (Buddy Algorithm)简单描诉和自己的简单实现
- 关于Buddy(伙伴)算法的讨论
- 关于Buddy(伙伴)算法的讨论
- 伙伴算法(Buddy)
- 伙伴算法 buddy system
- 操作系统 --- Buddy伙伴算法
- 内存管理之伙伴系统算法(The Buddy System Algorithm)
- 我看Buddy(伙伴)算法-到底是怎么计算"伙伴"地址的
- 内存管理算法--Buddy伙伴算法
- 内存管理算法--Buddy伙伴算法
- 内存管理算法--Buddy伙伴算法
- 内存管理算法--Buddy伙伴算法
- Linux伙伴算法(Buddy Allocator)
- 简单的遗传算法(Genetic Algorithm)源代码
- xv6的buddy(伙伴)系统源代码之buddy.h
- 【那些年遇到过的面试题】 内存管理算法--Buddy伙伴算法
- 自己实现的简单List和Map
- Buddy算法实现
- 如何编写出优美的JavaScript代码?
- ubuntu 下 cuda 6.5 安装以及caffe 配置
- 单播、多播、广播、组播、泛播概念区分
- 第5周项目3-用多文件组织多个类的程序
- C语言运算符的结合性
- 伙伴算法 (Buddy Algorithm)简单描诉和自己的简单实现
- Launcher3 源码分析(一) 整体结构及核心类
- 【剑指offer】第四题 替换空格
- Rooks NOJ 1390
- shell中数组的应用
- VMware虚拟机中如何安装VMWare-Tools详解
- POJ刷题(2013)
- 使用repo和git下载android源码 和 相关解释
- 五大常用算法之四:回溯法