Slab算法.pdfVIP

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

Slab 分配机制6.3.3 Slab 分配机制 采用伙伴算法分配内存时,每次至少分配一个页面。但当请求分配的内存大小为几十个字节 或几百个字节时应该如何处理?如何在一个页面中分配小的内存区,小内存区的分配所产生 的内碎片又如何解决? Linux2.0 采用的解决办法是建立了13个空闲区链表,它们的大小从32 字节到132056字节。 从Linux2.2 开始,MM 的开发者采用了一种叫做slab 的分配模式,该模式早在1994 年就被 开发出来,用于Sun Microsystem Solaris 2.4 操作系统中。Slab 的提出主要是基于以下考虑: · 内核对内存区的分配取决于所存放数据的类型。例如,当给用户态进程分配页面时, 内核调用get_free_page()函数,并用0 填充这个页面。 而给内核的数据结构分配页面时,事情没有这么简单,例如,要对数据结构所在的内存进行 初始化、在不用时要收回它们所占用的内存。因此,Slab 中引入了对象这个概念,所谓对象 就是存放一组数据结构的内存区,其方法就是构造或析构函数,构造函数用于初始化数据结 构所在的内存区,而析构函数收回相应的内存区。但为了便于理解,你也可以把对象直接看 作内核的数据结构。为了避免重复初始化对象,Slab 分配模式并不丢弃已分配的对象,而是 释放但把它们依然保留在内存中。当以后又要请求分配同一对象时,就可以从内存获取而不 用进行初始化,这是在Solaris 中引入Slab 的基本思想。 实际上,Linux 中对Slab 分配模式有所改进,它对内存区的处理并不需要进行初始化或回收。 出于效率的考虑,Linux 并不调用对象的构造或析构函数,而是把指向这两个函数的指针都 置为空。Linux 中引入Slab 的主要目的是为了减少对伙伴算法的调用次数。 · 实际上,内核经常反复使用某一内存区。例如,只要内核创建一个新的进程,就要为该进程 相关的数据结构(task_struct、打开文件对象等)分配内存区。当进程结束时,收回这些内 存区。因为进程的创建和撤销非常频繁,因此,Linux 的早期版本把大量的时间花费在反复 分配或回收这些内存区上。从Linux2.2 开始,把那些频繁使用的页面保存在高速缓存中并重 新使用。 · 可以根据对内存区的使用频率来对它分类。对于预期频繁使用的内存区,可以创建一组特定 大小的专用缓冲区进行处理,以避免内碎片的产生。对于较少使用的内存区,可以创建一组 通用缓冲区(如Linux2.0 中所使用的2 的幂次方)来处理,即使这种处理模式产生碎片,也 对整个系统的性能影响不大。 · 硬件高速缓存的使用,又为尽量减少对伙伴算法的调用提供了另一个理由,因为对伙伴算法 的每次调用都会“弄脏”硬件高速缓存,因此,这就增加了对内存的平均访问次数。 Slab 分配模式把对象分组放进缓冲区(尽管英文中使用了Cache 这个词,但实际上指的是内 存中的区域,而不是指硬件高速缓存)。因为缓冲区的组织和管理与硬件高速缓存的命中率密 切相关,因此,Slab 缓冲区并非由各个对象直接构成,而是由一连串的“大块(Slab)”构 成,而每个大块中则包含了若干个同种类型的对象,这些对象或已被分配,或空闲,如图6.12 所示。一般而言,对象分两种,一种是大对象,一种是小对象。所谓小对象,是指在一个页 面中可以容纳下好几个对象的那种。例如,一个inode 结构大约占300 多个字节,因此,一 个页面中可以容纳8 个以上的inode 结构,因此,inode 结构就为小对象。Linux 内核中把小 于512 字节的对象叫做小对象。 缓冲区 slab slab 对象 图6.10 Slab 的组成 实际上,缓冲区就是主存中的一片区域,把这片区域划分为多个块,每块就是一个Slab,每 个Slab 由一个或多个页面组成,每个Slab 中存放的就是对象。 因为Slab 分配模式的实现比较复杂,我们不准备对其进行详细的分析,只对主要内容给予描 述。 1. Slab 的数据结构 Slab 分配模式有两个主要的数据结构,一个是描述缓冲区的结构kmem_cache_t,一个是描述 Slab 的结构kmem_slab_t,下面对这两个结构给予简要讨论: (1)Slab Slab 是Slab 管理模式中最基本的结构。它由一组连续的物理页面组成,对象就被顺序放在 这些页面中。其数据结构在mm/slab.c 中定义如下: /* * slab_t * * Manages the objs in

文档评论(0)

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

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

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档