《现代体系结构上的UNIX系统:内核程序员的对称多处理和缓存技术(修订版)》——2.13 习题

简介: 一个程序通过每次将一个字保存到存储器连续的地址中来使存储器清零。观察一个系统,它采用带有写分配的写回高速缓存,在一开始被清零的存储器块并没有被高速缓存起来的时候,该系统会发生什么样的情况?假定行的大小比一个字大,第一次把数据保存到每一行中的时候会造成一次缺失,要从主存储器读取该行的内容。

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

2.13 习题

2.1 除了I/O控制器上的设备寄存器之外,无缓存的数据还能用在其他什么地方?

2.2 请解释如果高速缓存中的有效位在系统加电复位期间没有清除将会发生什么情况?(在高速缓存中使用的存储设备加电时往往具有随机的内容。)

2.3 为什么高速缓存中的每一行都需要有它自己的标记?

2.4 为什么采用地址的“位<9..2>”来索引一个512行直接映射高速缓存的散列算法是一种不好的选择?如果高速缓存是双路组相联高速缓存又会怎样?

2.5 请解释在使用本章介绍的技术时高速缓存的行数为什么是或可能不是2的整数幂?

2.6 考虑一个直接映射高速缓存,它以地址的“位<17..8>”来索引1024行高速缓存。每一行包含16字节。如果程序一般仅仅占用从0x1000到0x4fff范围内的地址,那么这是一种好的散列算法吗?解释为什么是或者为什么不是。如果高速缓存是16路组相联高速缓存又会怎样?

2.7 考虑一个写回、双路组相联高速缓存,它有4096行,每行16字节。应该将哪几位用于散列算法?为什么?需要行的标记部分中的多少位来保持地址(假定使用32位地址和随机替换策略)?在标记中为地址使用最少的位数同保存全部32位地址相比,高速缓存所需的位数节省了百分之多少?

2.8 有一个7路组相联高速缓存,每行256字节,总共512组,应该使用什么样的散列算法?

2.9 考虑下面对直接映射、写直通高速缓存的组织结构的两种选择。两者都保存2048字节(2 KB)的数据(不包括标记和控制位)。一种组织结构是使用4字节的行,另一种使用32字节的行。每一种选择中,包括数据、标记和控制位在内,高速缓存总共需要多少位?讨论在两种方案之间进行选择时,应该注意的有关硬件成本和性能的折中考虑。假定系统使用32位的地址。

2.10 考虑这样一种环境,其中经常运行文本处理程序。这些程序的特征是它们经常要把字符串从一个地方复制到另一个地方,并且在缓冲区内产生字符串。在这样的环境中最好是使用写回还是写直通高速缓存机制?应该使用写分配吗?阐述理由。

2.11 描述下面一段代码的高速缓存局部性。系统使用独立的指令和数据高速缓存,两者均为8 KB双路组相联高速缓存,每行16字节。数据高速缓存使用带有写分配功能的写回策略(假定int类型是32位的)。如果行的大小增加到256字节,会发生什么样的情况?

struct {
   int rec_id;
   char rec_name[16];
   int value;
   int flags;
} array[1000];

…
int i, sum;

sum = 0;

for ( i=0; i<1000; i++)
   sum += array[i].value;

2.12 一个系统采用双路组相联高速缓存,每行8字节,总共16行。高速缓存使用带有写分配功能的写回策略以及LRU替换策略。假定高速缓存内的所有行在初始时都是无效的。主存储器包含以下数据:

地址    数据

01230    33

01234    44

01270    7

01274    8

02270    67

02274    42

03270    43

03274    46

03650    100

03654    200

06730    120

06734    210

08670    10

08674    20

08600    64

08640    76

09830    333

09834    355

接着出现了下面的存储器引用(每次引用一个完整的字):

从01234载入

把5保存到03650

从08670载入

从08674载入

从01274载入

从08670载入

把99保存到09834

把12保存到02270

从01230载入

从06730载入

从03654载入

把37保存到03654

绘制类似于图2-11的图,显示出上面列出的存储器引用完成后的高速缓存内容。包括每行修改位的状态,此外要显示出主存储器最终的内容。

2.13 一个程序通过每次将一个字保存到存储器连续的地址中来使存储器清零。观察一个系统,它采用带有写分配的写回高速缓存,在一开始被清零的存储器块并没有被高速缓存起来的时候,该系统会发生什么样的情况?假定行的大小比一个字大,第一次把数据保存到每一行中的时候会造成一次缺失,要从主存储器读取该行的内容。随后,程序把零保存到高速缓存行中,替换掉从主存储器读取的老数据。因此,读取高速缓存行是对存储器带宽的一种浪费,因为CPU从来不会读取这些数据。假定要被清零的存储器块的起始地址始终和高速缓存行的起始位置相对应,要被清除的存储量是高速缓存行大小的倍数,那么请推荐一种特殊用途的高速缓存操作,比如一条新指令,从而让存储器的填零操作效率更高。

相关文章
|
1月前
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
74 6
|
23天前
|
缓存 Java Shell
Android 系统缓存扫描与清理方法分析
Android 系统缓存从原理探索到实现。
46 15
Android 系统缓存扫描与清理方法分析
|
26天前
|
存储 缓存 数据库
缓存技术有哪些应用场景呢
【10月更文挑战第19天】缓存技术有哪些应用场景呢
|
26天前
|
存储 缓存 运维
缓存技术有哪些优缺点呢
【10月更文挑战第19天】缓存技术有哪些优缺点呢
|
2月前
|
存储 缓存 NoSQL
解决Redis缓存击穿问题的技术方法
解决Redis缓存击穿问题的技术方法
70 2
|
2月前
|
存储 缓存 Java
在Spring Boot中使用缓存的技术解析
通过利用Spring Boot中的缓存支持,开发者可以轻松地实现高效和可扩展的缓存策略,进而提升应用的性能和用户体验。Spring Boot的声明式缓存抽象和对多种缓存技术的支持,使得集成和使用缓存变得前所未有的简单。无论是在开发新应用还是优化现有应用,合理地使用缓存都是提高性能的有效手段。
39 1
|
2月前
|
缓存 运维 NoSQL
二级缓存架构极致提升系统性能
本文详细阐述了如何通过二级缓存架构设计提升高并发下的系统性能。
123 12
|
3月前
|
缓存 NoSQL Linux
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
128 1
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
|
3月前
|
缓存 NoSQL Java
SpringBoot的三种缓存技术(Spring Cache、Layering Cache 框架、Alibaba JetCache 框架)
Spring Cache 是 Spring 提供的简易缓存方案,支持本地与 Redis 缓存。通过添加 `spring-boot-starter-data-redis` 和 `spring-boot-starter-cache` 依赖,并使用 `@EnableCaching` 开启缓存功能。JetCache 由阿里开源,功能更丰富,支持多级缓存和异步 API,通过引入 `jetcache-starter-redis` 依赖并配置 YAML 文件启用。Layering Cache 则提供分层缓存机制,需引入 `layering-cache-starter` 依赖并使用特定注解实现缓存逻辑。
974 1
SpringBoot的三种缓存技术(Spring Cache、Layering Cache 框架、Alibaba JetCache 框架)
|
3月前
|
缓存 应用服务中间件 nginx
[nginx]proxy_cache缓存系统
[nginx]proxy_cache缓存系统