内存管理笔记:slab、伙伴系统与NUMA理解

需积分: 1 0 下载量 151 浏览量 更新于2024-07-25 收藏 402KB PDF 举报
"内存管理笔记" 内存管理是操作系统的核心组件之一,主要负责为进程分配和回收内存,确保系统的高效运行。本笔记主要讨论了内存管理中的两种重要技术:伙伴系统和slab分配器,以及如何解决内外部分片问题。此外,还介绍了NUMA和UMA两种不同的内存访问架构。 伙伴系统是一种内存分配策略,其目标是优化内存的分配和回收,以减少内存碎片。它将内存块按照大小分成不同的组,并保证每个组内的块大小是2的幂。当需要分配内存时,系统会寻找最接近请求大小的块,并拆分或合并现有块以满足需求。这种方法能有效减轻外部分片,即无法分配大块连续内存的问题,但并不能完全消除内部分片,即分配给进程的内存比实际需要的多。 slab分配器则针对内部分片问题,它预先在每个页面中创建多个相同大小的对象池,使得小块内存可以独立分配而不会造成大量浪费。slab将内存页面划分为多个slabs,每个slab维护着一组相同大小的对象。这种技术提高了内存的使用效率,尤其适用于频繁创建和销毁的小对象。 外部分片的解决方法是通过虚拟内存机制,如同用户空间的内存映射。Linux内核采用这种方式,通过vmalloc函数在内核地址空间中分配虚拟内存,这些虚拟地址可以映射到物理内存的分散页上。这样,即使物理内存不连续,内核也可以视其为连续,从而有效地避免了外部分片。然而,vmalloc操作涉及到内核页表的更新,因此在分配效率上比kmalloc低,适合分配大块内存。 NUMA(非一致内存访问)和UMA(一致内存访问)是两种不同的系统架构。在NUMA系统中,每个CPU都有自己的本地内存,访问本地内存速度快,但访问远程CPU的内存则慢,需要通过总线通信。而在UMA系统中,所有CPU共享同一块内存,访问速度一致。在NUMA架构下,内存组织为多个节点(Node),每个节点包含多个Zone和Page,而UMA只有一个Node。 无论是NUMA还是UMA,每个物理页在系统中都有唯一的页帧号,确保了内存的统一编址。理解这些内存管理概念对于优化系统性能和编写高效的内核级代码至关重要。