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

linux内核中的伙伴系统分配器

伙伴系统分配器是Linux内核中的一种内存管理机制,用于动态分配和释放物理内存。它是一种基于二进制分割的内存分配算法,将物理内存划分为不同大小的块,以满足不同大小的内存分配请求。

伙伴系统分配器的工作原理如下:

  1. 初始化阶段:在系统启动时,伙伴系统分配器会将物理内存划分为不同大小的块,形成一个伙伴系统的内存块链表。
  2. 内存分配阶段:当应用程序或内核需要分配一块内存时,伙伴系统分配器会根据请求的大小,在合适的内存块链表中查找可用的内存块。如果找到了合适大小的内存块,则将其分配给请求方,并将剩余的部分分割成更小的块,加入到相应的链表中。
  3. 内存释放阶段:当应用程序或内核释放已分配的内存时,伙伴系统分配器会将该内存块标记为可用,并尝试与相邻的空闲内存块合并,形成更大的内存块。合并后的内存块会加入到合适的链表中,以备后续的内存分配请求。

伙伴系统分配器的优势:

  1. 高效的内存分配和释放:伙伴系统分配器采用二进制分割的方式,能够快速找到合适大小的内存块,提高了内存分配的效率。同时,合并相邻的空闲内存块可以减少内存碎片,提高了内存的利用率。
  2. 可扩展性:伙伴系统分配器支持动态调整内存块的大小,可以根据系统的需求进行扩展或收缩,提供了良好的可扩展性。
  3. 内存管理的灵活性:伙伴系统分配器可以根据不同的内存分配请求,选择合适大小的内存块进行分配,满足不同应用场景下的内存需求。

伙伴系统分配器的应用场景:

  1. 操作系统内核:伙伴系统分配器是Linux内核中的一部分,用于管理操作系统内核的内存分配和释放。它可以提供高效的内存管理机制,满足操作系统对内存的需求。
  2. 虚拟化技术:伙伴系统分配器可以用于虚拟化技术中的内存管理,为虚拟机提供高效的内存分配和释放机制。
  3. 分布式系统:伙伴系统分配器可以用于分布式系统中的内存管理,提供高效的内存分配和释放能力,满足分布式系统对内存的需求。

腾讯云相关产品和产品介绍链接地址:

腾讯云提供了多种云计算相关产品,其中包括与内存管理相关的产品,如云服务器、云数据库、云存储等。您可以访问腾讯云官方网站(https://cloud.tencent.com/)了解更多详情。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

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

文章目录 一、伙伴分配器引入 二、页块、阶 三、伙伴 一、伙伴分配器引入 ---- Linux 内核 初始化 完成之后 , 就会 丢弃 引导内存分配器 , 如 : bootmem 分配器 , memblock...分配器 ; 此时 , 使用 " 页分配器 “ 管理 ” 物理页 " , " 伙伴分配器 “ 就是 ” 页分配器 " , 其特点是 算法简单 , 性能高效 ; 二、页块、阶 ---- 伙伴分配器 有如下概念...^2 = 4 个 连续 " 物理页 " ; \vdots n 阶页块是 2^n 个 连续 " 物理页 " ; 三、伙伴 ---- 2 个 n 阶 " 页块 ( Page Block )..." 在满足 如下 3 个条件前提下 , 可以 称为 " 伙伴 " : ① 页块相邻 : 2 个 页块 ( Page Block ) 必须相邻 , 其物理地址是连续 ; ② 页块页号 : 第...整数倍 ; 0 页 与 1 页是伙伴 ; 2 页 与 3 页是伙伴 ; 1 页 与 2 页不是伙伴 , 这两页如果合并成页块 , 其第一页页号不是 2^{n + 1} 整数倍

1K20

Linux 内核 内存管理】伙伴分配器 ② ( 伙伴分配器分配内存流程 )

文章目录 一、伙伴分配器分配内存流程 1、查询 n 阶页块 2、查询 n + 1 阶页块 3、查询 n + 2 阶页块 一、伙伴分配器分配内存流程 ---- 伙伴分配器 以 " 阶 " 为单位 , 分配.../ 释放 物理页 ; 阶 ( Order ) : 物理页 数量单位 , n 阶页块 指的是 2^n 个 连续 " 物理页 " ; 页 / 阶 概念参考 【Linux 内核 内存管理...】伙伴分配器 ① ( 伙伴分配器引入 | 页块、阶 | 伙伴 ) 博客 ; " 伙伴分配器 " 分配内存流程 : 假设要 分配 n 阶页块 ; 1、查询 n 阶页块 查询当前是否有 空闲 n...阶页块 , 如果有则 直接分配 , 如果没有 , 则进入下一步 , 查询 n + 1 阶页块 ; 2、查询 n + 1 阶页块 查询当前是否有 空闲 n + 1 阶页块 , 如果有 , 将...阶页块 , 一块插入 空闲 n 阶页块链表 ; 一块 直接分配 , 如果没有 , 则进入下一步 , 查询 n + 2 阶页块 ; 3、查询 n + 2 阶页块 查询当前是否有 空闲

7.1K50
  • Linux 内核 内存管理】memblock 分配器 ⑤ ( Linux 内核定义 memblock 分配器位置 | ARM64体系架构下 Linux内核初始化 memblock 分配器流程 )

    文章目录 一、Linux 内核定义 memblock 分配器位置 二、ARM64 体系架构下 Linux 内核初始化 memblock 分配器流程 三、arm64_memblock_init 函数完整源码...一、Linux 内核定义 memblock 分配器位置 ---- Linux 内核 定义 memblock 分配器 位置 : Linux 内核源码 linux-4.12\mm\memblock.c...-4.12\mm\memblock.c#34 二、ARM64 体系架构下 Linux 内核初始化 memblock 分配器流程 ---- 先在 linux-4.12\init#488 位置 asmlinkage...分配器核心函数 ; ARM64 体系架构下 Linux 内核初始化 memblock 分配器流程 : ① 解析 " 设备树二进制文件 " /memory 节点 , 将 " 所有物理内存 " 纳入到...\init.c#379 ③ 从 memblock 分配器 , 删除 " 线性映射区域 不能覆盖 指定范围 物理内存 " ; /* * Remove the memory that we

    95810

    Buddy(伙伴)系统分配器之分配page

    Buddy分配器是按照页为单位分配和释放物理内存,在Zone那一节文章freearea就是通过buddy分配器来管理。 ?...buddy分配器将空闲页面按照order大小分配挂到不同order链表。...buddy分配器算法是: 当分配order=n页面的时候,首先order=nfreelist链表中去寻找对应页,如果order=nfreelist中有空闲页面,则直接分配 当order=n...freelist链表没有可用页面时,则去order=n+1freelist查找是否有对应空闲页面 如果order=n+1freelist链表存在空闲页面,则从order=n+1freelist...获取一个page, freelist[migratetype] 如果当前freelist存在可用page 将此page从pagelru链表删除 设置此pageprivate为0, ((

    1.2K20

    Linux 内核 内存管理】分区伙伴分配器 ⑥ ( zone 结构体水线控制相关成员 | 在 Ubuntu 查看内存区域水位线 )

    Linux 内核 内存管理】分区伙伴分配器 ⑤ ( 区域水线 | 区域水线数据结构 zone_watermarks 枚举 | 内存区域 zone 区域水线 watermark 成员 ) 中讲解了...) ---- 在 linux 内核源码 描述 " 内存区域 " 结构体 struct zone , 有几个重要参数 , 用于 控制 区域水线水位 : managed_pages 成员 表示...伙伴分配器 管理 物理页个数 ; 使用 如下 公式进行计算 : \rm zone\_end\_pfn - zone\_start\_pfn spanned_pages 成员 表示 内存区域 所有可用物理页...不包括 内存空洞 ; 是通过 伙伴分配器 管理 物理页 ; 使用 如下 公式进行计算 : \rm present\_pages - reserved\_pages present_pages、 spanned_pages...三者之间有如下关系 : spanned_pages ( 内存区域所有可用物理页数 有空洞 ) > present_pages ( 当前区域物理页数 无空洞 ) > managed_pages ( 伙伴分配器管理物理页数

    2.5K30

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

    内核如何记住哪些内存块是空闲 分配空闲页面的方法 影响分配器行为众多标识位 内存碎片问题和分配器如何处理碎片 2 伙伴系统结构 2.1 伙伴系统数据结构 系统内存每个物理内存页(页帧),都对应于一个...为快速检测内存连续区域, 内核采用了一种古老而历经检验技术: 伙伴系统 系统空闲内存块总是两两分组, 每组两个内存块称作伙伴. 伙伴分配可以是彼此独立....内核对所有大小相同伙伴(1、2、4、8、16或其他数目的页),都放置到同一个列表管理. 各有8页一对伙伴也在相应列表. 如果系统现在需要8个页帧, 则将16个页帧组成块拆分为两个伙伴....这是因为伙伴系统内核最值得尊敬一部分,对它改动不会被大家轻易接受 3.1 内存碎片 伙伴系统基本原理已经在第1章讨论过,其方案在最近几年间确实工作得非常好。...内核细粒度分配只能借助于slab分配器(或者slub、slob分配器), 后者基于伙伴系统 内存分配函数 功能 定义 alloc_pages(mask, order) 分配2^0页并返回一个struct

    3K51

    Linux 内核 内存管理】分区伙伴分配器 ① ( 分区伙伴分配器源码数据结构 | free_area 空闲区域数组 | MAX_ORDER 宏定义 | 空闲区域页最大阶数 )

    文章目录 一、分区伙伴分配器 二、分区伙伴分配器源码数据结构 1、free_area 空闲区域数组 2、MAX_ORDER 宏定义 ( 空闲区域页最大阶数 ) 一、分区伙伴分配器 ---- 在前两篇博客...【Linux 内核 内存管理】伙伴分配器 ① ( 伙伴分配器引入 | 页块、阶 | 伙伴 ) 【Linux 内核 内存管理】伙伴分配器 ② ( 伙伴分配器分配内存流程 ) , 讲解了 基本 伙伴分配器...概念 , 以及 内存分配流程 ; 分区伙伴分配器概念 : Linux 内核 在 基本 伙伴分配器 基础上 , 增加了对 " 内存节点 “ 和 ” 内存区域 “ 支持 , 这就是 ” 分区伙伴分配器...#453 " 内存区域 " struct zone 结构体位置 : 源码路径 : linux-4.12\include\linux\mmzone.h#350 参考 【Linux 内核 内存管理】...free_area[MAX_ORDER]; 数组 MAX_ORDER 宏定义值为 11 , MAX_ORDER 是最大阶数 11 , 伙伴分配器 最大可以分配 2^{10} 页块

    1.1K10

    Linux 内核 内存管理】分区伙伴分配器 ⑦ ( z->watermark 最低水位计算 | min_free_kbytes 初始化 )

    , 在 内存区域 zone 结构体 watermark 成员 表示 " 页分配器 " 使用 区域水线 ; struct zone { /* Read-mostly fields */...-4.12\include\linux\mmzone.h#255 其中涉及到 NR_WMARK 值为 4 , 定义在如下枚举数据结构 , enum zone_watermarks { WMARK_MIN...值进行计算 , min_free_kbytes 表示 " 系统保留最低空闲内存数 " , 二、min_free_kbytes 初始化过程 ---- min_free_kbytes 值在 init_per_zone_wmark_min...函数中进行初始化 , lowmem_kbytes 用于统计 低内存 超过 高水位 物理页个数 ; lowmem_kbytes 是 高水位线 之上内存 ; 内存区域 整体 物理页个数 是...zone 结构体 managed_pages 成员 ; 下图是整个内存区域图 ; lowmem_kbytes = nr_free_buffer_pages() * (PAGE_SIZE

    60820

    多核心Linux内核路径优化不二法门之-slab与伙伴系统

    伙伴系统 前面我们简短体会了Linux内核slab设计,不宜过长,太长了不易理解.但是最后,如果Level 3也没有获取page(s),那么最终会落到终极伙伴系统。...Linux内核伙伴系统针对单一页面的分配需求采取批量分配“每CPU单一页面缓存”方式!...为了维持“每CPU单一页面缓存”页面的数量不会太多或太少(太多会影响伙伴系统,太少会影响CPU需求),系统保持了两个值,当缓存页面数量低于low值时候,便从伙伴系统批量获取页面到池中,而当缓存页面数量大于...high时候,便会释放一些页面到伙伴系统。...小结 多CPU操作系统内核,关键开销就是锁开销。

    1.2K30

    Linux 内核 内存管理】分区伙伴分配器 ⑤ ( 区域水线 | 区域水线数据结构 zone_watermarks 枚举 | 内存区域 zone 区域水线 watermark 成员 )

    一、区域水线 二、区域水线数据结构 zone_watermarks 枚举 ( WMARK_MIN | WMARK_LOW | WMARK_HIGH | NR_WMARK ) 三、内存区域 zone 区域水线...枚举 ( WMARK_MIN | WMARK_LOW | WMARK_HIGH | NR_WMARK ) ---- 区域水线对应数据结构 定义在 linux 内核源码 linux-4.12\include...}; 源码路径 : linux-4.12\include\linux\mmzone.h#255 三、内存区域 zone 区域水线 watermark 成员 ---- " 内存区域 " struct...zone 结构体 unsigned long watermark[NR_WMARK]; 成员是 内存区域 " 页分配器 " 使用 区域水线 ; struct zone { /* Read-mostly...-4.12\include\linux\mmzone.h#354

    1.9K10

    Linux系统内核升级

    /releases.html Linux kernel版本状态说明 mainline mainline指由Linus Torvalds亲自制作内核发布版,是官方当前最新版本kernel source...Prepatch Prepatch 或 “RC” 内核是主要内核预发行版本,主要针对内核开发人员和 Linux 爱好者。必须从源代码进行编译,并且通常包含必须在可以放入稳定版本之前进行测试新功能。...,开启文本界面的编译选项菜单窗口,可以对内核加载模块编译选项进行调整,如修改编译后内核名称、新添加之前系统缺少模块等。...(*号则是以静态方式编译打包进内核文件,如果新添加模块较多,会导致内核文件体积增大) 新添加cgroup模块RDMA General setup ——> Control Group support...0 #0表示 /boot/grub2/grub.cfg 文件中排在第一位 menuentry 段 # 重启系统 [root@boy ~]# reboot # 查看重启后内核版本 [root@boy

    3.8K30

    Linux 内核系统架构

    这篇文章从进程调度,内存管理,设备驱动,文件系统,网络等方面讲解Linux内核系统架构。...Linux系统架构是一个经典设计,它优秀分层和模块化,融合了数量繁多设备和不同物理架构,让世界各地内核开发者能够高效并行工作。先来看看Linus在多年前公开Linux邮件。...Linux系统架构图 架构非常清晰,从硬件层,硬件抽象层,内核基础模块(进程调度,内存管理,网络协议栈等)到应用层,这个基本上也是各类软硬件结合系统架构基础设计,例如物联网系统(从单片机,MCU等小型嵌入式系统...在早期Linux操作系统,主要采用是时间片轮转算法(Round-Robin),内核在就绪进程队列中选择高优先级进程运行,每次运行相等时间。...TASK_SIZE可以配置,Linux系统默认配置3:1,应用程序使用3GB空间,内核使用1GB空间,这个划分并不依赖实际RAM大小。

    5.1K72

    Linux内核最新连续内存分配器(CMA)——避免预留大块内存【转】

    在我们使用ARM等嵌入式Linux系统时候,一个头疼问题是GPU,Camera,HDMI等都需要预留大量连续内存,这部分内存平时不用,但是一般做法又必须先预留着。...声明连续内存 内核启动过程arch/arm/mm/init.carm_memblock_init()会调用dma_contiguous_reserve(min(arm_dma_limit, arm_lowmem_limit...0 : ret; } 其中函数migrate_pages()会完成页面的迁移,迁移过程通过传入__alloc_contig_migrate_alloc()申请新page,并将老page付给新...接下来要回收page,回收page作用是,不至于因为拿了连续内存后,系统变得内存饥饿: -> /* * Reclaim enough pages to make sure that...内核内存分配migratetype 内核内存分配时候,带标志是GFP_,但是GFP_可以转化为migratetype: static inline int allocflags_to_migratetype

    3.8K20

    Linux系统内核笔记

    ,它指的是系统内核,凡是使用这种内核操作系统都叫作 Linux系统(发行板),严格意义上讲Linux指的是内核,隶属于GNU工程。...UNIX系统、免费开源,而Linux之父就是在参照这款操作 ,才写出第一个版本Linux内核代码 GNU工程:是自由软件基金会所创立一个开源组织,基本原则就是共享,主旨是发展出 一个有别于商业UNIX...… UNIX/Linux系统调用都封装成了C函数形式,但它们并不是标准C一部分 标准库函数绝大部分时间都工作在用户态,但部分时间也需要切换到内核 (进行了系统调用),比如:fread/fwrite.../malloc/free 我们自己所编写代码也可以直接调用系统接口进入内核态(进行系统调用), 比如:brk/sbrk/mmap/munmap 系统调用功能代码存在于内存,接口定义在C库,...因为标准IO使用了缓冲技术,当数据写入时并没有立即把数据交给内核,而是先放 在缓冲区,当缓冲区满时,会一次性把缓冲区数据交给内核写到文件,这样就 减少内核态和用户态切换次数,而系统IO每写一次数据就要进入一次内核

    1.6K20

    Linux 内核 内存管理】内存管理架构 ③ ( Linux 内核内存管理模块 | 页分配器 | 不连续页分配器 | 内存控制组 | 硬件设备内存管理 | MMU | 页表缓存 | 高速缓存 )

    文章目录 一、Linux 内核内存管理模块 二、硬件设备内存管理 一、Linux 内核内存管理模块 ---- Linux 内核还需要处理如下内容 : ① 页错误异常处理 ② 页表管理 ③ 引导内存分配器...: 页分配器 , 块分配器 , 不连续页分配器 , 连续内存分配器 , 每处理器内存分配器 ; " 页分配器 " 负责分配 内存物理页 , 使用是 " 伙伴分配器 " ; " 不连续页分配器 " 提供了...vmalloc 函数 用于分配内存 , vfree 函数 用于 释放内存 ; 申请 " 不连续物理页 “ 可以 映射到 ” 连续虚拟页 " ; ④ 内存碎片整理 ⑤ 内存耗尽处理 ⑥ 内存控制组...回收内存 ; ⑦ 页回收处理 二、硬件设备内存管理 ---- 硬件设备内存管理 : ① CPU 处理器 " 内存管理单元 " ( MMU ) 和 高速缓存 ; ② 物理内存 在 " 内存管理单元..." ( MMU ) , 还有一个 " 页表缓存 " ; 页表缓存 缓存了 最近使用 " 页表映射 “ , 该映射作用是 将 ” 物理地址 " 映射为 " 虚拟地址 " ; CPU 处理器

    1.5K40

    Linux 内核】编译 Linux 内核 ⑦ ( 安装内核模块 | 安装内核 | 重启系统 | 查看当前内核版本 )

    文章目录 一、安装内核模块 二、安装内核 三、重启系统 四、查看当前内核版本 一、安装内核模块 ---- 确保 Linux 内核编译完成 , 没有任何报错之后 ; 参考 【Linux 内核】编译 Linux...内核 ⑥ ( 安装 OpenSSL | 安装其它依赖库 | 内核编译完成 ) 博客 ; 进入 Linux 内核源码根目录 , 执行 sudo make modules_install 命令 , 安装编译好内核模块...; 下面的内核安装过程会持续很长时间 ; 内核安装过程 : root@ubuntu:~# cd kernel/linux-5.6.14 root@ubuntu:~/kernel/linux-5.6.14...-5.6.14# 三、重启系统 ---- 执行 reboot 命令 , 重启 Ubuntu 操作系统 ; 四、查看当前内核版本 ---- 重启之后 , 在命令行终端执行 uname -a 命令 ,...查看当前内核版本 , 发现当前内核版本已经

    16K50

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

    在上篇文章 《深入理解 Linux 物理内存分配全链路实现》 ,笔者为大家详细介绍了 Linux 内存分配在内核整个链路实现: image.png 但是当内核执行到 get_page_from_freelist...那么本文笔者就为大家完整地介绍一下伙伴系统这部分内容,我们将基于内核 5.4 版本源码来详细讨论一下伙伴系统内核设计与实现。 文章概要.png 1....很长时间以来,物理内存碎片一直是 Linux 操作系统弱点,所以内核在 2.6.24 版本引入了以下方式来避免内存碎片。...我们都知道 Linux 管理内存最小单位是 page,每个 page 描述 4K 大小物理内存,但在一些内核使用场景,比如 slab 内存池中,往往会向伙伴系统一次性申请多个普通内存页 page,...伙伴系统内存分配原理" 小节笔者详细为大家介绍了伙伴系统整个内存分配原理,那么在本小节,我们将正式进入伙伴系统,来看下伙伴系统内核是如何实现

    63731

    Linux 内核 内存管理】mmap 系统调用源码分析 ① ( mmap 与 mmap2 系统调用 | Linux 内核 mmap 系统调用源码 )

    文章目录 一、mmap 与 mmap2 系统调用 二、Linux 内核 mmap 系统调用源码 一、mmap 与 mmap2 系统调用 ---- mmap 创建 " 内存映射 " 系统调用 有...2 种实现 , mmap 和 mmap2 ; 2 者区别是 : mmap 偏移单位是 " 字节 " , mmap2 偏移单位是 " 页 " , 但是在 arm 64 体系架构 , 没有实现 mmap2..., 只实现了 mmap 系统调用 ; 二、Linux 内核 mmap 系统调用源码 ---- arm64 架构体系 , 使用 mmap 系统调用 创建 " 内存映射 " , 调用 mmap 系统调用函数..., 执行如下操作 : 先检查 " 偏移 " 是否是 " 内存页大小 " " 整数倍 " , 如果偏移不是内存页大小整数倍 , 返回 -EINVAL 错误 ; 如果偏移是内存页大小整数倍 , 则调用...return sys_mmap_pgoff(a.addr, a.len, a.prot, a.flags, a.fd, a.offset >> PAGE_SHIFT); } 参考路径 : linux

    10.6K40

    Linux系统手动更换内核

    至于linux内核什么时候开始原生支持,网上说法真的是五花八门,很多人文章感觉就是互相抄,连2.6.* 说法都能蹦出来(我怀疑是一些采集站)。...https://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm 安装新内核啦 查看ELRepo仓库下,在当前系统支持内核包 ELRepo...install kernel-ml 更改grub配置 在安装完新 Kernrl 之后,系统是不会帮你切换到新内核,重启也不行,需要我们自己设置,将新内核设置为默认启动选项。...我们可以看到,安装完之后,内核没有切换过去,通过查看得知,新安装内核位于第一个位置,标记为 0。这是我们需要修改/etc/default/grub文件,以便于让系统在启动时让新内核成为默认选项。...注:如果文章超链接没出现,可以点击阅读原文去找超链接!!! ? ---- *版权声明:版权归作者本人所有,尊重原创,推送文章除非无法确认,都会注明作者和来源。

    5.7K10
    领券