操作系统Buddy算法的C语言实现
前言
本机为微软Surface pro4
,为64
位,所用操作系统为Windos 10
。本机虚拟机版本为Oracle VM VirtualBox 6.1.8
,所用操作系统是使用Ubuntu18.04
,。Ubuntu的虚拟硬盘设置为200G
,显存为128MB
,内存为4G
,CPU
2个,所用镜像源为清华大学软件镜像源。所使用linux
内核为linux-5.11.8
。
注意事项
(1)本Buddy
算法的实现思路是借鉴网上的相关资源,并非原创。
(2)本篇博客代码只实现Buddy
算法的内存分配,未实现算法的内存合并。
Buddy算法介绍
Buddy
算法是为了解决linux
内存管理提出的一种高效管理算法,主要解决内存碎片问题,其基本思路如下:首先把内存中的页框(一个页框大小4kb,对应一个页面,物理的)分为连续的1,2,4,8,16,32,64,128,256,512,1024个页框数量,这样当你需要分配6个页面时,首先查看连续8个页面中大小是否为1,如果是则直接将这8个页面分配出去,如果连续8个页面也没有就去看连续16个页面是否存在有就拆分为两个连续8个页面,其中一个分配出去,另一个则将分给那个连续的8个页面共下次分配,直到1024个页面,若没有则分配失败。
Linux下C语言实现Buddy算法的代码
1、使用文件编辑器在主目录下创建一个名为OS1
的文件夹。
2、打开Geany
程序,然后点击新建按钮,创建一个新文件。
(注:创建完成界面如下)
3、在新建的文件中书写程序。(注:程序如下)
#include <stdio.h>
#include <stdlib.h>
//定义结构体用于实现Buddy的存储空间
struct Info
{
int value; //用于表示当前空间块的大小
int count; //用于表示当前该空间块的数量
int begin; //表示当前空间块的开始位置
int end; //表示当前空间块的结束位置
};
//空间初始化
void init(struct Info info[])
{
int i;
for(i=0; i<11; i++)
{
if(i == 0) info[i].value = 1;
else info[i].value = info[i-1].value*2; //对当前空间块赋初值
info[i].count = 0;
info[i].begin = 0;
info[i].end = 0;
}
info[10].count = 1;
info[10].end = 1023;
}
//打印函数
void print(struct Info info[])
{
int i;
for(i=0; i<11; i++)
{
printf("size=%4d count=%d ", info[i].value, info[i].count);
if(info[i].count > 0)
{
printf(" %4d ~ %4d\n", info[i].begin, info[i].end);
}
else { printf("\n"); }
}
}
//buddy算法的实现
void buddy(struct Info info[], int num)
{
int i, j, k; //定义3个变量用于循环
for(i=0; i<11; i++) //循环info数组
{
if(info[i].value >= num) //如果当前数组中的空间足够大
{
if(info[i].count == 1) //
{
info[i].count = 0;
printf("Allocate pages succefully!\n");
return ;
}
else
{
for(j=i; j<11; j++) //循环info数组
{
if(info[j].count == 1) //如果当前该空间块存在
{
info[j].count = 0; //把该页拆分开
for(k=i; k<j; k++) //对该页进行一块一块的拆分
{
info[k].count = 1;
info[k].begin = info[k].value;
info[k].end = info[k].begin*2 - 1;
}
printf("Allocate pages succefully!\n");
return ;
}
if(j == 10) //如果空间被分配光了
{
printf("Allocate pages failed!\n");
return ;
}
}
}
}
}
}
//主函数
int main()
{
int i, num; //num是要分配的空间数
struct Info info[11]; //定义了11个结构体数组
printf("Init:\n");
init(info); //初始化11个结构体数组
print(info); //打印初始化后的结构体数组
while(1)
{
printf("\nPlease input a num:"); //输入提示
scanf("%d", &num); //输入要分配内存
fflush(stdin); //清空输入缓冲区,确保不影响后面数据的读取
if(num > 1023) printf("The num is too big , try littler\n"); //报错输出
else
{
buddy(info, num); //对buddy算法进行实现
print(info); //输出现已经占有的info数组分配
}
}
return 0;
}
4、将程序文件命名buddy.c
为保存到OS1
文件下。(注:如图所示)
Buddy算法实现效果如下
1、按如下图示中标明顺序点击按钮执行即可(注:效果图如下)