我正在内核代码中进行slab着色,我能够将slab着色与高​​速缓存的使用相关联,如下所示:

假设我们有一个 32 位系统,其中物理地址为 32 位。所以这里的物理地址是 32 位的,这个地址被分成三个不同的部分,即标签、索引和数据。标签、索引和数据的长度由缓存行大小和总缓存内存决定。因此,假设高速缓存的大小为 4MB,每个高速缓存行为 64 字节,那么数据为 6 位(log2(高速缓存行)),索引为 16 位,即表示高速缓存的总位数,即 22位减去数据的位,所以它变成了 16 位。如果位(即 10 位)用于标记,则休息。

缓存内存有不同的行,对于 4MB 的缓存大小和 64 Bytes 的缓存行,它有 65536 个不同的行。每行有两个字段,即标签和数据。数据代表从主存储器获取的数据,标签代表作为上述物理地址一部分的值。

当 CPU 查找内存地址时,它会查找缓存,并在查找时将物理地址分解为三个不同的部分,即标记、索引和数据。索引字段用于标识缓存中的行,在直接寻址缓存中,该索引代表缓存中的行。一旦行被知道,cahce 存储器的 Tag 字段与物理地址的 Tag 字段进行比较,如果匹配,则发生缓存命中,否则发生缓存未命中。

我使用上面的描述来明确我对缓存内存的看法。


在 Linux Kernel 中,一个软件缓存使用多个 Slab,每个 Slab 从 Buddy System 分配一个 Page(至少一页)来分配对象。并且这些由不同slab分配的页面可能位于物理地址的相同索引字段下,并且由于所有slab都将使用相同的缓存行并且会导致性能不佳,因为相同的缓存行用于对象上的对象不同的slab。

让我们看看在上面定义的缓存系统中这是如何发生的:

缓存有 65536 行,每行 64 字节,这意味着行的物理索引为 16 位,缓存数据为 6 位。现在说一个页面大小为 4K 意味着它使用 12 位。所以这意味着它使用了数据的 6 位和索引的 6 位。Index 的其余位 (10) 表示同一个 Index 所容纳的页数,这是什么意思?这意味着索引中的其余位表示将使用相同缓存行或缓存行的页面数,在我们的例子中是 1024,即 2^10。到目前为止,我还没有考虑物理地址的标记位来计算页面数,如果我认为这意味着有 1024*1024 个页面将使用相同的缓存行。

那么这么多页使用同一个Cache行,那么性能如何提升呢?

可以通过对不同slab 上的对象使用不同的Cache Rows 来提高性能。我们知道每个slab从一个物理页面地址开始,可以通过将每个页面上的第一个对象偏移缓存行大小的倍数来完成。如果我们在slab上偏移对象,那么它将使用不同的缓存行。

这是我从 Linux 内核中学到的最大限度地利用缓存行的知识,但我仍然有一个问题,即每个slab上的第一个对象被偏移量取代,因此不同slab的第一个对象使用不同的缓存行。那么它如何有效地提高性能,因为我们只针对第一个对象?我能说第一个对象有重要的信息,即结构体slab_t,这就是尽快访问这些信息的原因吗?

如果我在这里遗漏了什么,请告诉我。


一旦您确定了第一个对象的位置和大小,由于填充,所有其他对象都必须效仿

“颜色”的想法可能来自“彩虹的颜色”。硬件缓存将世界视为一系列重叠的条纹。在这种情况下,slab 分配器有意识地浪费内存,使特定slab 中的条目倾向于占据特定“颜色”的(彩虹)条纹。当涉及 DMA 并且您知道活动将非常快速和激烈时,您基本上会使用它,从而证明浪费内存是合理的。

但是,是的,请不要发布一个类似的问题,然后“开始 yammering for attention”。人们不会在这里闲逛,只是屏住呼吸等待复杂的技术问题出现,他们尤其倾向于跳过没有直接切入要点的帖子。

slab 着色如何最大限度地利用 Cache Lines 或 Cache Rows?相关推荐

  1. java cache框架_java Cache框架

    各类开源的缓存解决方案 JBossCache/TreeCache JBossCache是一个复制的事务处理缓存,它允许你缓存企业级应用数据来更好的改善性能.缓存数据被自动复制,让你轻松进行Jboss服 ...

  2. Elasticsearch搜索引擎之缓存:Request Cache、Query Cache、Fielddata Cache

    ElasticSearch 查询需要占用 CPU.内存资源,在复杂业务场景,会出现慢查询,需要花费大量的时间.为了提高系统的性能,除了增加集群硬件配置这种成本高昂的开销外,还可以使用 ES 的缓存,下 ...

  3. L1 Cache、L2 Cache、L3 Cache说明

    很多小伙伴们都在程序中看到过L1 Cache.L2 Cache.L3 Cache这样的字符或者注释,但不少人不知道这些是什么,同样是学习者,小笔今天向大家分享一下自己的理解.要理解这些我们首先要知道C ...

  4. memory cache 和 disk cache

    from memory cache 和 from disk cache 最近在优化Vue项目,因此打开网页,按下F12.发现很多js,css得下载来自于 memory cache,引申出问题:请求时浏 ...

  5. Cache总义Cache用法之页面声明

    Cache总义Cache用法之页面声明 <%@ outputCache Duration="#ofseconds" Location="Any|Client|Dow ...

  6. Linux系统中的Page cache和Buffer cache

    Free命令显示内存 首先,我们来了解下内存的使用情况: Mem:表示物理内存统计 total:表示物理内存总量(total = used + free) used:表示总计分配给缓存(包含buffe ...

  7. 学习笔记:cache 和spring cache 技术(1)

    title: 学习笔记:cache 和spring cache 技术(1) author: Eric liu tags: [] categories: hexo 缓存是实际工作中非常常用的一种提高性能 ...

  8. 和linux关系_Linux内核Page Cache和Buffer Cache关系及演化历史

    在我们进行数据持久化,对文件内容进行落盘处理时,我们时常会使用fsync操作,该操作会将文件关联的脏页(dirty page)数据(实际文件内容及元数据信息)一同写回磁盘.这里提到的脏页(dirty ...

  9. 【转载】Java Cache系列之Cache概述和Simple Cache

    原文地址:http://www.blogjava.net/DLevin/archive/2013/10/15/404770.html 前记:最近公司在做的项目完全基于Cache(Gemfire)构建了 ...

最新文章

  1. Java图形化:布局方式
  2. 解决Matplotlib图表不能在Pycharm中显示的问题:使用Anaconda
  3. 全排列 ---java
  4. [BZOJ4815][CQOI2017]小Q的表格 数论+分块
  5. Eclipse安装以及JDK环境变量配置
  6. fun(int **p)的使用
  7. 创建react项目并启动出现的报错及解决
  8. Java实现的大整数分解Pollard's rho算法程序
  9. 8.15 SNAIL:神经注意力元学习
  10. 冲刺Two之站立会议4
  11. 四、ip classless与默认路由
  12. 日期相关的小函数汇总
  13. 联想Y40加装固态硬盘
  14. 层次分析法 你真的懂了吗?(完更)
  15. The Civil War in France translation04
  16. 竹云+巨杉丨互信认证 安全可靠
  17. 接口测试面试题汇总(含答案)
  18. 对数线性模型(Log-Linear Model)一种判别式模型的创建框架
  19. Scrum开发管理方法的由来、团队建设与实施过程
  20. RC6加密解密算法C#实现源码!

热门文章

  1. 原码和补码在计算机中的应用,原码,补码和反码在计算机中的作用
  2. java动态修改class_Java Agent入门学习之动态修改代码
  3. Java并发编程-常用的辅助类
  4. 页面重绘和回流以及优化
  5. python中修改字符串的值
  6. web前端自动化测试工具phantomjs的使用笔记
  7. [教程]centos下设置网卡
  8. html5,用或不用,它都在那里
  9. python怎么切图片_Python切割图片成九宫格
  10. python实现嵌套功能_我应该如何在Python中实现“嵌套”子命令?