懒惰的伙伴阿尔戈特姆
Lazy Buddy Algorthm
如何在linux上实现懒惰的伙伴系统算法?Di 的初始值为 0。操作后,Di 的值更新如下:-(I) 如果下一个操作是对大小为 2i 的块的块分配请求:如果有任何空闲块,请选择一个要分配的块 如果所选块在本地空闲那么 Di = Di + 2; 否则 di = di + 1;还 首先通过将一个较大的区块分成两个来获得两个区块。 分配一个并在本地标记其他免费 Di保持不变。
(II) 如果下一个操作是大小为 2i 的块的无块请求案例 Di>= 2: 在本地标记它免费并在本地释放它。 Di = 2情况 Di = 1: 全局标记自由并全局释放;如果可能,合并 Di = 0案例 Di = 0 全局标记自由并全局释放;如果可能,合并 选择一个大小为 2i 的本地自由块并全局释放它;如果可能,合并 Di = 0;
#include<stdio.h>
int tree[2050],i,j,k;
void segmentalloc(int,int),makedivided(int),makefree(int),printing(int,int);
int place(int),power(int,int);
main()
{
int totsize,cho,req;
for(i=0;i<80;i++) printf("%c",5);
printf(" B U D D Y S Y S T E M R E Q U I R E M E N T Sn");
for(i=0;i<80;i++) printf("%c",5);
printf("Enter the Size of the memory : ");
scanf("%d",&totsize);
while(1)
{
for(i=0;i<80;i++) printf("%c",5);
printf(" B U D D Y S Y S T E Mn");
for(i=0;i<80;i++) printf("%c",5);
printf(" * 1) Locate the process into the Memoryn");
printf(" * 2) Remove the process from Memoryn");
printf(" * 3) Tree structure for Memory allocation Mapn");
printf(" * 4) Exitn");
for(i=0;i<80;i++) printf("%c",5);
printf("* Enter your choice :n ");
scanf("%d",&cho);
switch(cho)
{
case 1:
printf(" ");
for(i=0;i<80;i++) printf("%c",5);
printf(" ");
printf("M E M O R Y A L L O C A T I O N n");
for(i=0;i<80;i++) printf("%c",5);
printf("* Enter the Process size : ");
scanf("%d",&req);
segmentalloc(totsize,req);
break;
case 2:
printf(" ");
for(i=0;i<80;i++) printf("%c",5);
printf(" ");
printf("M E M O R Y D E A L L O C A T I O N nn");
for(i=0;i<80;i++) printf("%c",5);
printf("* Enter the process size : ");
scanf("%d",&req);
makefree(req);
break;
case 3:
printf(" ");
for(i=0;i<80;i++) printf("%c",5);
printf("M E M O R Y A L L O C A T I O N M A Pnn");
for(i=0;i<80;i++) printf("%c",5);
printf(" ");
printing(totsize,0);
printf(" ");
for(i=0;i<80;i++) printf("%c",5);
break;
default:
return;
}
}
}
void segmentalloc(int totsize,int request)
{
int flevel=0,size;
size=totsize;
if(request>totsize)
{
printf("%c R E S U L T : ",2);
printf("* The system don't have enough free memoryn");
printf("* Suggession : Go for VIRTUAL MEMORYn");
return;
}
while(1)
{
if(request<size && request>(size/2))
break;
else
{
size/=2;
flevel++;
}
}
for(i=power(2,flevel)-1;i<=(power(2,flevel+1)-2);i++)
if(tree[i]==0 && place(i))
{
tree[i]=request;
makedivided(i);
printf("Result : Successful Allocationn");
break;
}
if(i==power(2,flevel+1)-1)
{
printf(" Result : ");
printf("* The system don't have enough free memoryn");
printf("* Suggession : Go for VIRTUAL Memory Moden");
}
}
void makedivided(int node)
{
while(node!=0)
{
node=node%2==0?(node-1)/2:node/2;
tree[node]=1;
}
}
int place(int node)
{
while(node!=0)
{
node=node%2==0?(node-1)/2:node/2;
if(tree[node]>1)
return 0;
}
return 1;
}
void makefree(int request)
{
int node=0;
while(1)
{
if(tree[node]==request)
break;
else
node++;
}
tree[node]=0;
while(node!=0)
{
if(tree[node%2==0?node-1:node+1]==0 && tree[node]==0)
{
tree[node%2==0?(node-1)/2:node/2]=0;
node=node%2==0?(node-1)/2:node/2;
}
else break;
}
}
int power(int x,int y)
{
int z,ans;
if(y==0) return 1;
ans=x;
for(z=1;z<y;z++)
ans*=x;
return ans;
}
void printing(int totsize,int node)
{
int permission=0,llimit,ulimit,tab;
if(node==0)
permission=1;
else if(node%2==0)
permission=tree[(node-1)/2]==1?1:0;
else
permission=tree[node/2]==1?1:0;
if(permission)
{
llimit=ulimit=tab=0;
while(1)
{
if(node>=llimit && node<=ulimit)
break;
else
{
tab++;
printf(" ");
llimit=ulimit+1;
ulimit=2*ulimit+2;
}
}
printf(" %d ",totsize/power(2,tab));
if(tree[node]>1)
printf("---> Allocated %d",tree[node]);
else if(tree[node]==1)
printf("---> Divided");
else printf("---> Free");
printing(totsize,2*node+1);
printing(totsize,2*node+2);
}
}
相关文章:
- 在C++中使用没有合作伙伴Class/Cpp文件的头文件是否实用
- C++中戈朗式延视镜防护性能
- 如何使用阿尔法努姆算法对C++中的文本行进行排序?
- 在不损失阿尔法值的情况下将 QColor 转换为 QString
- 戈朗原子.加载具有获取语义
- C++上下控制伙伴如何设置值而不是WM_SETTEXT
- 蒙戈更新插入性能(C++)
- 布尔阿尔法大写
- 协议缓冲区(protobuf)v3.0.0-阿尔法-2中的可选字段和约束
- 为LONGLONG类型指定默认值.明戈GCC
- 阿尔法-贝塔"breaking"阿姆达尔定律?
- C++ 如何检查字母是否为阿尔法(不是拉丁字母)
- 如何判断万智牌::图像是否具有阿尔法通道
- 戈朗打电话给库达图书馆
- 懒惰的伙伴阿尔戈特姆
- 波特迪奥和阿尔萨:"Cannot obtain info for CTL elem"
- 在 QImage 阿尔法通道中制作多边形孔
- 最小阿尔法贝塔的路径
- 迷你最大阿尔法贝塔修剪奥赛罗不工作
- 提升精神2:跟随QI的进度百分比::p阿尔瑟。我的代码中有什么不好?