《现代体系结构上的UNIX系统:内核程序员的对称多处理和缓存技术(修订版)》——2.4 双路组相联高速缓存...
本节书摘来自异步社区《现代体系结构上的UNIX系统:内核程序员的对称多处理和缓存技术(修订版)》一书中的第2章,第2.4节,作者:【美】Curt Schimmel著,更多章节内容可以访问云栖社区“异步社区”公众号查看
2.4 双路组相联高速缓存
双路组相联高速缓存(two-way set associative cache)类似于直接映射高速缓存,不同之处在于散列函数算出的索引指向高速缓存中可能保存数据的一组带有两行的高速缓存。在同一组内,每一行高速缓存都有它自己的标记,这意味着高速缓存可以同时保存经散列算法算出相同索引的两个不同地址的数据。Intel Pentium的片上数据高速缓存就是双路组相联高速缓存。它总共保存有8 KB的数据,每行32字节。这意味着高速缓存中总共有256行(8192字节÷32字节/行),组成128组(256行÷2行/组)。图2-16描绘出了这样的一个高速缓存。

在查找操作期间,散列函数算出的索引指向一组两行可以保存数据的高速缓存。被索引的一组两行高速缓存中的标记和地址同时进行比较,以查看是否命中了两行中的某一行(组内所有行的标记并行比较,从而不会因采用串行比较而降低高速缓存的访问速度)。双路组相联高速缓存的目的是,减少直接映射高速缓存中两个不同地址经散列计算得出相同的索引值时发生的高速缓存颠簸。在双路组相联高速缓存中,这两个不同的地址都保存在高速缓存中。使用这种类型高速缓存的其他处理器还有Intel i860 XR以及80486的外部高速缓存。
现在就很清楚为什么直接映射高速缓存也称为单路组相联高速缓存了。“单路”和“双路”的说法是指每一组中高速缓存行的数量(在高速缓存内所有的组都有相同数量的行)。“相联”一词则是指实际上这一组高速缓存就是以内容编址(content-addressable)的或者说相联(associative)的一个存储器,因为它是通过对照组内高速缓存行的位置(或者地址)来检查标记的内容从而判断出一次命中的。直接映射高速缓存是n路组相联高速缓存的一种退化形式,因为每一个相联组中只有一行高速缓存。
配合双路组相联高速缓存的散列算法和配合直接映射高速缓存的散列算法相同,区别在于前者所需的位数更少,因为对于总量相同的高速缓存存储器来说,双路组相联高速缓存中的组数只有直接映射高速缓存的一半。所以用于图2-16中高速缓存的散列算法就只使用“位<11..5>”来选择组。和以前一样,“位<4..0>”选择高速缓存行内的字节(因为一行有32字节)。
替换策略稍微复杂一些。采用直接映射高速缓存时,在一次缺失操作期间,载入的高速缓存行必须放入将被索引的位置,从而可以在未来的查找操作期间找到。这一行就在散列算法所索引的高速缓存行组内。但是采用双路组相联高速缓存时,现在组内有两行都可以选择用来替换。两行中的任何一行都可以被替换,因为组内的两行在查找操作期间都可以搜索到。在理想情况下,最好替换在最长时间内不会被再次引用的行,因为这能提高高速缓存的整体命中率。遗憾的是,没有办法知道程序未来的引用模式。时间局部性表明,在组内宜采取LRU替换的做法,所以大多数实现(如Intel 80486 外部高速缓存)都利用了这种方法。这种做法不但易于实现,而且效果相当不错。给每个组加上一个额外的位(称为MRU,代表“最近使用”)就可以实现这种方法。每次在一组内出现一次命中时,MRU位就被更新,以反映该组内的哪一行产生了命中。当组内的一行必须被替换的时候,高速缓存首先检查其中是否有一行被标记为无效。如果有,那么就替换那一行。如果两行都是有效的,那么MRU位就指出上次使用的是那一行,于是就选择替换另一行。然后再更新MRU位来指出被替换的行。
双路组相联高速缓存的总结
双路组相联高速缓存通过索引带有两行的一组可能保存数据的高速缓存行,来尝试获得比直接映射高速缓存更好的高速缓存性能。双路组相联高速缓存实现起来要稍微复杂和昂贵一些,因为必须并行比较一组内两行的标记,而且需要一种更复杂的替换策略。
它相对于直接映射高速缓存的优势在于可以减少高速缓存颠簸的现象。如果在一个进程的局部引用中多个地址得出了同一个索引,那么这两个地址会同时被高速缓存,而直接映射高速缓存却一定要替换该行。注意,双路组相联高速缓存的性能绝对不会低于行数相同的直接映射高速缓存。在最差的情况下,如果程序产生地址的顺序是每个地址索引唯一一行,那么双路组相联高速缓存的性能就和直接映射高速缓存一样。另一方面,如果局部引用是由产生冗余索引的多个地址所构成的,那么双路组相联高速缓存的命中率会更高,因为它能同时缓存着产生相同索引的两个不同地址的数据。
《现代体系结构上的UNIX系统:内核程序员的对称多处理和缓存技术(修订版)》——2.4 双路组相联高速缓存...的更多相关文章
- UNIX 系统上的文本操作简介
http://www.oschina.net/question/129540_53561 UNIX 的基本哲学之一就是创建只做一件事并将这一件事做好的程序(或进程).这一哲学要求认真考虑接口以及结合这 ...
- 使用apache daemon让java程序在unix系统上以服务方式运行
通过使用apache_commons_daemon,可以让Java程序在unix系统上以服务器的方式运行. 当然,通过wrapper也是可以达到这样的目的,wrapper还可以指定java应用中用到的 ...
- UNIX系统上的抓包工具tcpdump常用命令说明
tcpdump 介绍 tcpdump采用命令行方式对接口的数据包进行筛选抓取,其丰富特性表现在灵活的表达式上. 不带任何选项的tcpdump,默认会抓取第一个网络接口,且只有将tcpdump进程终止才 ...
- Unix及类Unix系统文本编辑器的介绍
概述 Vim是一个类似于Vi的著名的功能强大.高度可定制的文本编辑器,在Vi的基础上改进和增加了很多特性.VIM是纯粹的自由软件. Vim普遍被推崇为类Vi编辑器中最好的一个,事实上真正的劲敌来自Em ...
- Vi (Unix及Linux系统下标准的编辑器)VIM (Unix及类Unix系统文本编辑器)
Vi是Unix及Linux系统下标准的编辑器.学会它后,您将在Linux的世界里畅行无阻.基本上vi可以分为三种状态,分别是命令模式.插入模式,和底行模式. vi编辑器是所有Unix及Linux系统下 ...
- 《Linux/Unix系统编程手册》读书笔记9(文件属性)
<Linux/Unix系统编程手册>读书笔记 目录 在Linux里,万物皆文件.所以文件系统在Linux系统占有重要的地位.本文主要介绍的是文件的属性,只是稍微提及一下文件系统,日后如果有 ...
- 《Linux/Unix系统编程手册》读书笔记3
<Linux/Unix系统编程手册>读书笔记 目录 第6章 这章讲进程.虚拟内存和环境变量等. 进程是一个可执行程序的实例.一个程序可以创建很多进程. 进程是由内核定义的抽象实体,内核为此 ...
- 学习《Unix/Linux编程实践教程》(1):Unix 系统编程概述
0.目录 1.概念 2.系统资源 3.学习方法 4.从用户的角度来理解 Unix 4.1 登录--运行程序--注销 4.2 目录操作 4.3 文件操作 5.从系统的角度来理解 Unix 5.1 网络桥 ...
- 如何在unix系统中用别的用户运行一个程序?
1.问题的缘由 实际开发系统的时候,经常需要用别的用户运行一个程序.比如,有些系统为保证系统安全,不允许使用root来运行.这里,我们总结了unix系统下如何解决这个问题的一些方法.同时,我们还讨论如 ...
随机推荐
- 1064 Complete Binary Search Tree (30分)(已知中序输出层序遍历)
A Binary Search Tree (BST) is recursively defined as a binary tree which has the following propertie ...
- 1034 Head of a Gang (30分)(dfs 利用map)
One way that the police finds the head of a gang is to check people's phone calls. If there is a pho ...
- 使用css动画实现领积分效果
最近项目中要做一个领积分的效果,根据老板的描述,这个效果类似于支付宝蚂蚁森林里的领取能量.整体效果是就是在树周围飘着几个积分元素,上下滑动,类似星星闪烁,点击领取后,沿着树中心的位置滑动并消失,树上的 ...
- python3启动子进程之 os.fork()
python3启动子进程之 os.fork() 先了解python3 os.fork() 使用说明 在生物学家开始克隆研究之前,计算机科学家就拥有成功的克隆历史.他们克隆了进程,尽管他们没有将其称为 ...
- 解决:docker-compose端口绑定
docker-compose 进程绑定 Bind for 0.0.0.0:3825 failed: port is already allocated 查看进程发现有进程在关闭后继续进行 docker ...
- istream_iterator && istream_iteratorbuf
注意 读字符时, std::istream_iterator 默认跳过空白符(除非用 std::noskipws 或等价物禁用,而 std::istreambuf_iterator 不跳过.另外, s ...
- Python操作rabbitmq系列(六):进行RPC调用
此刻,我们已经进入第6章,是官方的最后一个环节,但是,并非本系列的最后一个环节.因为在实战中还有一些经验教训,并没体现出来.由于马上要给同事没培训celery了.我也来不及写太多.等后面,我们再慢慢补 ...
- 原生js俄罗斯方块
效果图 方块定位原理通过16宫格定位坐标,把坐标存到数组中去 [ [[2,0],[2,1],[2,2],[1,2]],//L [[1,1],[2,1],[2,2],[2,3]], //左L [[2,0 ...
- Kubectl patch命令使用
kubectl patch 使用(patch)补丁修改.更新资源的字段. 支持JSON和YAML格式. 请参阅https://htmlpreview.github.io/?https://github ...
- Java方法的重点
方法就是完成功能一个语句集合体 使用方法的原则:方法的原子性,一个方法只实现一个功能. 方法的重载 1.函数名必须相同 2.形参列表必须不同(可以是个数不同,类型不同,不然完全一样) 3.返回值可以相 ...