博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《现代体系结构上的UNIX系统:内核程序员的对称多处理和缓存技术(修订版)》——2.13 习题...
阅读量:7224 次
发布时间:2019-06-29

本文共 2101 字,大约阅读时间需要 7 分钟。

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

转载地址:http://xbufm.baihongyu.com/

你可能感兴趣的文章
Python 爬虫十六式 - 第六式:JQuery的假兄弟-pyquery
查看>>
宜昌a货翡翠,包头a货翡翠
查看>>
【微信事业群】趣味面试算法题
查看>>
保守的国美再一次进击社交电商,前途未卜?
查看>>
git
查看>>
Python学习教程(Python学习路线):Python 3—手动创建迭代器
查看>>
说说如何在 Virtual Box 中新建 CentOS 虚拟机
查看>>
Cordova + Vue 实现点击两次退出应用
查看>>
JAVA 多用户商城系统b2b2c-Spring Cloud Stream 介绍
查看>>
spring cloud构建互联网分布式微服务云平台-SpringCloud集成项目简介
查看>>
基于房源的画像分析
查看>>
80% UI 初学者走过的弯路,你走了几条?
查看>>
文档和元素的几何滚动
查看>>
php 设计模式
查看>>
Java springcloud B2B2C o2o多用户商城 springcloud架构(八)springboot整合mongodb
查看>>
3年工作经验的Java程序员面试经过
查看>>
Mysql 批量写入数据,对于这类性能问题,你是如何优化的
查看>>
MySQL无法启动几种常见问题小结
查看>>
阿里CTO:阿里所有技术和产品输出都将必须通过阿里云进行
查看>>
更好用的集群限流功能,Sentinel 发布 v1.4.2
查看>>