Linux内存管理(5):SLUB分配器

34 篇文章 0 订阅 ¥299.90 ¥99.00

一、概述

        伙伴系统最大限度地解决了内存管理地外碎片问题,但是对于内碎片问题却无能为力。但内核实际使用内存的时候,却大多是小于一个页的单位。为了解决内核自身使用小块内存的碎片问题,Linux在基于伙伴系统的基础上引入了基于对象(也叫内存区,Memory Area,是一个具有任意大小的以字节为单位的连续内存块)的内存管理(比如传统经典通用的SLAB、适用于嵌入式的SLOB、适用于大规模并行系统的SLUB,这里主要介绍SLUB)。基于对象的内存管理还有一个好处,就是尽量减少直接调用伙伴系统的API,因而对硬件高速缓存更加友好。

        需要注意只能在基于线性映射的物理区域(比如ZONE_DMA、ZONE_NORMAL区)分配内存分配,因为ZONE_HIGHMEN区还没有虚拟地址。

1)核心思想

        它的组织结构可以分为三层:对象object,slab(因为对象有不同的类型所以slab也有不同的类型),快速缓存(Cache,这里的快速缓存是一个纯软件的概念与CPU的硬件高速缓存完全不同。快速缓存也具有不同的类型,所有不同类型的快速缓存组织在一个名为slab_caches的双向链表中)。

        创建的每个快速缓存由多个大块组成,一个大块是一个或多个连续的物理页,每个大块包含多个对象。也就是说它采用了面向对象的思想,基于对象类型管理内存,每种对象

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Linux内存管理中的页面分配器是负责分配和管理物理页面(Page)的一种机制。在内核中,物理页面是以固定大小的块进行管理的,通常被称为页面帧(Page Frame)。页面分配器的主要任务是从可用的物理内存中分配页面帧,并在需要时释放这些页面帧。 Linux中有多种页面分配器,其中最常用的是伙伴系统(Buddy System)。伙伴系统将可用的物理内存划分为不同大小的块,每个块都是2的幂次方大小。当需要分配一块n个页面帧大小的内存时,伙伴系统会找到一个大小为2的幂次方,并且大于等于n的最小块。如果找到的块大于n,则将该块分裂成两个小块,其中一个块将被分配,另一个块将被留作备用。如果找到的块恰好是n,则将该块分配出去。如果没有合适的块可用,则会尝试从内存中释放一些页面帧来获得可用的内存。 伙伴系统的优点是效率高,分配和释放内存的速度都很快。它还可以避免内存碎片的问题,因为它只分配大小为2的幂次方的块,这些块可以非常有效地组合在一起,而不会留下任何碎片。但是,伙伴系统的缺点是它会浪费一些内存。当一个块被分割成两个小块时,其中一个块可能永远不会被使用,从而浪费了一些内存。 除了伙伴系统之外,Linux还提供了其他的页面分配器,如SLABSLUB。这些页面分配器适用于不同的场景,具有不同的优缺点。在实际应用中,应该根据具体的需求选择适合的页面分配器

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张帅峰_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值