buddy算法

buddy算法是用来做内存管理的经典算法,目的是为了解决内存的外碎片。
避免外碎片的方法有两种:

  • 1,利用分页单元把一组非连续的空闲页框映射到非连续的线性地址区间。
  • 2,开发适当的技术来记录现存的空闲连续页框块的情况,以尽量避免为满足对小块的请求而把大块的空闲块进行分割。

基于下面三种原因,内核选择第二种避免方法:

  • 在某些情况下,连续的页框确实必要。
  • 即使连续页框的分配不是很必要,它在保持内核页表不变方面所起的作用也是不容忽视的。假如修改页表,则导致平均访存次数增加,从而频繁刷新TLB。
  • 通过4M的页可以访问大块连续的物理内存,相对于4K页的使用,TLB未命中率降低,加快平均访存速度。

buddy算法将所有空闲页框分组为10个块链表,每个块链表的每个块元素分别包含1,2,4,8,16,32,64,128,256,512个连续的页框,每个块的第一个页框的物理地址是该块大小的整数倍。如,大小为16个页框的块,其起始地址是16*2^12(一个页框的大小为4k,16个页框的大小为16*4K,1k=1024=2的10次方,4k=2的12次方)的倍数。
例,假设要请求一个128个页框的块,算法先检查128个页框的链表是否有空闲块,如果没有则查256个页框的链表,有则将256个页框的块分裂两份,一份使用,一份插入128个页框的链表。如果还没有,就查512个页框的链表,有的话就分裂为128,128,256,一个128使用,剩余两个插入对应链表。如果在512还没查到,则返回出错信号。

回收过程相反,内核试图把大小为b的空闲伙伴合并为一个大小为2b的单独快,满足以下条件的两个块称为伙伴:1,两个块具有相同的大小,记做b;2,它们的物理地址是连续的,3,第一个块的第一个页框的物理地址是2*b*2^12的倍数,该算法迭代,如果成功合并所释放的块,会试图合并2b的块来形成更大的块。

时间: 2024-10-26 11:25:41

buddy算法的相关文章

一个程序明白buddy算法

#define method 2 #if  method == 0x00 #include<stdio.h> #include<math.h> /* * struct array_cache * * Per cpu structures * Purpose: * - LIFO ordering, to hand out cache-warm objects from _alloc * - reduce the number of linked list operations * -

内存管理算法--Buddy伙伴算法

Buddy算法的优缺点: 1)尽管伙伴内存算法在内存碎片问题上已经做的相当出色,但是该算法中,一个很小的块往往会阻碍一个大块的合并,一个系统中,对内存块的分配,大小是随机的,一片内存中仅一个小的内存块没有释放,旁边两个大的就不能合并.2)算法中有一定的浪费现象,伙伴算法是按2的幂次方大小进行分配内存块,当然这样做是有原因的,即为了避免把大的内存块拆的太碎,更重要的是使分配和释放过程迅速.但是他也带来了不利的一面,如果所需内存大小不是2的幂次方,就会有部分页面浪费.有时还很严重.比如原来是1024

内存管理算法--Buddy伙伴算法【转】

转自:http://blog.csdn.net/orange_os/article/details/7392986 Buddy算法的优缺点: 1)尽管伙伴内存算法在内存碎片问题上已经做的相当出色,但是该算法中,一个很小的块往往会阻碍一个大块的合并,一个系统中,对内存块的分配,大小是随机的,一片内存中仅一个小的内存块没有释放,旁边两个大的就不能合并. 2)算法中有一定的浪费现象,伙伴算法是按2的幂次方大小进行分配内存块,当然这样做是有原因的,即为了避免把大的内存块拆的太碎,更重要的是使分配和释放过

linux内核分析之内存管理

1.struct page 1 /* Each physical page in the system has a struct page associated with 2 * it to keep track of whatever it is we are using the page for at the 3 * moment. Note that we have no way to track which tasks are using 4 * a page, though if it

操作系统之存储器管理

存储器的层次结构 存储器的层次如下图: 上图中,寄存器和主存储器称为可执行存储器.高速缓存的作用是缓和CPU与内存之间的速度差异,主要由硬件实现.磁盘缓存的出现是由于内存容量不够,需要引入磁盘,然而磁盘的I/O速度远低于主存的访问速度,为了缓和两者之间在速度上的差异,设置了磁盘缓存.磁盘缓存与高速缓存不同,它本身并不是实际存在的存储器,是利用主存中的部分空间暂时存放从磁盘中读出写入的信息. 程序的装入与链接 用户程序需要运行,必须先将它装入内存,然后再将其转变为一个可以执行的程序,通常要经历一下

Linux 内存管理机制

对于32bit Linux系统来说,一般留给用户态空间是3GB,高地址的1GB  0xC0000000~0xFFFFFFFF是留给kernel的. 并且一般采用分页,分段,段页式的方式.一页大小一般为2^12=4096=4KB的大小.一般是10+10+12 内存管理算法一般是使用两种算法相配合: BUDDY算法,1,2,4,8,....使用情况在  /proc/buddyinfo Solaris-SLAB算法,用高速缓存来描述不同的对象,每种对象对应一个高速缓存.高速缓存由SLAB来管理对象的内

Linux 内核综述

一.什么是Linux内核: 内核->操作系统中最重要的部分,内核将在系统引导时被装载进RAM,其中包含了很多关键的例程,以操作系统.内核是OS最为关键的部分,人们常将OS(操作系统)与内核等同. 内核,是一个操作系统的核心.它负责管理系统的进程.内存.设备驱动程序.文件和网络系统,决定着系统的性能和稳定性. 想象一下,拥有了内核的源程序对你来说意味着什么?我们可以了解系统是如何工作的.通过通读源代码,我们就可以了解系统的工作原理,这在Windows下简直是天方夜谭.我们还可以针对自己的情况,量体

&lt;Linux内核源码&gt;内存管理模型

题外语:本人对linux内核的了解尚浅,如果有差池欢迎指正,也欢迎提问交流! 首先要理解一下每一个进程是如何维护自己独立的寻址空间的,我的电脑里呢是8G内存空间.了解过的朋友应该都知道这是虚拟内存技术解决的这个问题,然而再linux中具体是怎样的模型解决的操作系统的这个设计需求的呢,让我们从linux源码的片段开始看吧!(以下内核源码均来自fedora21 64位系统的fc-3.19.3版本内核) <include/linux/mm_type.h>中对于物理页面的定义struct page,也

NETTY4中的BYTEBUF 内存管理

转 http://iteches.com/archives/65193 Netty4带来一个与众不同的特点是其ByteBuf的重现实现,老实说,java.nio.ByteBuf是我用得很不爽的一个API,相比之下,通过维护两个独立的读写指针,io.netty.buffer.ByteBuf要简单不少,也会更高效一些.不过,Netty的ByteBuf带给我们的最大不同,就是他不再基于传统JVM的GC模式,相反,它采用了类似于C++中的malloc/free的机制,需要开发人员来手动管理回收与释放.从