《现代体系结构上的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从来不会读取这些数据。假定要被清零的存储器块的起始地址始终和高速缓存行的起始位置相对应,要被清除的存储量是高速缓存行大小的倍数,那么请推荐一种特殊用途的高速缓存操作,比如一条新指令,从而让存储器的填零操作效率更高。

相关文章
|
3月前
|
存储 机器学习/深度学习 缓存
一看就懂!图解 Kotlin SharedFlow 缓存系统
一看就懂!图解 Kotlin SharedFlow 缓存系统
68 2
|
2月前
|
存储 缓存 NoSQL
作者推荐 | 企业级缓存技术解析,你必须知道的“9“大技术问题与常见误区
本文将深入剖析导致上述问题的九大根源,并提供相应的解决方案。请注意,本文以Java为例进行代码演示,但同样适用于其他技术平台的朋友。只需根据相应技术平台替换相关代码即可!
452 0
作者推荐 | 企业级缓存技术解析,你必须知道的“9“大技术问题与常见误区
|
17天前
|
缓存 应用服务中间件 数据库
【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(多级缓存设计分析)
【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(多级缓存设计分析)
26 1
|
18天前
|
缓存 NoSQL Java
手撸的 SpringBoot缓存系统,性能杠杠的
手撸的 SpringBoot缓存系统,性能杠杠的
26 0
|
1月前
|
存储 NoSQL Redis
陌陌技术分享:陌陌IM在后端KV缓存架构上的技术实践
在本文中,陌陌数据库负责人冀浩东将聚焦探讨陌陌的 KV 系统架构选型思路,深入解析如何进行此类系统的甄选决策,同时进一步分享陌陌团队在采用 OceanBase(OBKV)过程中所经历的探索与实践经验。
31 0
|
5月前
|
缓存 Java Maven
微服务技术系列教程(07) - SpringBoot - 缓存的使用
微服务技术系列教程(07) - SpringBoot - 缓存的使用
43 0
|
1月前
|
缓存
LRU 缓存置换策略:提升系统效率的秘密武器(下)
LRU 缓存置换策略:提升系统效率的秘密武器(下)
|
1月前
|
存储 缓存 算法
LRU 缓存置换策略:提升系统效率的秘密武器(上)
LRU 缓存置换策略:提升系统效率的秘密武器(上)
|
2月前
|
存储 缓存 Python
如何在Python中实现一个简单的缓存系统?
如何在Python中实现一个简单的缓存系统?
27 1
|
2月前
|
存储 缓存 算法
使用Java实现高效的数据缓存系统
【2月更文挑战第3天】在大规模的应用程序中,数据缓存是提高应用程序性能的一种重要方法。本文介绍了如何使用Java实现高效的数据缓存系统。我们将讨论缓存的设计原则和缓存算法的选择,同时详细说明如何使用Java内置的缓存库和其他开源工具来构建一个可靠、高效的数据缓存系统。