Linux伙伴算法

深入了解物理内存管理-伙伴(Buddy)算法 前言:伙伴算法(buddy算法),计算机算法的一种,是为了核心内存管理能够快速响应请求,尽可能地在提高内存利用率的同时减少内存碎片的一种算法。 一、伙伴关系 伙伴关系的定义为:由一个母实体分成的两个各方面属性一致的两个子实体,这两个子实体就处于伙伴关系。在操作系统分配内存的过程中,一个内存块经常被分成两个大小相等的内存块,这两个大小相等的内存块就处于伙伴关系。它满足3个条件:两个块具有相同大小;物理地址是连续的;从同一个大块中拆分出来。 二、伙伴算法的实现原理 为了便于页面的维护,将多个页面组成内存块,. 阅读详情

最近一直在学习Linux内存管理的知识,以《独辟蹊径品内核:Linux内核源代码导读》为学习的教材,并且参考了一些网络上的文章,再结合自己的理解整理出了如下的文章。由于笔者能力有限,文中难免存在不足,如果发现错误之处,希望能帮助我及时纠正错误之处。

1、
伙伴算法的用途

管理物理内存,解决外碎片问题。

2、满足以下条件的两个块称为伙伴

l 两个块具有相同的大小,记作b

l 它们的物理地址是连续的

l 第一块的第一个页框的物理地址是2*b*2^12的倍数

3、伙伴算法管理结构

伙伴算法把物理内存分为11个组,第0、1、...10组分别包含2^0、2^1、...2^10个连续物理页面的内存。在zone结构中,有一个free_area数组,数组的每一个成员代表一个组,相关定义如下:

#define MAX_ORDER 11

struct zone {

    ...

struct free_area free_area[MAX_ORDER];

    ...

}

struct free_area {

struct list_head free_list;

/*该组类别块空闲的个数*/

unsigned long nr_free;

};

    由此可知伙伴算法管理结构如下图所示:





4、伙伴算法的初始化和释放

1) 伙伴算法初始化过程

    在start_kernel->

             mem_init-> 

       free_all_bootmem_node->

            free_all_bootmem_core->

                 __free_pages_bootmem->

                               __free_pages->

                                __free_pages_ok->

                                       free_one_page->

                                         __free_one_page函数中,通过对每一个页面进行释放,从而完成对伙伴算法的初始化工作。

2) 伙伴算法的具体释放过程

l 伙伴算法释放的思想

当释放2^order页大小内存时,查看它的伙伴是否空闲,如果空闲就将伙伴从该组链表中删除,并且将这两个空闲的伙伴内存区域合并成一个更高阶的空闲内存区域,依次这样操作下去。

l __free_one_page函数分析如下

static inline void __free_one_page(struct page *page,

struct zone *zone, unsigned int order)

{

    unsigned long page_idx;

    int order_size = 1 << order;

    int migratetype = get_pageblock_migratetype(page);

 

    /*用PFN作为mem_map数组下标就可以索引到对应的page结构*/

    page_idx = page_to_pfn(page) & ((1 << MAX_ORDER) - 1);

    __mod_zone_page_state(zone, NR_FREE_PAGES, order_size);

  

    /*这个循环主要查看当前释放块伙伴是否空闲,如果空闲则合并它们*/

    while (order < MAX_ORDER-1) { 

    unsigned long combined_idx;

    struct page *buddy;

    /*找到释放块的伙伴*/

    buddy = __page_find_buddy(page, page_idx, order);

    /*判断释放块的伙伴是否空闲*/

    if (!page_is_buddy(page, buddy, order))

        break;

    list_del(&buddy->lru);

    zone->free_area[order].nr_free--;

    rmv_page_order(buddy);

    combined_idx = __find_combined_index(page_idx, order);

    page = page + (combined_idx - page_idx);

    page_idx = combined_idx;

    order++;

    }

    set_page_order(page, order);

    list_add(&page->lru,

    &zone->free_area[order].free_list[migratetype]);

    zone->free_area[order].nr_free++;

}


5、伙伴算法的内存分配

1) 伙伴算法内存分配的过程

当内核收到alloc_pages系列函数的分配请求时,首先需要确定是从哪一个节点上分配,然后再确定需要从节点的哪一个zone上分配,最后再根据伙伴算法,确定从zone的哪一个free_area数组成员上分配。在内存不足的情况下,还要回收内存,如果内存还是不够,还要调度kswapd把必要的内存存储到交换分区中。内存分配模块总是试图从代价最小的节点上分配,而对zone的确定则根据alloc_pages()系列函数的gfp_mask用以下规则确定:

l 如果gfp_mask参数设置了__GFP_DMA位,则只能从ZONE_DMA中分配。

l 如果gfp_mask参数设置了__GFP_HIGHMEM位,则能够从ZONE_DMA、ZONE_NORMAL、ZONE__HIGHMEM中分配。

l 如果__GFP_DMA和__GFP_HIGHMEM都没有设置,则能够从ZONE_DMA和ZONE_NORMAL中分配。

当然,如果没有指定__GFP_DMA标志,则会尽量避免使用ZONE_DMA区的内存,只有当指定的区内存不足,而ZONE_DMA区又有充足的内存时,才会从ZONE_DMA中分配。

2) 伙伴算法的具体内存分配过程

l 伙伴算法内存分配的思想

    举例说明:假设请求分配4个页面,根据该算法先到第2(2^2=4)个组中寻找空闲块,如果该组没有空闲块就到第3(2^3=8)个组中寻找,假设在第3个组中找到空闲块,就把其中的4个页面分配出去,剩余的4个页面放到第2个组中。如果第三个组还是没有空闲块,就到第4(2^4=16)个组中寻找,如果在该组中找到空闲块,把其中的4个页面分配出去,剩余的12个页面被分成两部分,其中的8个页面放到第3个组,另外4个页面放到第2个组...依次类推。

l alloc_pages系列函数最终会调用__rmqueue函数从free_area中取出内存页面,__rmqueue函数具体分析如下:

//返回申请到的内存空间首页的struct page结构指针

static struct page *__rmqueue(struct zone *zone, unsigned int order)

{

    struct free_area * area;

    unsigned int current_order;

    struct page *page;

    /*查询zone中从order到MAX_ORDER-1的各指数值对应的空闲内存区域*/

    for (current_order = order; current_order < MAX_ORDER; ++current_order) {

    /*连续2^current_order页空闲内存区域的描述结构指针*/

    area = zone->free_area + current_order;

    /*如果该空闲内存区域为空,则继续查看2^(current_order+1)页空闲内存区域*/

    if (list_empty(&area->free_list))

        continue;

            

    /*得到该空闲内存区域的首页struct page结构指针*/

    page = list_entry(area->free_list.next, struct page, lru);

    /*将page所指的连续2^current_order页的空闲区域从其所在的链表中删除*/

    list_del(&page->lru);

    rmv_page_order(page);

    area->nr_free--;

    __mod_zone_page_state(zone, NR_FREE_PAGES, - (1UL << order));

    /*

     *如果分配的内存比要申请的内存大,则需要把大块剩余的那一部分

     *分解并放到对应的队列中去

     */

    expand(zone, page, order, current_order, area);

    return page;

    }

    return NULL;

}

    这个函数根据order从最合适的free_area队列中分配,如果不成功就从更大的块中找,找到一个合适的块后把它摘下来,最后需要把大块剩余的那一部分分解并放到对应的队列中去,这个工作是expand函数完成的。

Linux中伙伴算法的源码分析 伙伴系统 1.前言 Linux内核内存管理的一项重要工作就是如何在频繁申请释放内存的情况下,避免碎片的产生。Linux采用伙伴系统解决外部碎片的问题,采用slab解决内部碎片的问题,在这里我们先讨论外部碎片问题。避免外部碎片的方法有两种:一种是之前介绍过的利用非连续内存的分配;另外一种则是用一种有效的方法来监视内存,保证在内核只要申请一小块内存的情况下,不会从大块的连续空闲内存中截取一段过来,从而保证了大块内存的连续性和完整性。显然,前者不能成为解决问题的普遍方法,一来用来映射非连续内存线性地址空间有限,二 阅读详情

相关推荐

linux中的伙伴算法

伙伴系统 1.前言 Linux内核内存管理的一项重要工作就是如何在频繁申请释放内存的情况下,避免碎片的产生。Linux采用伙伴系统解决外部碎片的问题,采用slab解决内部碎片的问题,在这里我们先讨论外部碎片问题。避免外部碎片的方法有两种:一种是之前介绍过的利用非连续内存的分配;另外一种则是用一种有效的方法来监视内存,保证在内核只要申请一小块内存的情况下,不会从大块的连续空闲内存中截取一段过来,从而保证了大块内存的连续性和完整性。显然,前者不能成为解决问题的普遍方法,一来用来映射非连续内存线性地址空间有限,二

weixin_48101150的博客 619

伙伴算法、slab机制、内存管理函数

文章目录

qq_41683305的博客 2520

Linux伙伴系统算法

伙伴系统算法: 内核应该为分配一组连续的页框而建立一种健壮高效的分配策略。因此,必须解决著名的内存管理问题,也就是所谓的外碎片。频繁的请求和释放不同大小的一组连续页框, 必然导致在已分配页框的块内分散了许多小块的空闲页框。因此带来的问题是,即使有足够的空闲页框可以满足请求,但要分配一个大块的连续页框就无法满足。从本质上说,避免外碎片的方法有两种: 1.利用分页单元吧一组非连续的空闲页框映射到连续的线性地址区间 2.开发一种适当的技术来记录现存的空闲连续页框块的情况,以尽量...

dw147258dw的专栏 758

伙伴算法原理简介

文章目录引出实现伙伴定义思想申请空间举例释放空间举例伙伴合并通过一个更具体例子来看优缺点优缺点内部碎片和外部碎片数据结构参考 引出 正好最近在做内存相关的一些开发也研究,看到了一个叫伙伴算法的东西,学习一下并做个分享。 内存碎片:内存碎片就是内存被分割成很小很小的一些块,这些块虽然是空闲的,但是却小到无法使用。随着申请和释放次数的增加,内存将变得越来越不连续。最后,整个内存将只剩下碎片,即使有足够的空闲页框可以满足请求,但要分配一个大块的连续页框就可能无法满足,危害:浪费内存空间。我们需要尽量避免产生内

Charles Ren's Tech Blog 8425

Linux内存管理之伙伴算法

上文我们讲到快速分配和慢速分配,接下来会详细讲解这两种分配情况,我们先来看下快速分配:staticstructpage* get_page_from_freelist(gfp_t...

Peter的专栏 1054

电竞护航系统成品搭建俱乐部点单小程序开发三角洲小程序搭建

电竞护航系统成品搭建俱乐部点单小程序开发三角洲小程序搭建

dapengglove的博客 1682

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

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

orange_os的专栏 4万+

001-基础入门-Web演示源码&资源&工具箱等

小迪安全2023笔记

wushangyu32335的博客 4260

linux伙伴算法源代码,伙伴算法

原标题:伙伴算法1.伙伴算法的引入内核在频繁的请求和释放不同大小的一组连续页框,必然会导致在已经分配的块内分散了许多小块的空闲页框。由此带来的问题是,及时有足够的空闲页框可以满足请求,但是要分配一个大块的连续页框就无法满足。所以,内核应该为分配一组连续的页框而建立一种健壮,高校的分配策略。这样,内核就引入了伙伴算法。2.伙伴算法的思想Linux把所有的空闲页框分组为11个块链表,每个链表上的页框块...

weixin_28007513的博客 388

Python3 ACM模式输入输出全攻略:从牛客网到华为机试的实战技巧

本文详细解析了Python3在ACM模式下的输入输出处理技巧,针对牛客网、华为机试等在线评测系统。文章从input()函数本质出发,总结了六种高频输入模式的处理模板,并提供了链表、二叉树等数据结构的I/O实战方案,最后给出性能优化与常见避坑指南,帮助开发者高效应对算法笔试。

zero1的博客 998

IDEA出现闪退或打不开的解决方法

本身项目比较大,为了打开这个软件,可调节IDEA中安装的bin目录下有个。打开IDEA的时候过一会便闪退,可以再IDEA的右下角看到如下提示。(如果没有该提示,软件右下角也会有个红色感叹号,点开查看原因即可)闪退的多数原因大致是out of memory,内存溢出。查看任务管理器中的进程:(发现内存随时有溢出的情况)但也需要注意,该参数并不是越大越好,适中即可。只有个别原因是需要管理员权限就可执行!可以尽量减少软件的启动。

码农研究僧的博客 5944

linux内核伙伴算法,Linux内核研究之伙伴算法

Linux的物理地址一直深受碎片化的困扰。1、什么是碎片化?用户频繁地请求和释放不同大小的一组连续页框,必然导致在已分配页框的块内分散了许多小块的空闲页面。这些小块的空间分散开来,无法分配一个大块的连续页框,这就是物理地址的碎片化。由此带来的问题是,即使有足够的空闲页框可以满足请求,但要分配一个大块的连续页框可能无法满足请求。2、伙伴算法的相关概念伙伴算法(Buddy system)把所有的空闲页...

weixin_42538175的博客 276

sim800c插卡后指示灯还是一秒一闪无法接收发送短信,如何解决?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1167

linux伙伴算法实现过程分析

linux伙伴算法 Linux物理内存分配有三种方式:         a. per-CPU机制,分配单个页面,per-CPU的页缓存提供了更快的分配和释放机制;         b. 伙伴算法,适用于分配大块连续页面(至少一个页面),解决了外碎片问题;         c. slab机制,分配小内存,访问频率较高的内存,解决了内碎片问题。

ty_laurel的博客 3271

手把手教程 | 使用 apktool 修改已发布 APK 的版本号与版本名称

摘要:本文介绍如何使用apktool工具直接修改APK版本信息,适用于版本回滚、多版本测试等场景。详细步骤包括反编译APK、修改版本号、重打包、对齐优化和重新签名,并分享了反编译相关实用知识。该方法无需源代码参与,但需注意修改后的APK必须重新签名才能安装。最后强调应在合法范围内使用反编译技术。

学无止境 826

Android Framework WMS全面概述和知识要点

WindowManagerService 类是整个 WMS 的核心大脑,处于系统服务层,负责协调和管理所有与窗口相关的操作。它在 Android 系统架构中起到承上启下的关键作用,向上对接应用层的窗口请求,向下与 SurfaceFlinger 等底层组件交互,确保窗口能够正确地在屏幕上显示和管理。

大模型大数据攻城狮的专栏 1793

linux伙伴算法如何添加,Linux伙伴算法

最近一直在学习Linux内存管理的知识,以《独辟蹊径品内核:Linux内核源代码导读》为学习的教材,并且参考了一些网络上的文章,再结合自己的理解整理出了如下的文章。由于笔者能力有限,文中难免存在不足,如果发现错误之处,希望能帮助我及时纠正错误之处。1、伙伴算法的用途管理物理内存,解决外碎片问题。2、满足以下条件的两个块称为伙伴l两个块具有相同的大小,记作bl它们的物理地址是连续的l第一块的第一个页...

weixin_36410141的博客 243

AI绘画与医疗可视化:用AI生成医学插图的实践

医疗可视化是医学教育、临床沟通和学术研究的核心工具。传统医学插图依赖手工绘制或专业3D建模,存在制作周期长、成本高、更新迭代慢等问题。随着深度学习技术的发展,AI绘画工具(如Stable Diffusion、DALL-E)展现出强大的图像生成能力,但医疗领域对插图的解剖准确性、标注规范性和语义完整性有极高要求,通用AI模型难以直接应用。本文聚焦AI技术与医疗领域的交叉创新,系统阐述如何通过数据预处理、模型定制化训练和后处理校验,构建符合医疗标准的插图生成系统。

大模型应用工坊 1788

linux伙伴算法如何添加,伙伴算法(上)

原标题:伙伴算法(上)1.伙伴算法的引入内核在频繁的请求和释放不同大小的一组连续页框,必然会导致在已经分配的块内分散了许多小块的空闲页框。由此带来的问题是,及时有足够的空闲页框可以满足请求,但是要分配一个大块的连续页框就无法满足。所以,内核应该为分配一组连续的页框而建立一种健壮,高校的分配策略。这样,内核就引入了伙伴算法。2.伙伴算法的思想Linux把所有的空闲页框分组为11个块链表,每个链表上的...

weixin_35143514的博客 156

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

深入探索Linux内核:揭秘伙伴算法的奥秘

在Linux系统中,内存的分配与回收速率直接影响系统的存取效率。当内核频繁请求和释放不同大小的一组连续页框时,会导致许多外部空闲碎片,造成空间的浪费。使用伙伴算法可以有效地缓解该问题。伙伴关系机制是操作系统中的一种动态存储管理算法。在进行内存分配时,该算法通过不断平分较大的空闲内存块来获得较小的空闲内存块,直到获得所需要的内存块;在进行内存回收时,该算法尽可能地合并空闲块。内存管理是应用程序通过硬件和软件协作访问内存的一种方法,当进程请求内存使用时,它给进程分配可用的内存;

深度Linux 1095

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Linux 伙伴算法简介

    本文将简要介绍一下Linux内核中的伙伴分配算法。 Technorati 标签: 伙伴算法     算法作用      它要解决的问题是频繁地请求和释放不同大小的一组连续页框,必然导致在已分配页框的块内分散了许多小块的空闲页面,由此带来的问题是,即使有足够的空闲页框可以满足请求,但要分配一个大块的连续页框可能无法满足请求。      伙伴算法(Buddy system)把所有的空闲...

weixin_33797791的博客 840

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

linux内核管理之——伙伴算法

1、页、页面、页框这三个要先搞清楚 这个图里面的小框框 虚拟地址的叫页,页面 物理地址的叫做框 页框 块。 虚拟地址(页面) -------------------- 页表 ------------------- 物理地址(页框) 页和页面是一个东西(一般是4K) 一个4G的虚拟地址空间,每个页大小4K,1M个页,也就是10^6个页,10^3*10^3,1024*10...

小吕的博客 905

linux伙伴算法原理

Linux 的伙伴算法把所有的空闲页面分为 10 个块组,每组中块的大小是 2 的幂次方个页 面,例如,第 0 组中块的大小都为 2 0 (1 个页面),第 1 组中块的大小都为 2 1 (2 个页面), 第 9 组中块的大小都为 2 9 (512 个页面)。也就是说,每一组中块的大小是相同的,且这同样 大小的块形成一个链表。 我们通过一个简单的例子来说明该算法的工作原理。 假设要求分配的块的大小为 128 个页面(由多个页面组成的块我们就叫做页面块)。该 算法先在块大小为 128 个页面的链表中查找,看.

珂珂可爱多 1320

Linux 内存管理(七)之伙伴系统算法

伙伴系统算法是一种用来管理分配和释放内存的算法,它在 Linux 内核中被广泛使用。其设计目标是高效地管理内存碎片,并且具有快速的分配和释放速度。接下来将详细探讨一下 Linux 中的伙伴系统算法。

Projectsauron 的博客 5万+
上一篇: 函数式编程初探
下一篇: 四个服务器设计模型
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值