首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux内存管理之伙伴算法

Buddy 分配算法 在看函数前,我们先看下算法,因为我一直认为有了“道”的理解才好进一步理解“术”。 ? 假设这是一段连续的页框,阴影部分表示已经被使用的页框,现在需要申请一个连续的5个页框。...为了避免出现这种情况,Linux内核中引入了伙伴系统算法(Buddy system)。...从上面可以知道Buddy算法一直在对页框做拆开合并拆开合并的动作。Buddy算法牛逼就牛逼在运用了世界上任何正整数都可以由2^n的和组成。这也是Buddy算法管理空闲页表的本质。...page) //如果area指定类型的伙伴系统链表为空 continue; //查找下一个order list_del(&page->lru); //从伙伴系统中删除 rmv_page_order...以上就是伙伴系统的分配过程。

2K30

Linux-3.14.12内存管理笔记【伙伴管理算法(3)】

前面分析了伙伴管理算法的初始化,在切入分析代码实现之前,例行先分析一下其实现原理。...伙伴管理算法(也称之为Buddy算法),该算法将所有空闲的页面分组划分为MAX_ORDER个页面块链表进行管理,其中MAX_ORDER定义: 【file:/include/linux/mmzone.h】...伙伴管理算法的释放过程是,满足条件的两个页面块称之为伙伴:两个页面块的大小相同且两者的物理地址连续。...当某块页面被释放时,且其存在空闲的伙伴页面块,则算法会将其两者合并为一个大的页面块,合并后的页面块如果还可以找到伙伴页面块,则将会继续与相邻的块进行合并,直至到大小为2^MAX_ORDER个页面为止。...而伙伴管理算法的申请过程则相反,如果申请指定大小的页面在其页面块链表中不存在,则会往高阶的页面块链表进行查找,如果依旧没找到,则继续往高阶进行查找,直到找到为止,否则就是申请失败了。

94820
您找到你想要的搜索结果了吗?
是的
没有找到

Linux-3.14.12内存管理笔记【伙伴管理算法(4)】

此处承接前面未深入分析的页面释放部分,主要详细分析伙伴管理算法中页面释放的实现。页面释放的函数入口是__free_page(),其实则是一个宏定义。...其中order表示页面数量,如果释放的是单页,则会调用free_hot_cold_page()将页面释放至per-cpu page缓存中,而不是伙伴管理算法;真正的释放至伙伴管理算法的是__free_pages_ok...其中if (pcp->count >= pcp->high)判断值得注意,其用于如果释放的页面超过了每CPU缓存的最大页面数时,则将其批量释放至伙伴管理算法中,其中批量数为pcp->batch。...具体分析一下释放至伙伴管理算法的实现free_pcppages_bulk(): 【file:/mm/page_alloc.c】 /* * Frees a number of pages from the...最后判断当前合并的页面是否为最大阶,否则将页面放至伙伴管理链表的末尾,避免其过早被分配,得以机会进一步与高阶页面进行合并。末了,将最后的挂入的阶的空闲计数加1。 至此伙伴管理算法的页面释放完毕。

95430

内存分配算法 伙伴系统

伙伴系统是常用的内存分配算法linux内核的底层页分配算法就是伙伴系统,伙伴系统的优点就是分配和回收速度快,减少外部碎片。...这两个算法分配和回收复杂度都是logn,并且空闲内存必须是2^n个基本分配单位。      ...然后又看了一下linux4.8的buddy system实现,linux的buddy system主要进行page分配也是linux最底层的分配,其他的分配算法都是以这个分配为基础,在x86架构下一个page...linux对内存进行了分区包括低端内存区,高端内存区,dma区,而且还对numa架构做了很多处理,对页面也进行了分类,这些不是讨论的重点,现在主要是提取linux的buddy算法,只提取核心部分,可以在控制台下运行...最大的是10,也就是1024个基本单位,所以linux在x86下一次最多可分配4MB内存。

1.5K10

伙伴系统之伙伴系统概述--Linux内存管理(十五)

在内核初始化完成之后, 内存管理的责任就由伙伴系统来承担. 伙伴系统基于一种相对简单然而令人吃惊的强大算法....Linux内核使用二进制伙伴算法来管理和分配物理内存页面, 该算法由Knowlton设计, 后来Knuth又进行了更深刻的描述....当一个块被最终释放时, 其伙伴将被检测出来, 如果伙伴也空闲则合并两者....为快速检测内存中的连续区域, 内核采用了一种古老而历经检验的技术: 伙伴系统 系统中的空闲内存块总是两两分组, 每组中的两个内存块称作伙伴. 伙伴的分配可以是彼此独立的....如果下一个请求只需要2个连续页帧, 则由8页组成的块会分裂成2个伙伴, 每个包含4个页帧. 其中一块放置回伙伴列表中,而另一个再次分裂成2个伙伴, 每个包含2页。

2.9K50

Linux 内核 内存管理】伙伴分配器 ① ( 伙伴分配器引入 | 页块、阶 | 伙伴 )

文章目录 一、伙伴分配器引入 二、页块、阶 三、伙伴 一、伙伴分配器引入 ---- Linux 内核 初始化 完成之后 , 就会 丢弃 引导内存分配器 , 如 : bootmem 分配器 , memblock...分配器 ; 此时 , 使用 " 页分配器 “ 管理 ” 物理页 " , " 伙伴分配器 “ 就是 ” 页分配器 " , 其特点是 算法简单 , 性能高效 ; 二、页块、阶 ---- 伙伴分配器 有如下概念...2^1 = 2 个 连续的 " 物理页 " ; 2 阶页块是 2^2 = 4 个 连续的 " 物理页 " ; \vdots n 阶页块是 2^n 个 连续的 " 物理页 " ; 三、伙伴...的整数倍 ; ③ 合并页块 : 如果需要合并这两个 n 阶页块为 n + 1 阶页块 , 则第 1 页的 物理页 页号必须是 2^{n + 1} 整数倍 ; 0 页 与 1 页是伙伴...; 2 页 与 3 页是伙伴 ; 1 页 与 2 页不是伙伴 , 这两页如果合并成页块 , 其第一页的页号不是 2^{n + 1} 整数倍 ;

94420

深度剖析 Linux 伙伴系统的设计与实现

在上篇文章 《深入理解 Linux 物理内存分配全链路实现》 中,笔者为大家详细介绍了 Linux 内存分配在内核中的整个链路实现: image.png 但是当内核执行到 get_page_from_freelist...而伙伴系统的核心数据结构就封装在 struct zone 里,关于 struct zone 结构体的详细介绍感兴趣的朋友可以回看下笔者之前的文章 《深入理解 Linux 物理内存管理》中第五小节 “ 5...伙伴必须是大小相同并且在物理内存上是连续的两个或者多个 page。 3. 伙伴系统的内存分配原理 在 《深入理解 Linux 物理内存分配全链路实现》 一文中的第二小节 " 2....但真正进入伙伴系统之前,内核还是做了很多铺垫工作,为了给大家解释清楚这些内容,我们还是需要重新回到上篇文章 《深入理解 Linux 物理内存分配全链路实现》 “5....笔者在 《深入理解 Linux 物理内存管理》的 “ 5.

30131

伙伴系统之避免碎片--Linux内存管理(十六)

在可变式分区分配中, 为把一个作业装入内存, 应按照一定的分配算法从系统中找出一个能满足作业需求的空闲分区分配给作业, 如果这个空闲分区的容量比作业申请的空间容量要大, 则将该分区一分为二, 一部分分配给作业...在固定分区管理算法中, 分给程序的内存空间往往大于程序所需的空间, 这剩余部分的空间不能被其他程序所用, 这就是”内部碎片” 1.2 今日内容(buddy伙伴系统如何避免碎片) Linux伙伴系统分配内存的大小要求...伙伴系统的基本原理已经在前面已经讨论过, 一个双链表即可满足伙伴系统的所有需求, 其方案在最近几年间确实工作得非常好。...很长时间以来,物理内存的碎片确实是Linux的弱点之一。尽管已经提出了许多方法,但没有哪个方法能够既满足Linux需要处理的各种类型工作负荷提出的苛刻需求,同时又对其他事务影响不大。...参见include/linux/mmzone.h?

3.1K30

伙伴系统的概述

Linux内核内存管理的一项重要工作就是如何在频繁申请释放内存的情况下,避免碎片的产生。Linux采用伙伴系统解决外部碎片的问题,采用slab解决内部碎片的问题,在这里我们先讨论外部碎片问题。...因此Linux采用后者来解决外部碎片的问题,也就是著名的伙伴系统。 什么是伙伴系统? 伙伴系统的宗旨就是用最小的内存块来满足内核的对于内存的请求。...下面我们结合示意图来了解伙伴系统分配和回收内存块的过程。 ? 1 初始化时,系统拥有1M的连续内存,允许的最小的内存块为64K,图中白色的部分为空闲的内存块,着色的代表分配出去了得内存块。...,进行合并,生成一个order 1的内存块m 9.3 两个order 1伙伴块都是空闲的,进行合并,生成一个order 2的内存块 9.4 两个order 2伙伴块都是空闲的,进行合并,生成一个order...图中一共有32个页,只分配出了4个页框,但是能够分配的最大连续内存也只有8个页框(因为伙伴系统分配出去的内存必须是2的整数次幂个页框),内核解决这种问题的办法就是将不同类型的页进行分组。

87020

SAP软件关于“业务合作伙伴”—— 确定合作伙伴功能

客户层次的维护要经过下列几个步骤: 1、 定义层次类型,并分配默认的合作伙伴功能 2、 为层次类别设置合作伙伴确定 …… 合作伙伴的类型: 顾客主数据中是如何确定合作伙伴功能的?...1、 根据客户的账户组,在合作伙伴分配过程中找到与该“账户组”对应的“合作伙伴确定过程”。 2、 然后根据这个“合作伙伴确定过程”在表“合作伙伴确定过程功能”找到所有的合作伙伴功能 的编号。...在这个过程中,可以确定哪些功能是强制的(必须显示在页面上而且不能被删除),哪些合作伙伴是只读的(不可以被修改) 3、 根据这个合作伙伴功能编号找到详细的信息:合作伙伴的类型、底层合作伙伴功能。...抬头的合作伙伴和项目的合作伙伴的确定过程是不同的,抬头根据单据类型,项目根据项目类别决定。 订单中是如何确定抬头的合作伙伴? 1、 在销售单据类型的配置中,可以该单据类型对应的“合作伙伴确定过程”。...4、 然后找到这些合作伙伴功能的ID,然后读取合作伙伴前台定义的顾客编号、联系人等等合作伙伴的实例。 订单中是如何确定项目的合作伙伴

2.6K20

伙伴系统和slab机制

伙伴系统 Linux内核中采用了一种同时适用于32位和64位系统的内存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系统中,用到了四级页表。...为了避免出现这种情况,Linux内核中引入了伙伴系统算法(buddy system)。...Buddy算法的优缺点: 1)尽管伙伴内存算法在内存碎片问题上已经做的相当出色,但是该算法中,一个很小的块往往会阻碍一个大块的合并,一个系统中,对内存块的分配,大小是随机的,一片内存中仅一个小的内存块没有释放...2)算法中有一定的浪费现象,伙伴算法是按2的幂次方大小进行分配内存块,当然这样做是有原因的,即为了避免把大的内存块拆的太碎,更重要的是使分配和释放过程迅速。...Buddy算法的释放原理: 内存的释放是分配的逆过程,也可以看作是伙伴的合并过程。

2.3K11

这些书,推荐给小伙伴们,也送给小伙伴们!

想必不少小伙伴打算趁此机会入手几本好书,好让自己继续精进!有打算买书的小伙伴,我为大家整理了一份书单,让大家买书不迷茫!快来看看吧!...深入Java虚拟机:JVM G1GC的算法与实现 作者:[日]中村成洋;译者:吴炎昌 杨文轩 结合实用 JVM,图解 Java 垃圾回收机制的关键技术!...,对 JVM 内存管理中的垃圾回收算法 G1GC 进行了详细解读。...全书分为“算法篇”和“实现篇”两大部分。...本书以图配文,通俗易懂,既系统介绍了 G1GC 的基础算法,又贴近现实,剖析了实用 JVM 中的 G1GC 实现,同时还包含了作者对 G1GC 的研究成果和独到见解,是深入理解 JVM 和 G1GC

41310

重磅|腾讯数字孪生伙伴峰会圆满举办,全新核心伙伴计划正式启航!

9月8日,在腾讯全球数字生态大会期间,腾讯数字孪生产品部成功举行了“数字孪生伙伴峰会”,来自众多行业的权威专家、优秀客户、生态伙伴齐聚一堂,共话数字孪生产业实践新图景。...会上发起了2023-24腾讯数字孪生核心伙伴计划,重点招募“数字孪生区域代理合作伙伴”,落地腾讯数字孪生区域服务中心,有意向企业请见文末。...(腾讯云副总裁、腾讯数字孪生产品副总裁 张果) 腾讯云副总裁、腾讯数字孪生产品副总裁张果介绍了全面升级的两大产品生态策略,为五大类型的合作伙伴提供精准匹配的支撑,从产品与解决方案上帮助伙伴降本增效。...他表示,2023年下半年腾讯将重点发起两大伙伴计划,不断完善生态建设体系,在伙伴的技术支撑体系、市场支撑体系、平台支撑体系和伙伴陪跑体系上提供更加完善的制度、流程和配套资源。...本次峰会中,腾讯数字孪生产品部与来自多个行业的伙伴举行了签约仪式,也为在合作中做出重要贡献的伙伴进行表彰。 (2023腾讯全球数字生态大会数字孪生伙伴签约)

34130
领券