Linux sab 分配器剖析.pdfVIP

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux sab 分配器剖析

Linux slab 分配器剖析 了解 Linux 内存管理的方式 级别: 中级 M. Tim Jones, 顾问工程师, Emulex 2007 年 6 月 11 日 良好的操作系统性能部分依赖于操作系统有效管理资源的能力。在过去,堆内存管理器是 实际的规范,但是其性能会受到内存碎片和内存回收需求的影响。现在,Linux® 内核使 用了源自于 Solaris 的一种方法,但是这种方法在嵌入式系统中已经使用了很长时间了, 它是将内存作为对象按照大小进行分配。本文将探索 slab 分配器背后所采用的思想,并 介绍这种方法提供的接口和用法。 动态内存管理 内存管理的目标是提供一种方法,为实现各种目的而在各个用户之间实现内存共享。内存管理方法应 该实现以下两个功能: 最小化管理内存所需的时间 最大化用于一般应用的可用内存(最小化管理开销) 内存管理实际上是一种关于权衡的零和游戏。您可以开发一种使用少量内存进行管理的算法,但是要 花费更多时间来管理可用内存。也可以开发一个算法来有效地管理内存 但却要使用更多的内存。最 终,特定应用程序的需求将促使对这种权衡作出选择。 每个内存管理器都使用了一种基于堆的分配策略。在这种方法中,大块内存(称为 堆)用来为用户定 义的目的提供内存。当用户需要一块内存时,就请求给自己分配一定大小的内存。堆管理器会查看可 用内存的情况(使用特定算法)并返回一块内存。有哪些信誉好的足球投注网站过程中使用的一些算法有 first-fit (在堆中搜 索到的第一个满足请求的内存块 )和 best-fit (使用堆中满足请求的最合适的内存块)。当用户使用 完内存后,就将内存返回给堆。 这种基于堆的分配策略的根本问题是碎片(fragmentation )。当内存块被分配后,它们会以不同的顺 序在不同的时间返回。这样会在堆中留下一些洞 需要花一些时间才能有效地管理空闲内存。这种算 法通常具有较高的内存使用效率(分配需要的内存),但是却需要花费更多时间来对堆进行管理。 另外一种方法称为 buddy memory allocation ,是一种更快的内存分配技术,它将内存划分为 2 的 幂次方个分区,并使用 best-fit 方法来分配内存请求。当用户释放内存时,就会检查 buddy 块,查看 其相邻的内存块是否也已经被释放。如果是的话 将合并内存块以最小化内存碎片。这个算法的时间 效率更高,但是由于使用 best-fit 方法的缘故,会产生内存浪费。 本文将着重介绍 Linux 内核的内存管理,尤其是 slab 分配提供的机制。 slab 缓存 Linux 所使用的 slab 分配器的基础是 Jeff Bonwick 为 SunOS 操作系统首次引入的一种算法。Jeff 的 分配器是围绕对象缓存进行的。在内核中,会为有限的对象集(例如文件描述符和其他常见结构)分 配大量内存。Jeff 发现对内核中普通对象进行初始化所需的时间超过了对其进行分配和释放所需的时 间。因此他的结论是不应该将内存释放回一个全局的内存池,而是将内存保持为针对特定目而初始化 的状态。例如,如果内存被分配给了一个互斥锁 那么只需在为互斥锁首次分配内存时执行一次互斥 锁初始化函数(mutex_init )即可。后续的内存分配不需要执行这个初始化函数,因为从上次释放 和调用析构之后,它已经处于所需的状态中了。 Linux slab 分配器使用了这种思想和其他一些思想来构建一个在空间和时间上都具有高效性的内存分 配器。 图 1 给出了 slab 结构的高层组织结构。在最高层是 cache_chain,这是一个 slab 缓存的链接列 表。这对于 best-fit 算法非常有用,可以用来查找最适合所需要的分配大小的缓存(遍历列表)。 cache_chain 的每个元素都是一个 kmem_cache 结构的引用(称为一个 cache )。它定义了一个 要管理的给定大小的对象池。 图 1. slab 分配器的主要结构 每个缓存都包含了一个 slabs 列表,这是一段连续的内存块(通常都是页面)。存在 3 种 slab : slabs_full 完全分配的 slab slabs_partial 部分分配的 slab slabs_empty 空 slab ,或者没有对象被分配 注意 slabs_empty 列表中的 slab 是进行回收(reaping )的主要备选对象。正是通过此过 程 slab 所使用的内存被返回给操作系统供其他用户使用。 slab 列表中的每个 slab

文档评论(0)

jixujianchi + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档