伙伴系统分配内存大小要求为2的幂指数页,这同样导致内部碎片伙伴系统基本原理为使用双链表管理内存,此方案在近几年表现良好,但对Linux内存管理存在长期问题系统运行时间越长,物理内存碎片越多这一问题在下图中直观体现在左图中,无法映射大于一页的内存区在右图中,连续分配较大内存时,碎片;SLAB描述符中的freelist和填充区域的优化,以及对象地址的着色设计,都是提高内存利用率的重要手段内存着色通过添加偏移量避免同一行内存冲突,提升了性能本地CPU和共享链表的组合,形成了SLAB分配器的高效运作框架,优先级分配原则保证了快速响应了解这些细节后,我们发现SLAB分配器是Linux内核内存管理的。
此外,内存管理也需要考虑是否需要使用缓存,使用缓存会减少内存访问,提高内存使用效率但是,如果使用缓存时,分配的内存空间也将进行内存分区对齐,以保证在缓存中存储的数据的完整性以上就是关于Linux内存管理分区对齐之美的一些介绍,Linux系统在内存管理采用端面分区算法,可以自动对齐内存为4K或2M等;在设备驱动程序或内核模块中进行动态内存分配时,通常使用 kmalloc 和 vmalloc 函数而非 mallockmalloc 和 vmalloc 分配的内存类型和使用方式存在显著差异kmalloc 用于从物理上连续的低端内存区域分配小块一般不超过 128k内存,分配的内存地址为物理连续的线性地址,适合于需要连续内存以进行直接内存访问;在AARCH64架构的Linux内核5140rc5版本中,内存管理策略转向了非一致性内存访问NUMA以提高性能NUMA架构将内存划分为多个节点,每个CPU优先访问与其绑定的最近节点,以减少访问延迟内存节点通过唯一的节点id标识,且不同节点的物理地址不连续,节点间距离和访问速度有关当本地节点内存不足时;前情回顾 本文将深入探讨 Linux 内存管理机制中的 slabslob 和 slub 介绍在前文中,我们已经学习了伙伴系统的运作原理以及内存碎片整理回收机制在描述伙伴系统时,我们提及了为了解决小内存申请导致的浪费问题,内核设计了另外一套机制,这就是我们今天要介绍的 slabslob 和 slubslab 数据结构。
31 一致性DMA接口支持分配大块和小块DMA缓冲区,其中小块可通过dma poll机制申请32 流式DMA接口涉及page映射错误处理scatterlist映射以及sync操作等想深入了解Linux内核内存管理的DMA技术,可以参考反光博主的文章,原文链接博客园guangplinux_DMA_;为什么要使用bootmem分配器,内存管理不是有buddy系统和slab分配器吗由于在系统初始化的时候需要执行一些内存管理,内存分配的任务,这个时候buddy系统,slab分配器等并没有被初始化好,此时就引入了一种内存管理器bootmem分配器在系统初始化的时候进行内存管理与分配,当buddy系统和slab分配器初始化好后。
页框分配接口如alloc_pages和回收接口如free_pages通过一系列函数实现,包括__alloc_pages和free_pages_bulk等伙伴系统的关键函数有__rmqueue和free_hot_page等了解这些细节有助于深入理解Linux内核的内存管理机制如果你想进一步学习,推荐加入Linux内核技术交流群和查阅相关文档,如深入理解linux内核。
发表评论
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。