免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5848 | 回复: 13
打印 上一主题 下一主题

[内存管理] linux中的各种高速缓存如何理解,大家来讨论啊~ [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-06-06 22:08 |只看该作者 |倒序浏览
对于linux中的多种“高速缓存”的概念一直没有弄透,希望和大家探讨.
ulk 3rd

目前的理解:
1. 硬件高速缓存--》就是cache了,没有什么疑问;

2. 内存管理中出现的:
   (1). 每cpu高速缓存;
        放在内存管理区描述符中的pageset字段中;
   (2). 空闲slab对象的本地高速缓存;

   (3). 共享的本地高速缓存;
        问题1:(1), (2), (3)在用途上有什么区别,或者说他们是什么时候起作用的???
   (4). 普通和专用高速缓存;
        专用就是像索引节点高速缓存一类的由内核其他模块使用的高速缓存,而普通就是相对而言的,
        问题2:内核中是不是只有一个普通高速缓存:kmem_cache???
3.  文件系统中讲到的
   (1). 页高速缓存;
        问题3:是不是所有的高速缓存都是从此而来;???       
   (2). 页目录项高速缓存;
   (3). 索引节点高速缓存;
        (2), (3)应该都是属于slab中的专用高速缓存,特定类型对象的高速缓存;
   (4). 缓冲区高速缓存
        逻辑上是磁盘内容,只是在内存中,现在已经不存在,由于效率原因不再单独分配块缓冲区,存放在缓冲区页,属于页高速缓存;


问题4:所有的高速缓存,他们都是从页面高速缓存获取的?它们的获取是否存在一个层次关系?
问题5: 我想知道内存中到底有多少物理页面是用来作为高速缓存的,是否仅仅遍历kmem_cache开始的高速缓存描述符链表就可以呢?

论坛徽章:
0
2 [报告]
发表于 2013-06-06 23:01 |只看该作者
本帖最后由 kitochou 于 2013-06-07 14:25 编辑

请求一个slab对象的高速缓存 的基本过程大致是不是这样?

论坛徽章:
0
3 [报告]
发表于 2013-06-06 23:03 |只看该作者

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
4 [报告]
发表于 2013-06-07 13:30 |只看该作者
回复 3# kitochou
你这个图从哪里弄的? 对大家的误导比较大啊。。。


slab请求的时候,直接从kmem_cache申请。如果slab对象不够,slab会根据之前的配置以page为单位申请内存,然后在将page分割成多个slab。

不要将slab分配与物理内存分配混起来看,这是两个不同层面的东西。

   

论坛徽章:
0
5 [报告]
发表于 2013-06-07 14:27 |只看该作者
本帖最后由 kitochou 于 2013-06-07 14:38 编辑

回复 4# 瀚海书香


    恩,这个图是我自己画的,为了方便和大家讨论。

    可能我没有画好吧。可以倒过来看。

    对于一个slab对象的请求,是不是这样:
    a. 首先考虑在Slab分配器内部解决:
      1. kmem_cache_t.array 本地高速缓存
      2. kmem_cache_t.lists.shared共享本地高速缓存
      3.  slab中的空闲对象;
    b. 如果在slab内部无法解决,那么就考虑进一步沿着箭头方向进一步请求。






论坛徽章:
0
6 [报告]
发表于 2013-06-07 14:56 |只看该作者
重新画了下图

slab.jpg (33.37 KB, 下载次数: 22)

slab

slab

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
7 [报告]
发表于 2013-06-07 17:06 |只看该作者
回复 5# kitochou
   恩,这个图是我自己画的,为了方便和大家讨论。

    可能我没有画好吧。可以倒过来看。

    对于一个slab对象的请求,是不是这样:
    a. 首先考虑在Slab分配器内部解决:
      1. kmem_cache_t.array 本地高速缓存
      2. kmem_cache_t.lists.shared共享本地高速缓存
      3.  slab中的空闲对象;
    b. 如果在slab内部无法解决,那么就考虑进一步沿着箭头方向进一步请求。



流程基本正确。这里以SLES 11sp2的3.0.13内核代码为例,申请slab的流程:
____cache_alloc

1. 如果本地高速缓存 array_cache中有空闲对象,直接分配使用
2. 如果per node的共享本地缓存中有空闲对象,添加到本地高速缓存再分配(transfer_objects)
3. 如果slab中存在空闲对象,填充到本地高速缓存再分配(ac_put_obj)
4. 通过cache_grow申请page来填充slab的free list中,将新分配的一个slab添加到本地高速缓存并分配(ac_get_obj)

   

论坛徽章:
0
8 [报告]
发表于 2013-06-07 17:13 |只看该作者
回复 7# 瀚海书香


    多谢指教啊!
     
    对于主帖里面的问题2,问题5,我还是不是很清楚,请瀚海兄的再指点一二 !!!

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
9 [报告]
发表于 2013-06-07 17:36 |只看该作者
回复 8# kitochou
问题2:内核中是不是只有一个普通高速缓存:kmem_cache???

内核有很多高速缓存,比如skbuff_head_cache, buffer_head,mm_struct等特定用途的slab,也有通用的固定大小的如size-32,size-64,size-128等等。
问题5: 我想知道内存中到底有多少物理页面是用来作为高速缓存的,是否仅仅遍历kmem_cache开始的高速缓存描述符链表就可以呢
/proc/slabinfo

   

论坛徽章:
0
10 [报告]
发表于 2013-06-07 18:09 |只看该作者
回复 9# 瀚海书香


    我知道内核中有很多高速缓存,像你列出的应该都是专用高速缓存,我想问的是 普通高速缓存,也就是用Kmalloc()分配的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP