首页
学习
活动
专区
圈层
工具
发布

【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 + 1 阶页块 分成 2 个 n 阶页块 , 一块插入 空闲 n 阶页块链表 ; 一块 直接分配 , 如果没有 , 则进入下一步 , 查询 n + 2 阶页块 ; 3、查询

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

    【Linux 内核 内存管理】Linux 内核内存布局 ③ ( Linux 内核 动态分配内存 系统接口函数 | 统计输出 vmalloc 分配的内存 )

    文章目录 一、Linux 内核 动态分配内存 系统接口函数 二、统计输出 vmalloc 分配的内存 一、Linux 内核 动态分配内存 系统接口函数 ---- Linux 内核 " 动态分配内存 "...是通过 " 系统接口 " 实现的 , 下面介绍几个重要的 接口函数 ; ① 以 " 页 " 为单位分配内存 : alloc_pages , __get_free_page ; ② 以 " 字节 " 为单位分配..." 虚拟地址连续的内存块 " : vmalloc ; ③ 以 " 字节 " 为单位分配 " 物理地址连续的内存块 " : kmalloc ; 注意 该 " 物理地址连续的内存块 " 是以 Slab 为中心的...; 二、统计输出 vmalloc 分配的内存 ---- 执行 grep vmalloc /proc/vmallocinfo 命令 , 可以统计输出 通过 vmalloc 函数分配的 " 虚拟地址连续的内存块

    6.3K30

    Linux 内存分配流程及 kmalloc 解析

    手把手教你分析 Linux 启动流程 上一次咱们分析了 Linux 的启动流程和初始化流程,今天主要分析一下内存方面的初始化和常见的内存分配方式。...先说两个概念: 外部碎片:有一段小内存,夹在两个大内存中间,两个大内存已经被分配给进程,这一段小内存由于过小,不够申请者使用,就一直空闲。...3、其实所有的分配方式最底层都是伙伴系统,它先分配好一段大的内存,然后 slab 再从其中分配小的内存。...2、有的人可能知道 Linux 有一个 bootmem 分配器,这个是在Linux初始化过程中的一个临时分配器,他会在 setup_arch 函数中初始化,然后在 mm_init 中关掉,只是在伙伴系统出现之前的临时使用...bootmem 分配器按块进行分配,颗粒度很大,不够精细,比较浪费内存。bootmem 分配器只会在 start_kernel 函数和mm_init 函数之前存在,中间的函数会调用它进行内存分配。

    3.1K11

    Linux内存管理 - slab分配器

    Linux内存管理是一个非常复杂的子系统,要完全说清的话估计要一本书的篇幅。但Linux内存管理可以划分成多个部分来阐述,这篇文章主要介绍slab算法。...Linux有个叫伙伴系统的分配算法,这个算法主要解决分配连续个内存页的问题。...伙伴分配算法主要以内存页(4KB)作为分配单位,就是说伙伴分配算法每次可以分配 2order 个内存页(order为0、1、2...9)。...但有时候我们只需要申请一个很小的内存区(如32字节),这时候使用伙伴分配算法就显得浪费了。为了解决小内存分配问题,Linux使用了slab分配算法。...因为本身kmem_cache_t结构体也是小内存对象,所以也应该有slab分配器来分配的,但这样就出现“鸡蛋和鸡谁先出现”的问题。

    2.9K51

    kmalloc分配物理内存与高端内存映射--Linux内存管理(十八)

    永久内存映射区 该区域可访问高端内存. 访问方法是使用alloc_page(_GFP_HIGHMEM)分配高端内存页或者使用kmap函数将分配到的高端内存映射到该区域....他们定义在tools/virtio/linux/kernel.h?v=4.7, line 46 这两个函数返回一个指向内存块的指针, 其内存块至少要有size大小. 所分配的内存区在物理上是连续的....v=4.7, line 3853 3 分配掩码(gfp_mask标志) 3.1 分配掩码 前述所有函数中强制使用的mask参数,到底是什么语义? 我们知道Linux将内存划分为内存域...., __GFP_DMA32, __GFP_HIGHMEM, __GFP_MOVABLE是在内存中分别有对应的内存域信息, 因此我们定义了内存域的掩码GFP_ZONEMASK, 参见include/linux...那么内存分配可以从该内存域或更低的内存域进行, 该函数定义在include/linux/gfp.h?

    7.2K21

    alloc_page分配内存空间--Linux内存管理(十七)

    Linux内核使用二进制伙伴算法来管理和分配物理内存页面, 该算法由Knowlton设计, 后来Knuth又进行了更深刻的描述....内核如何记住哪些内存块是空闲的 分配空闲页面的方法 影响分配器行为的众多标识位 内存碎片的问题和分配器如何处理碎片 2 内存分配API 2.1 内存分配器API 就伙伴系统的接口而言, NUMA或UMA...相反, 必须指定的是分配阶, 伙伴系统将在内存中分配2^0 rder页 内核中细粒度的分配只能借助于slab分配器(或者slub、slob分配器), 后者基于伙伴系统 内存分配函数 功能 定义 alloc_pages...(mask, order) 分配2^0 rder 页并返回一个struct page的实例,表示分配的内存块的起始页 NUMA-include/linux/gfp.h, line 466 UMA-include...2.2 内存分配API统一到alloc_pages接口 通过使用标志、内存域修饰符和各个分配函数,内核提供了一种非常灵活的内存分配体系.尽管如此, 所有接口函数都可以追溯到一个简单的基本函数(alloc_pages_node

    3.7K11

    Netty内存分配

    这边有个内存碎片的概念,可以介绍下,Linux 中物理内存会被分成若干个 4k 大小的内存页 Page,物理内存的分配和回收都是基于 Page 完成的,内部碎片就是 Page 内部产生的碎片,外部碎片就是各个...SubPage:负责 Page 内的内存分配,假如我们分配的内存大小远小于 Page(8K),直接分配一个 Page 会造成严重的内存浪费,所以需要将 Page 划分为多个相同的子块来进行分配,这里的子块就相当于...内存池的初始阶段线程是没有内存缓存的,所以最开始的内存分配都需要在全局分配区进行分配 无论是 TinySubpagePools 还是 SmallSubpagePools 成员在内存池初始化时是不会预置内存的...执行内存分配,提高内存分配的使用效率。...内存的分配策略 分配内存大于 8k,PoolChunk 中采用的 Page 级别的内存分配策略 假设我们依次申请了 8k、16k、8k 的内存 首先根据分配内存大小计算二叉树所在节点的高度,然后查找对应高度中是否存在可用节点

    1.5K20

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

    文章目录 一、bootmem 引导内存分配器算法 1、低端内存映射 2、内存记录位图 3、最先适配算法 4、内存分配记录 二、bootmem 引导内存分配器 内存操作 函数 ( alloc_bootmem...交给 " 引导内存分配器 " 管理 , 低端内存 可以 直接映射到 内核虚拟地址空间 对应的 物理内存 ; 2、内存记录位图 内存记录位图 : 引导内存分配器 中 , 使用 " 位图 " 记录 物理页..." 位图 " , 找到 满足 内存需求大小 的 第一块 空闲的内存块 ; 4、内存分配记录 内存分配记录 : 为了有效利用内存 , " 引导内存分配器 " 支持小于 1 页的内存块分配 , bootmem_data...表示 上一次分配 内存块 的结束位置 后面的 物理页位置 索引 , 下次分配优先分配该索引 物理页 ; 在下一次分配内存时 , 如果 上次内存分配的物理页 的剩余空间 小于等于 要分配的内存 , 那么...直接在该 物理页 上分配内存 ; 二、bootmem 引导内存分配器 内存操作 函数 ( alloc_bootmem | free_bootmem ) ---- " bootmem 引导内存分配器 "

    3.7K10

    认识 Linux 内存构成:Linux 内存调优之内存分配机制和换页行为认知

    写在前面 博文内容涉及 Linux 中内存分配和换页机制的基本认知 理解不足小伙伴帮忙指正 :),生活加油 99%的焦虑都来自于虚度时间和没有好好做事,所以唯一的解决办法就是行动起来,认真做完事情,战胜焦虑...不要站在原地想象困难,行动永远是改变现状的最佳方式 前面的文章和小伙伴们分享了 Linux 虚拟内存,物理内存,以及页表,TLB,大页认知,今天我们来看看具体的内存分配以及换页行为 内存分配机制和换页行为认知...内存分配机制 前面的博文我们有讲到,Linux 系统中进程内存的使用是通过申请虚拟内存,按需分配物理内存的方式,内存页是内存的基本单位,Linux 一个标准的内存页一般为 4kb, 具体要由 CPU...同时,Linux 提供大页支持,包含标准大页和透明大页,透明大页是内核自动管理,用于合并多个标准内存页,标准大页需要手动预分配连续的物理内存,用于减少页表层级。...❝在Linux系统中,malloc()、free()、realloc()和calloc()是常用的内存分配和释放函数,主要用于动态内存管理。

    58310

    java内存分配

    形式参数是局部变量,局部变量的数据存在于栈内存中。栈内存中的局部变量随着方法的消失而消失。 成员变量存储在堆中的对象里面,由垃圾回收器负责回收。...应用程序在运行中所创建的所有类实例或数组都放在这个堆中,并由应用所有的线程共享.跟C/C++不同,Java中分配堆内存是自动初始化的。...Java中所有对象的存储空间都是在堆中分配的,但是这个对象的引用却是在堆栈中分配,也就是说在建立一个对象时从两个地方都分配内存,在堆中分配的内存实际建立这个对象,而在堆栈中分配的内存只是一个指向这个堆对象的指针...堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。...但缺点是,由于要在运行时动态分配内存,存取速度较慢。   栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。

    2.8K50

    连续内存分配

    为了提高响应速度,内存之中需要驻留多个进程来实现这一性能改进。现在就需要考虑内存分配。 在内存分配之前,我们需要知道内存保护的问题。首先,用户进程之间彼此不能影响,用户进程也不能影响操作系统。...连续内存分配是最简单的一种方法,它主要用于批处理系统。给内存分为固定大小的块。每个块只能容纳一个进程。这样一个个大小不同的内存分块就形成了,当新进程需要内存的时候,系统会为它找一块足够大的孔。...如果孔很大,那么剩余的部分还会作为一个孔,当进程退出的时候,它将释放内存。如果新的孔和旧的孔在一起,那么可以合并它们。但是新进程需要内存的时候,将哪个合适的孔分配给它?...不连续的小孔最终就会无法容纳一个进程,导致产生碎片化的内存。还有一种碎片是内部碎片,一般系统分配的内存是2的次方,而不是你需要多大分配的就刚好是这么大。...这样只要有物理内存就可以为进程分配。主要有两种实现方案分页和分段。它们还可以合并使用。

    2.5K20

    Linux 内存调优之 BPF 分析用户态小内存分配

    写在前面 博文内容为 使用 BPF 工具跟踪 Linux 用户态小内存分配(brk,sbrk) 理解不足小伙伴帮忙指正 :),生活加油 我看远山,远山悲悯 持续分享技术干货,感兴趣小伙伴可以关注下 ^..._^ brk 内存分配简单概述 一般来说,应用程序的数据存放于堆内存中,堆内存通过brk(2)系统调用进行扩展,对于比较常见的 libc 分配器的 malloc 等函数,在内存分配,小内存块使用 brk...分配,一般在空闲列表耗尽时,会上移堆顶指针,扩展虚拟地址空间,对于大块内存,直接调用我们上篇博文讲的 mmap 方式,创建独立的内存段,一般按页对齐,直接映射进程虚拟地址空间。...在Linux中,sbrk(2)是以库函数形式实现的,内部仍然使用 brk(2)系统调用。...,包括堆内存的分配和释放。

    29310

    linux服务器内存

    早上到单位 发现服务器 mysql 服务器停了 然后起来了 查询日志 显示 内存满了 把mysql服务给杀了 linux 服务器如果 内存满了 会自动清理进程 防止服务器挂掉 选择的话 谁占的的内存大...就先杀谁 我的服务器里面 mysql服务占的内存是最大的 所以就把mysql就给杀了 image.png 然后 重启mysql 查询内存 image.png 在这说一下 怎么看linux的内存 举个例子...空闲的内存数: 232M shared 当前已经废弃不用,总是0 buffers Buffer 缓存内存数: 62M cached Page 缓存内存数:421M 关系:total(1002M) = used...所以,以应用来看看,以(-/+ buffers/cache)的free和used为主.所以我们看这个就好了.另外告诉大家一些常识.Linux为了提高磁盘和内存存取效率, Linux做了很多精心的设计,...,拿出一部分硬盘空间来充当内存.硬盘怎么会快过内存.所以我们看linux,只要不用swap的交换空间,就不用担心自己的内存太少.如果常常 swap用很多,可能你就要考虑加物理内存了.这也是linux看内存是否够用的标准哦

    41.9K10

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

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

    2.4K40

    Go 内存管理 -- 内存分配 二

    接上一篇,下面来看看内存分配的初始化、分配等。...初始化 首先会申请一段连续的内存空间以供使用,大小(64位机器上)512M(spans_mapped)+16G(bitmap_mapped)+512G(arena)。...内存分配 针对于不同大小的的对象,go的分配策略是不同的: (0, 16B) 且不包含指针的对象: Tiny分配 (0, 16B) 包含指针的对象:正常分配 [16B, 32KB] : 正常分配...(32KB, -) : 大对象分配 Tiny分配和大对象分配都属于内存管理的优化范畴,这里就仅看正常分配。...go的内存分配非常复杂,中间还有很多GC的细节在里面,一言半语的也说不详细,大家可以对着简单的纲要直接看源码,注释也非常详细,一定要对照上一篇的图来理解go内存管理。

    2.2K30

    数组大小分配(动态内存分配)

    这种分配固定大小内存分配的方法称为静态内存分配。...为了解决这个问题,提出了动态内存分配。所谓动态内存分配是指在程序执行的过程中动态地分配或者回收存储空间的内存分配方法。...动态分配不像数组等静态内存分配方法需要预先申请内存空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。...从以上动、静态内存分配比较可以知道动态内存分配相对于静态内存分配的特点: 不需要预先分配内存空间 分配的空间可以根据程序的需要扩大或缩小 1.如何实现动态内存分配及其管理 要实现根据程序的需要动态分配存储空间...free函数释放已经不用的内存区域。所以有这两个函数就可以实现对内存区域进行动态分配并进行简单的管理了。

    3.5K20
    领券