zoukankan      html  css  js  c++  java
  • Linux2.6为数据结构分配内存slab

    1.高速缓存描述符、slab描述符、数据结构对象之间的关系


    slab描述符也可以在外面

    不管slab描述符在哪里,空闲链接数组紧跟在slab描述符后面

    第一张图跟2.6的不太一样,2.6中,所有箭头都是双向的,且没有不同各种类slab描述符的链接


    建立一个缓冲的专用队列:

    1.从cache_cache中分配一个kmem_cache_t结构的高速缓存描述符

    2.进行一系列计算,以确定最佳的slab构成

    3.设置各种参数

    4.将kmem_cache_t结构链入cache_cache的next队列中


    利用这个专用队列来为这个专用的数据结构分配空间

    1.找到第一个含有空闲对象的slab

    若找到,则分配一个空闲对象给数据结构

    若未找到,则扩充该slab队列


    扩充slab队列

    1.计算下一块slab应有的着色区大小

    2.分配若干连续的物理页面

    3.建立slab的管理信息

    4.设置用于具体对象的页面

    5.将页面构造成slab

    6.链入给定的slab队列


    建立slab的管理信息

    1.大对象--->分配一个slab_t

       小对象--->留出一部分空间作为slab_t

    2.向slab_t写入管理信息


    释放一个数据结构对象

    1.找到对象所在的slab

    2.计算对象在链接数组中的编号

    3.释放对象(只是修改数组指针)


    真正的页面内存的释放,由kswapd定期地调用kmem_cache_reap来完成


    普通高速缓存的管理类似于伙伴系统


    同一数据结构可以有几个slab,组成一个slab队列。

    同一数据结构由于大小相同,不同slab队列的对象很可能会映射到同一高速缓存行中。

    为了提高命中率,同一数据结构的不同slab有不同的着色区,使它们能映射不同行中


  • 相关阅读:
    Spring MVC中的(多)文件上传和下载
    SSM整合案例
    事务的四种隔离级别和七种传播行为
    注解方式实现IOC和AOP
    顾问包装通知
    使用ProxyFactoryBean进行AOP
    动态代理(jdk&cglib)的用法
    英语中12个典型的中国式错误
    翻译:你的声音太小了,可以大一些吗
    今天天气怎么样
  • 原文地址:https://www.cnblogs.com/windmissing/p/2559829.html
Copyright © 2011-2022 走看看