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

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

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

1K20

性能优化:B*Tree 索引中的数据分配(五)

数据分配 当索引数据需要分裂时,会从 Freelist 中找到空闲的数据满足分配需要,在10224的跟踪文件中,可以看到以下信息记录了新数据分配: 如果索引数据上的数据被全部删除,该数据就会被放置在...在下一次数据分裂时,从 freelist 上获取到该数据,然后将其从树结构中删除,重新分配到树结构中: HELLODBA.COM> insert into idx_split (a, b, c)...跟踪文件显示了这一数据被回收利用的过程: 需要注意的是,数据被放入 freelist 的条件是该数据上的实际记录数(rrow)为0,而不是等待删除这些数据的事务提交: 需要注意的是,数据被放入...事务未提交,但从跟踪文件可以看到数据已经被放到freelist上去了: 如果此时发生分裂,因为该数据在 freelist 的前列,因此仍然会被获取到,但是,由于其上面的事务并未提交,所以不会被分配:...,此时如果有正好属于该数据在树中位置的数据被插入,数据仍然会被写入该数据上,但并不从freelist上移走: 跟踪内容如下: 此时如果发生分裂,该数据仍然会被获得,但是分配失败,此时,它才会被从

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

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

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

    7K50

    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.

    35520

    Linux LVM分区的创建、分配

    许多Linux使用者安装操作系统时都会遇到这样的困境:如何精确评估和分配各个硬盘分区的容量,如果当初评估不准确,一旦系统分区不够用时可能不得不备份、删除相关数据,甚至被迫重新规划分区并重装操作系统,以满足应用系统的需要...LVM是Linux环境中对磁盘分区进行管理的一种机制,是建立在硬盘和分区之上、文件系统之下的一个逻辑层,可提高磁盘分区管理的灵活性。...三、当卷组不够用的情况下,如何扩大卷组 重新从第二硬盘上创建一个分区sdb3,具体操作步骤省略。并将创建好的分区加入到已经存在的卷组vgdata中。通过pvs命令查看是否成功。...五、如果某一磁盘或者分区故障了如何将数据快速转移到相同的卷组其他的空间去。 1、通过pvmove命令转移空间数据 2、通过vgreduce命令将即将坏的磁盘或者分区从卷组vgdata里面移除除去。...修改成普通Linux分区即可。 总结:LVM逻辑卷是Linux里面一个很棒的空间使用机制,因为分区在没有格式化的情况下是没有办法加大或者放小的。通过LVM可以将你的磁盘空间做到灵活自如。

    6.6K20

    技术干货 | 漫游LinuxIO

    本篇文章,我们就一起看下Linux中一个IO请求的生命周期。Linux发展到今天,其内部的IO子系统已经相当复杂。...我们知道IO设备可以分为字符设备和设备,字符设备以字节流的方式访问数据,比如我们的键盘鼠标。而设备则是以为单位访问数据,并且支持随机访问,典型的设备就是我们常见的机械硬盘和固态硬盘。...虚拟文件系统(VFS) 在Linux中一切皆文件,它提供了虚拟文件系统VFS的机制,用来抽象各种资源,使应用程序无需关心底层细节,只需通过open、read/write、close这几个通用接口便可以管理各种不同的资源....write = do_sync_write, ... ... .open = ext4_file_open, ... ... }; buffer/cache Linux...do_blockdev_direct_IO -> dio_bio_submit -> submit_bio 通用层 核心结构 1.bio/request bio是Linux通用层和底层驱动的

    1.6K30

    Linux】基础IO --- 系统级文件接口、文件描述符表、文件控制、fd分配规则、重定向…

    进程可以打开多个文件,对于大量的被打开文件,操作系统一定是要进行管理的,也就是先描述再组织,所以操作系统会为被打开的文件创建对应的内核数据结构,也就是文件控制FCB,在linux源码中是struct...内存中文件描述符,文件描述符表,文件控制,进程控制的关系如下图所示,文件描述符表,说白了就是一个存储指向文件控制的指针的指针数组,而文件描述符就是这个指针数组的索引,进程控制中会有一个指向文件描述符表的指针...三、文件描述符的分配规则 1.关闭012文件描述符产生的现象(新打开文件的fd被赋值为0或1或2) 1....实际上文件描述符在分配时,会从文件描述符表中的指针数组中,从小到大按照顺序找最小的且没有被占用的fd来进行分配,自然而然关闭0时,0对应存储的地址就会由stdin改为新打开的文件的地址,所以打印新的文件的...五、Linux下一切皆文件 1.

    1.2K30

    Linux 内存分配流程及 kmalloc 解析

    手把手教你分析 Linux 启动流程 上一次咱们分析了 Linux 的启动流程和初始化流程,今天主要分析一下内存方面的初始化和常见的内存分配方式。...start_kernel |--->mm_init |--->mem_init linux4.14/init/main.c 在 mem_init 函数中会初始化伙伴系统和 slab...2、有的人可能知道 Linux 有一个 bootmem 分配器,这个是在Linux初始化过程中的一个临时分配器,他会在 setup_arch 函数中初始化,然后在 mm_init 中关掉,只是在伙伴系统出现之前的临时使用...bootmem 分配器按进行分配,颗粒度很大,不够精细,比较浪费内存。bootmem 分配器只会在 start_kernel 函数和mm_init 函数之前存在,中间的函数会调用它进行内存分配。...bootmem_init ·················· END ·················· 点击关注公众号,免费领学习资料 欢迎大家关注我的微信公众号,定期给大家分享 C 语言、单片机、嵌入式 Linux

    2.7K11

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

    文章目录 一、memblock_type 内存类型 二、memblock_type 结构体成员分析 1、cnt 成员 2、max 成员 3、total_size 成员 4、regions 成员 5、...name 成员 一、memblock_type 内存类型 ---- memblock 分配器 涉及到 内存 类型 , 在 Linux 内核中 , 使用 struct memblock_type 结构体...描述 , struct memblock_type 结构体 定义在 Linux 内核源码的 linux-4.12\include\linux\memblock.h#40 位置 ; struct memblock_type...最大个数 ; unsigned long max; /* size of the allocated array */ 3、total_size 成员 total_size 成员 表示 当前 所有内存...regions 成员 regions 成员 表示 的指针 指向 " 执行内存区域 " ; struct memblock_region *regions; 5、name 成员 name 成员 表示 " 内存类型

    30420

    Linux分区页框分配

    分区页框分配器 页框分配在内核里的机制我们叫做分区页框分配器(zoned page frame allocator),在linux系统中,分区页框分配器管理着所有物理内存,无论你是内核还是进程,都需要请求分区页框分配器...:请求分配到可恢复页面; __GFP_HIGH:高优先级处理请求; __GFP_IO:请求在分配期间进行 I/O 操作; __GFP_FS:请求在分配期间进行文件系统调用; __GFP_ZERO:请求将分配的区域初始化为......... } 在页面分配时,有两种路径可以选择,如果在快速路径中分配成功了,则直接返回分配的页面;快速路径分配失败则选择慢速路径来进行分配。...总结如下: 正常分配(或叫快速分配): 如果分配的是单个页面,考虑从per CPU缓存中分配空间,如果缓存中没有页面,从伙伴系统中提取页面做补充。...分配多个页面时,从指定类型中分配,如果指定类型中没有足够的页面,从备用类型链表中分配。最后会试探保留类型链表。

    1.5K30

    Linux内存管理 - slab分配

    Linux内存管理是一个非常复杂的子系统,要完全说清的话估计要一本书的篇幅。但Linux内存管理可以划分成多个部分来阐述,这篇文章主要介绍slab算法。...Linux有个叫伙伴系统的分配算法,这个算法主要解决分配连续个内存页的问题。...伙伴分配算法主要以内存页(4KB)作为分配单位,就是说伙伴分配算法每次可以分配 2order 个内存页(order为0、1、2...9)。...但有时候我们只需要申请一个很小的内存区(如32字节),这时候使用伙伴分配算法就显得浪费了。为了解决小内存分配问题,Linux使用了slab分配算法。...在系统初始化的时候,slab分配器还没有初始化,所以并不能使用slab分配器来分配一个kmem_cache_t对象,这时候只能通过定义一个kmem_cache_t类型的静态变量来来管理slab分配器了,

    2.4K51
    领券