《现代体系结构上的UNIX系统:内核程序员的对称多处理和缓存技术(修订版)》——2.10 独立的指令高速缓存和数据高速缓存

简介: 将指令高速缓存和数据高速缓存分开的做法目前在计算机系统中相当常见。这种做法能够有效地使高速缓存的带宽加倍,因为它能让CPU从指令高速缓存预取指令的同时把数据载入或者保存到数据高速缓存中。图2-17描绘了这样的一种组织结构。

本节书摘来自异步社区《现代体系结构上的UNIX系统:内核程序员的对称多处理和缓存技术(修订版)》一书中的第2章,第2.10节,作者:【美】Curt Schimmel著,更多章节内容可以访问云栖社区“异步社区”公众号查看

2.10 独立的指令高速缓存和数据高速缓存

将指令高速缓存和数据高速缓存分开的做法目前在计算机系统中相当常见。这种做法能够有效地使高速缓存的带宽加倍,因为它能让CPU从指令高速缓存预取指令的同时把数据载入或者保存到数据高速缓存中。图2-17描绘了这样的一种组织结构。本章提到的所有处理器,除了Intel 80486之外,其片上高速缓存都有独立的指令高速缓存和数据高速缓存。

因为两块高速缓存都可以同时访问主存储器(缺失处理或者写操作),所以要由硬件来仲裁高速缓存对主存储器的访问,这对于软件来说是透明的。注意,没有办法直接把数据保存到指令高速缓存中。因此,指令高速缓存是只读高速缓存。

这种组织结构最重要的方面就是缺乏数据高速缓存和指令高速缓存之间的直接互连。如果在指令高速缓存中没有命中某个指令,那么指令高速缓存就无法到数据高速缓存中查找它。指令高速缓存始终都是从主存储器读取指令来完成缺失操作。类似地,数据高速缓存中的缺失也要从主存储器读取。把数据保存到数据高速缓存中不会影响指令高速缓存的内容。虽然这是一种最简单的实现,但是它可能会产生高速缓存的不一致性,因为主存储器的内容可能会被缓存在一个以上的地方。如果使用单一的、将指令和数据结合在一起的高速缓存,就不会出现这类不一致性。
screenshot

考虑使用自身能够修改代码的程序时的情形。这类程序包括诸如LISP解释器这样的程序,因为对于它们来说,部分编译它们正在解释的程序并非鲜见(编译后的代码通常写入进程的数据区)。如果要执行的指令是在数据区动态生成的,那么有可能出现两种不一致性。第一,如果使用写回高速缓存机制,那么最近写的指令可能尚未写入主存储器。这意味着,如果程序试图执行这些新指令,那么指令高速缓存可能会从内存中取得过时的指令。第二,一旦动态生成的指令被缓存在指令高速缓存中,那么程序的任何写操作(以此用新指令来替换那些在指令高速缓存中的老指令)都不会对指令高速缓存造成影响。新指令将写入数据高速缓存,并且最终写入主存储器,但是指令高速缓存不知道要获取新值。它会继续执行过时的老指令,直到行替换删除这些指令为止。在这种情况下,对那些指令的下一次引用将会造成一次缺失,并且从主存储器读取新指令。

遗憾的是,操作系统不能把高速缓存隐藏起来,从而让这类程序无视高速缓存的存在,因为操作系统没有办法知道程序会在什么时候试图执行其数据空间的某个部分。唯一的解决方法是提供特殊的系统调用,以便在程序已经产生了一组它现在想要执行的指令时就通知操作系统。接着,如果在数据高速缓存中使用了写回高速缓存机制,那么操作系统就使主存储器有效,并且使指令高速缓存的内容无效(在提供特殊指令来冲洗高速缓存的体系结构上,如果应用程序能够直接执行高速缓存冲洗指令,那么就不一定要有特殊的系统调用)。对指令和数据高速缓存的冲洗通常作为分开的硬件操作来实现。

一般而言,只要操作系统需要使被缓存的数据无效来保持一致性,那么它也必须使被缓存的指令无效。各种特定的实例则取决于高速缓存的体系结构,下面的章节将讨论它们。

虽然有可能让构建的系统中的硬件自动保持指令高速缓存和数据高速缓存的同步,但是却很少这样做。这样的系统会要求每次在数据高速缓存上执行写操作的时候都检查指令高速缓存并可能使其无效。这些额外的对指令高速缓存的访问可能会干扰指令的获取操作,并使其变慢。那些能够修改自身的代码实例很少值得为其在硬件上增加复杂性。

相关文章
|
1月前
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(一)
数据的存储--Redis缓存存储(一)
|
1月前
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(二)
数据的存储--Redis缓存存储(二)
数据的存储--Redis缓存存储(二)
|
8天前
|
存储 缓存 算法
分布式缓存有哪些常用的数据分片算法?
【10月更文挑战第25天】在实际应用中,需要根据具体的业务需求、数据特征以及系统的可扩展性要求等因素综合考虑,选择合适的数据分片算法,以实现分布式缓存的高效运行和数据的合理分布。
|
26天前
|
SQL 缓存 Java
JVM知识体系学习三:class文件初始化过程、硬件层数据一致性(硬件层)、缓存行、指令乱序执行问题、如何保证不乱序(volatile等)
这篇文章详细介绍了JVM中类文件的初始化过程、硬件层面的数据一致性问题、缓存行和伪共享、指令乱序执行问题,以及如何通过`volatile`关键字和`synchronized`关键字来保证数据的有序性和可见性。
24 3
|
25天前
|
缓存 监控 前端开发
处理页面缓存中数据不一致的问题
【10月更文挑战第9天】
39 2
|
1月前
|
消息中间件 缓存 NoSQL
大数据-49 Redis 缓存问题中 穿透、雪崩、击穿、数据不一致、HotKey、BigKey
大数据-49 Redis 缓存问题中 穿透、雪崩、击穿、数据不一致、HotKey、BigKey
50 2
|
3月前
|
缓存 NoSQL Linux
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
123 1
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
|
3月前
|
缓存 NoSQL 算法
【Azure Redis 缓存】Redis导出数据文件变小 / 在新的Redis复原后数据大小压缩近一倍问题分析
【Azure Redis 缓存】Redis导出数据文件变小 / 在新的Redis复原后数据大小压缩近一倍问题分析
|
3月前
|
缓存 NoSQL Redis
【Azure Redis 缓存】Azure Reids是否可以开启慢日志(slowlog)和执行config指令
【Azure Redis 缓存】Azure Reids是否可以开启慢日志(slowlog)和执行config指令
|
3月前
|
存储 缓存 NoSQL
【Azure Redis 缓存】Azure Redis 服务不支持指令CONFIG
【Azure Redis 缓存】Azure Redis 服务不支持指令CONFIG

热门文章

最新文章