当前位置:首页 > 内存 > 正文

linux内存分配机制原理(Linux 内存分配实验)

  • 内存
  • 2024-06-09 21:30:18
  • 5411

一、linux内核内存管理学习(物理内存管理--伙伴系统)

Linux内核的核心内存管理技术之一是孪生系统,它通过智能排列内存块来实现高效、连续的内存分配。伙伴系统的核心是将一块内存划分为大小相等的伙伴,这些伙伴满足连续、大小相同、来自同一原始块的要求。基本原理是基于分配和释放2的幂,通过遍历空闲链表寻找合适的伙伴来实现内存合并。


在Linux内核的实现中,structpage结构扮演着重要的角色。它存储有关每个物理页及其所属区域的信息,而free_area负责管理链接页。空闲内存块列表。内存区域的组织如,通过空闲链表连接,保证了内存分配的效率和灵活性。


虽然匹配系统有助于减少内存碎片,但内核采用了反碎片策略,将页面分为不可移动(MIGRATE_UNMOVABLE)、可回收(MIGRATE_RECLAIMABLE)页面和移动(MIGRATE_MOVABLE)页面。。第三类。分配存时,系统首先尝试对应的内存类型。当检测到内存不足时,会按照预定义的回退顺序进行调整。__GFP_MOVABLE和__GFP_RECLAIMABLE标志分别用于标识这两种类型的内存请求。


虚拟内存管理通过kernelcore和movingcore参数划分固定内存区域和移动内存区域,进一步完善了该策略。默认情况下,所有页面在初始时都是可移动的,但管理员可以根据需要进行调整。find_zone_movable_pfns_for_nodes等核心代码通过计算require_kernelcore来处理内存分区,保证内存分配合理、均衡。


free_area_init_core函数负责初始化内存区域,包括内存页数、内存页总数、缓存管理等。分配器API(例如alloc_page和free_page)通过gfp_mask参数灵活控制内存分配行为,例如__GFP_DMA、__GFP_HIGHMEM和__GFP_MOVABLE,以及用于创建复合页的行为修饰符(例如__GFP_COMP)。


主要内存分配函数__alloc_pages和alloc_pages_node通过get_page_from_freelist和buffered_rmqueue处理请求。在分配过程中,会考虑内存分配标志、优先级和压缩来优化内存使用。__rmqueue_smallest和__rmqueue_fallback确保内存分配避免碎片。


在本文中,我们仅描述匹配系统和内存管理的高级概念,以及复合页面管理、机制映射和发布等深入细节,如下所示以及高级功能。描述中对内存映射策略进行了简化。要了解更多Linux内核精彩的内存管理特性,可以参考相关课程和教程,例如:



二、Linux内核:内存管理——Slab分配器Linux内核详解:内存管理技术-SLAB分配器
内存管理是Linux内核世界中的一项重要任务。其中,SLAB分配器发挥了重要作用,解决了页框分配器中大量页框浪费的问题,并通过专用SLAB(如TCP)和常规SLAB(如kmalloc-8、kmalloc)的实现。-16等)内存管理。您可以通过运行“cat/proc/slabinfo”来监控SLAB执行状态。
SLAB的一个核心概念是对象大小固定,减少内存碎片,提高内存使用效率。kmem_cache(SLAB缓存)是其顶层数据结构,负责描述和管理SLAB及其对象。内核模块通过kmem_cache_create的定制SLAB来保证内存管理的灵活性。
在kmem_cache结构体中,对象大小(object_size)与SLAB的全局配置(例如gfporder和num)同步。每个NUMA节点的SLAB管理负责structkmem_cache_node数组,该数组支持分布式内存管理并确保内存的平衡分配。
kmem_cache内部结构的重要组成部分是SLAB链表,例如slabs_partial、slabs_full和slabs_free。labs_partial存储部分使用的SLAB描述符,slabs_full是所有对象的链表,slabs_free记录空闲的SLAB。这些链表通过spinlock_tlock进行同步,保证分配和回收时的线程安全。
SLAB巧妙地设计结合了计数器、活动对象和动态链表来实现高效的内存分配,包括我的SLUB(SimpleLowOverheadBuffering)和SLOB(SimplifiedLowOverheadBuffering)结构。SLAB描述符还包括页标志、对象地址指针和空闲对象列表。这些详细信息反映在CONFIG_SLUB配置中。
优化SLAB描述符的空闲列表和填充空间,以及设计对象地址的着色都是提高内存利用率的重要手段。内存着色通过添加偏移量以避免同一行上的内存争用来提高性能。本地CPU和共享链表的结合构成了SLAB分配器的高效工作框架,优先分配原则保证了快速响应。
了解这些细节后,您将认识到SLAB分配器是Linux内核内存管理的本质,并且在内存分配和回收过程中提供了效率和灵活性之间的良好平衡。通过深入挖掘这些内部机制,您可以更好地理解和优化系统内存使用情况。
[推荐阅读]
文件系统详解
进程管理:实时调度
内核内存管理-缺页异常&brk系统调用
原作者:tolimit
原文地址:Linux内存源码分析-SLAB分配器概述---
经过上述的改进和重构,文章的内容变得更加清晰,阐述了SLAB分配器在重点介绍了Linux内核内存管理的详细信息。为读者提供了解内存管理的详细信息。