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

Linux内存管理 - slab分配器

Linux内存管理一个非常复杂的子系统,要完全说清的话估计要一本书的篇幅。但Linux内存管理可以划分成多个部分来阐述,这篇文章主要介绍slab算法。...Linux有个叫伙伴系统的分配算法,这个算法主要解决分配连续个内存页的问题。...但有时候我们只需要申请一个很小的内存区(如32字节),这时候使用伙伴分配算法就显得浪费了。为了解决小内存分配问题,Linux使用了slab分配算法。...在kmem_cache_t结构中的slab_free链表的slab内存回收的主要备选对象。由于对象是从slab中分配和释放,所以单个slab可以在slab列表中进行一定。...因为本身kmem_cache_t结构体也是小内存对象,所以也应该有slab分配器来分配的,但这样就出现“鸡蛋和鸡谁先出现”的问题。

2.4K51

启动期间的内存管理之引导分配器bootmem--Linux内存管理(十)

bootmem分配器用于在启动阶段分配内存的,对该分配器的需求集中于简单性方面,而不是性能和通用性. 2....引导内存分配器bootmem概述 由于硬件配置多种多样, 所以在编译时就静态初始化所有的内核存储结构不现实的. bootmem分配器系统启动初期的内存分配方式,在耳熟能详的伙伴系统建立前内存都是利用...因此在系统启动过程期间, 内核使用了一个额外的简化形式的内存管理模块引导内存分配器(boot memory allocator–bootmem分配器), 用于在启动阶段早期分配内存, 而在系统初始化完成后...系统从start_kernel开始启动的, 在启动过程中通过调用体系结构相关的setup_arch函数, 来获取初始化引导内存分配器所需的参数信息, 各种体系结构都有对应的函数来获取这些信息, 在获取信息完成后...bootmem分配器的初始化一个特定于体系结构的过程, 此外还取决于系统的内存布局 系统从start_kernel开始启动的, 在启动过程中通过调用体系结构相关的setup_arch函数, 来获取初始化引导内存分配器所需的参数信息

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

    linux内存源码分析 - SLAB分配器概述

    之前说了管理区页框分配器,这里我们简称为页框分配器,在页框分配器中主要是管理物理内存,将物理内存的页框分配给申请者,而且我们知道也可页框大小为4K(也可设置为4M),这时候就会有个问题,如果我只需要1KB...大小的内存,页框分配器也不得不分配一个4KB的页框给申请者,这样就会有3KB被白白浪费掉了。...为了应对这种情况,在页框分配器上一层又做了一层SLAB层,SLAB分配器的作用就是从页框分配器中拿出一些页框,专门把这些页框拆分成一小块一小块的小内存,当申请者申请的内存时,系统就会从SLAB中获取一小块分配给申请者...如果看了我linux内存源码分析 - 页框分配器的朋友,或许可以联系起来了。SLAB就是一组连续的页框,它的描述符结合在页描述符中,也就是页描述符描述SLAB的时候,就是SLAB描述符。...我们用一幅图可以很清楚看出freelist如何实现: ?

    2K40

    Linux 内核 内存管理】引导内存分配器 bootmem ① ( 引导内存分配器 bootmem 工作机制 | 引导内存分配器 bootmem 的描述 bootmem_data 结构体 )

    文章目录 一、引导内存分配器 bootmem 简介 1、引导内存分配器 bootmem 引入 2、引导内存分配器 bootmem 工作机制 二、引导内存分配器 bootmem 描述 bootmem_data...结构体 一、引导内存分配器 bootmem 简介 ---- 1、引导内存分配器 bootmem 引入 Linux 内核 初始化 时 , 需要进行内存分配 , 启动阶段的 内存分配 与 运行时的 内存分配...机制不同 ; 此时 Linux 内核 提供了一个 临时的 " 引导内存分配器 bootmem " , 该 内存分配器 只在启动过程中使用 , 启动完成后 , 就会被丢弃 ; 2、引导内存分配器 bootmem...工作机制 " 引导内存分配器 bootmem " 工作机制如下 : Linux 内核初始化过程中 , 临时提供一个 " 引导内存分配器 bootmem " , 引导内存分配器 bootmem 的主要作用是...bootmem 描述 bootmem_data 结构体 ---- 在 Linux 内核中 , 使用 struct bootmem_data 结构体 , 描述 " 引导内存分配器 bootmem " ;

    59730

    Linux 如何管理内存的?

    内存管理如何实现的。...数据段部分的初始化需要编译就期确定的常量以及程序启动就需要一个初始值的变量。所有 BSS 部分中的变量在加载后被初始化为 0 。...当程序启动时,栈区域并不是空的,相反,它会包含所有的 shell 环境变量以及为了调用它而向 shell 输入的命令行。...Linux 内存管理实现 内存管理系统操作系统最重要的部分之一。从计算机早期开始,我们实际使用的内存都要比系统中实际存在的内存多。...下面我们就正式探讨一下什么 虚拟内存 虚拟内存的抽象模型 在考虑 Linux 用于支持虚拟内存的方法之前,考虑一个不会被太多细节困扰的抽象模型很有用的。

    2.3K20

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

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

    1K20

    Linux 内核 内存管理】memblock 分配器 ① ( memblock 分配器简介 | memblock 结构体成员分析 | 物理内存类型 与 内存类型 )

    文章目录 一、memblock 分配器 二、memblock 结构体分析 1、bottom_up 成员 2、current_limit 成员 3、memory 成员 4、reserved 成员 5、physmem...成员 三、物理内存类型 与 内存类型 ARM64 架构体系中 , 不能使用 bootmem 引导内存分配器 , 使用的 memblock 分配器 ; 一、memblock 分配器 ---- memblock...分配器 定义在 Linux 内核源码的 linux-4.12\include\linux\memblock.h#48 位置 ; struct memblock { bool bottom_up;...-4.12\include\linux\memblock.h#48 二、memblock 结构体分析 ---- 1、bottom_up 成员 bottom_up 成员表示 内存分配方式 , TRUE...: 在 内核 引导启动时 , 只能使用 mem 内核参数 指定可用内存大小范围 , 该范围之外的内存不可使用 , 即内核无法使用所有的内存 ; 物理类型 : 包含所有的内存范围 ;

    86430

    Linux页框分配器内存碎片化整理

    页框分配器在慢速分配中包括内存碎片化整理和内存回收,代码如下: static inline struct page * __alloc_pages_slowpath(gfp_t gfp_mask, unsigned...什么内存碎片化 Linux物理内存碎片化包括两种:内部碎片化和外部碎片化。 内部碎片化: 指分配给用户的内存空间中未被使用的部分。...例如进程需要使用3K bytes物理内存,于是向系统申请了大小等于3Kbytes的内存,但是由于Linux内核伙伴系统算法最小颗粒4K bytes,所以分配的4Kbytes内存,那么其中1K bytes...外部碎片化: 指系统中无法利用的小内存块。例如系统剩余内存为16K bytes,但是这16K bytes内存由4个4K bytes的页面组成,即16K内存物理页帧号#1不连续。...碎片化整理算法 Linux内存对碎片化的整理算法主要应用了内核的页面迁移机制,一种将可移动页面进行迁移后腾出连续物理内存的方法。 假设存在一个非常小的内存域如下: ?

    2.7K20

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

    在我们使用ARM等嵌入式Linux系统的时候,一个头疼的问题GPU,Camera,HDMI等都需要预留大量连续内存,这部分内存平时不用,但是一般的做法又必须先预留着。...通过这套机制,我们可以做到不预留内存,这些内存平时可用的,只有当需要的时候才被分配给Camera,HDMI等设备。下面分析它的基本代码流程。 1....声明连续内存 内核启动过程中arch/arm/mm/init.c中的arm_memblock_init()会调用dma_contiguous_reserve(min(arm_dma_limit, arm_lowmem_limit...err:         pr_err("CMA: failed to reserve %ld MiB\n", size / SZ_1M);         return base; } 由此可见,连续内存区域也是在内核启动的早期...内核内存分配的migratetype 内核内存分配的时候,带的标志GFP_,但是GFP_可以转化为migratetype: static inline int allocflags_to_migratetype

    3.8K20

    Linux 内核 内存管理】引导内存分配器 bootmem ③ ( bootmem 引导内存分配器算法 | 低端内存映射 | 内存记录位图 | 最先适配算法 | 内存分配记录 | 内存操作函数 )

    文章目录 一、bootmem 引导内存分配器算法 1、低端内存映射 2、内存记录位图 3、最先适配算法 4、内存分配记录 二、bootmem 引导内存分配器 内存操作 函数 ( alloc_bootmem...| free_bootmem ) 一、bootmem 引导内存分配器算法 ---- bootmem 引导内存分配器算法 ; 1、低端内存映射 低端内存映射 : 内核启动过程中 , 将 " 低端内存 "...交给 " 引导内存分配器 " 管理 , 低端内存 可以 直接映射到 内核虚拟地址空间 对应的 物理内存 ; 2、内存记录位图 内存记录位图 : 引导内存分配器 中 , 使用 " 位图 " 记录 物理页..." 位图 " , 找到 满足 内存需求大小 的 第一块 空闲的内存块 ; 4、内存分配记录 内存分配记录 : 为了有效利用内存 , " 引导内存分配器 " 支持小于 1 页的内存块分配 , bootmem_data...直接在该 物理页 上分配内存 ; 二、bootmem 引导内存分配器 内存操作 函数 ( alloc_bootmem | free_bootmem ) ---- " bootmem 引导内存分配器 "

    3.3K10

    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..., linux-4.12\arch\arm64\mm\init.c#362 位置的 void __init arm64_memblock_init(void) 函数 , 该函数 初始化 memblock...分配器的核心函数 ; ARM64 体系架构下 Linux 内核初始化 memblock 分配器流程 : ① 解析 " 设备树二进制文件 " /memory 节点 , 将 " 所有物理内存 " 纳入到...memblock 分配器 管理之下 ; 该步骤对应的 Linux 源代码linux-4.12\arch\arm64\mm\init.c#367 位置 ; /* Handle linux,usable-memory-range

    96110

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

    文章目录 一、Linux 内核中的内存管理模块 二、硬件设备内存管理 一、Linux 内核中的内存管理模块 ---- Linux 内核还需要处理如下内容 : ① 页错误异常处理 ② 页表管理 ③ 引导内存分配器...: 页分配器 , 块分配器 , 不连续页分配器 , 连续内存分配器 , 每处理器内存分配器 ; " 页分配器 " 负责分配 内存物理页 , 使用的 " 伙伴分配器 " ; " 不连续页分配器 " 提供了...vmalloc 函数 用于分配内存 , vfree 函数 用于 释放内存 ; 申请的 " 不连续物理页 “ 可以 映射到 ” 连续的虚拟页 " ; ④ 内存碎片整理 ⑤ 内存耗尽处理 ⑥ 内存控制组...: 控制管理 被 进程 占用的 内存 ; 碎片整理 : 如果 " 内存碎片化 " 严重 , 没有连续物理页 , 需要通过 整理内存碎片 并迁移数据 得到 连续的 物理页 ; 内存回收 : 内存不足时 ,...回收内存 ; ⑦ 页回收处理 二、硬件设备内存管理 ---- 硬件设备内存管理 : ① CPU 处理器 中的 " 内存管理单元 " ( MMU ) 和 高速缓存 ; ② 物理内存 在 " 内存管理单元

    1.5K40

    Linux 内核 内存管理】memblock 分配器 ③ ( memblock_region 内存块区域 | memblock_region 结构体成员分析 | memblock 分配器标志位 )

    分配器标志枚举 1、MEMBLOCK_NONE 2、MEMBLOCK_HOTPLUG 3、MEMBLOCK_MIRROR 4、MEMBLOCK_NOMAP 一、memblock_region 内存块区域...---- memblock 分配器 中 , 内存块区域 使用 struct memblock_region 结构体进行描述 , 该结构体定义在 Linux 内核源码的 linux-4.12\include...-4.12\include\linux\memblock.h#31 二、memblock_region 结构体成员分析 ---- 1、base 成员 base 成员 表示 " 内存块区域 " 的起始地址..." 的节点编号 ; #ifdef CONFIG_HAVE_MEMBLOCK_NODE_MAP int nid; #endif 三、memblock 分配器标志枚举 ---- memblock 分配器标志一个枚举类型..., 该 枚举 定义在 Linux 内核源码的 linux-4.12\include\linux\memblock.h#23 位置 ; /* Definition of memblock flags.

    37620

    Confluence 7 如何修改启动内存

    和 Java 有关的项目通常和内存都有关。 最近我们的 Confluence 平台经常挂起,通常的原因可能内存溢出。在对 Confluence 进行调整之前,需要先查看下内存的配置情况。...内存信息 在 Confluence 中,你可以查看当前 Confluence 实例分配了多少内存。...从上面的图片上,我们可以看到当前的内存使用的 1024MB,这个内存的分配对 Confluence 有点小。 调整内存 例如现在我们希望将内存调整到使用 16GB。...CATALINA_OPTS="-Xms1024m -Xmx1024m ${CATALINA_OPTS}" 修改为 CATALINA_OPTS="-Xms16g -Xmx16g ${CATALINA_OPTS}" 在这里可以使用...校验内存修改 进入第一步中提示的的路径,检查内存配置是否生效。 如上图显示的,内存配置已经生效了。 https://www.ossez.com/t/confluence-7/13622

    1.1K20

    Linux 内核 内存管理】memblock 分配器 ② ( memblock_type 内存块类型 | memblock_type 结构体成员分析 )

    name 成员 一、memblock_type 内存块类型 ---- memblock 分配器 涉及到 内存块 类型 , 在 Linux 内核中 , 使用 struct memblock_type 结构体...描述 , struct memblock_type 结构体 定义在 Linux 内核源码的 linux-4.12\include\linux\memblock.h#40 位置 ; struct memblock_type...phys_addr_t total_size; /* size of all regions */ struct memblock_region *regions; char *name; }; 源码路径 : linux...-4.12\include\linux\memblock.h#40 二、memblock_type 结构体成员分析 ---- memblock_type 结构体成员分析 : 1、cnt 成员 cnt...成员 表示 当前 管理的 " 内存区域 " 个数 ; unsigned long cnt; /* number of regions */ 2、max 成员 max 成员 表示 当前 管理的 " 内存区域

    31520

    Linux如何调试内存泄漏

    内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存。...内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。...我们平时开发过程中不可避免的会遇到内存泄漏问题,你如何排查的呢?估计你使用下面这几个工具吧?...gcc自带,4.8以上版本都可以使用,支持Linux、OS、Android等多种平台,不止可以检测内存泄漏,它其实是一个内存错误检测工具,可以检测的问题有: 内存泄漏 堆栈和全局内存越界访问 free后继续使用...ABORTING 注意:这里在运行程序前需要添加环境变量: ASAN_OPTIONS=check_initialization_order=true:strict_init_order=true 小总结 ASan个很好的检测内存问题的工具

    6.5K20

    dubbo provider如何启动

    由于开发者目前使用dubbo几乎都是基于Netty4的,因此下面的分析就以netty4的NettyServer为例,dubbo启动过程中会调用 NettyServer#doOpen 初始化和启动netty...这里主要操作就是初始化 bossGroup 和 workerGroup,然后进行bind、设置channelHandler,一个标准的netty初始化启动流程,具体代码如下: protected void...getBindAddress()); channelFuture.syncUninterruptibly(); channel = channelFuture.channel(); } dubbo启动...从上述dubbo启动netty的初始化代码来看,当consumer发出的请求达到provider时,首先要经过解码器InternalDecoder,注意这个解码器只是简单的转发作用,实际上解码工作靠具体协议对应的解码器的...MultiMessageHandler:提供了针对多请求的处理能力; HeartbeatHandler:针对心跳请求的处理逻辑,如果心跳请求,则更新心跳时间戳,然后直接返回,这时不会传递个接下来的处理器的

    38720

    CPU如何访问内存的?

    内存管理可以说是一个比较难学的模块,之所以比较难学。一内存管理涉及到硬件的实现原理和软件的复杂算法,二网上关于内存管理的解释有太多错误的解释。...希望可以做个内存管理的系列,从硬件实现到底层内存分配算法,再从内核分配算法到应用程序内存划分,一直到内存和硬盘如何交互等,彻底理解内存管理的整个脉络框架。本节主要讲解硬件原理和分页管理。...CPU通过MMU访问内存 我们先来看一张图: ? 从图中可以清晰地看出,CPU、MMU、DDR 这三部分在硬件上如何分布的。...所以搞懂了 MMU 如何把虚拟地址转化为物理地址也就明白了 CPU 如何通过 MMU 来访问内存的。...其中p1用来访问外部页表的索引,而p2外部页表的页偏移。 ? ?

    2.5K60
    领券