深入理解计算机系统之笔记
chap4.处理器体系结构
指令执行阶段
- 取指(fetch):从存储器中读取指令字节,地址为PC的值。从指令中抽取出指令指示符字节的两个四位部分,称为icode(指令代码)和ifun(指令功能)。它可能取出一个寄存器指示符字节,指明一个或两个寄存器操作数指示符rA和rB。它还可能取出一个四字节常数字valC。它按顺序方式计算下一条指令的地址valP,valP等于PC的值加上已取指令的长度。
- 译码(decode):从寄存器文件中读入最多两个操作数,得到值valA和值valB。
- 执行(execute):ALU要么执行指令指明的操作,计算存储器引用的有效地址,要么改变栈指针。
- 访存(memory):可以将数据写入存储器,或者从存储器中读出数据。
- 更新PC(PC update):将PC设置成下一条指令的地址。
chap5.优化程序性能
妨碍编译器优化的因素(memory blocker):
1.存储器别名使用(memory aliasing):两个指针可能指向同一个存储器位置的情况。2.函数调用:当函数调用会修改全局变量时,就有可能妨碍编译器优化。
代码优化:
1.消除循环的低效率:代码移动;2.减少过程调用;
3.消除不必要的存储器引用:采用局部变量(存放在寄存器中的)保存中间结果。
超标量(superscalar):在每个时钟周期可以执行多个操作,而且是乱序的,意思就是指令执行的顺序可以与它们在机器级程序中的顺序不一致。
4.循环展开:减少了不直接有助于程序结果的操作的数量;提高局部的并行性,从而减少了整个计算中关键路径的长度。
5.书写适合用条件传送实现的代码。
Amdahl定律:S=1/((1-a)+a/k)。S:加速比;a:占系统时间的百分比;k:提高倍速。因此要想大幅度提高整个系统的速度,必须提高整个系统很大一部分的速度。
chap6.存储器层次结构
存储器层次
- 寄存器:缓存4字节或8字节,访问时间为0个时钟周期,由编译器管理;
- TLB(翻译后备缓冲器):缓存地址翻译的页表,访问时间为0个时钟周期,由MMU(存储器管理单元)管理;
- L1高速缓存:缓存64字节块,访问时间为1个时钟周期,由硬件管理;
- L2高速缓存:缓存64字节块,访问时间为10个时钟周期,由硬件管理;
- L3高速缓存:缓存64字节块,访问时间为30个时钟周期,由硬件管理;
- 虚拟存储器:缓存4-kb的内存页,访问时间为100个时钟周期,由硬件+OS管理;
- 缓冲区缓存:缓存部分文件,访问时间为100个时钟周期,由OS管理;
- 磁盘缓存:缓存磁盘文件,访问时间为100000个时钟周期,由控制器固件管理;
- 网络缓存:缓存网络文件,访问时间为10000000个时钟周期,由AFS/NFS客户端程序管理。
可以看出,上层存储器缓存了下层存储器的一部分内容,层次越高,访问速度越快,单位成本也越高,相应的容量越小。
存储器缓存的核心思想:局部性
空间局部性:被引用过一次的存储器位置,很有可能在不久的将来会引用它附近位置的存储器;
时间局部性:被引用过一次的存储器位置,很有可能在不久的将来会被再次引用到。
高速缓存:(S,E,B,m)
S:高速缓存组数
E:组内的高速缓存行数。行数越多,关联度越高,时间局部性越好。能提高命中率,降低由于冲突不命中出现抖动的可能性,但是会增加命中时间,相应的会增加不命中处罚。
B:块大小(字节)。块越大,空间局部性越好,能提高命中率,也会提高不命中处罚(替换成本提高了)
m:物理地址位数
- 直接映射高速缓存:E=1
- 组相联高速缓存:E>1
- 全相联高速缓存:S=1
存储器地址:t+s+b=m
t:被用作行标记,因为存储器中多个块会被映射到同一个组。t = m-s-b
s:组索引号。2^s = S
b:块索引号。2^b = B
选用中间位作为组索引的原因:它可以使得存储器中相邻的块被映射到不同的组中,从而使得空间局部性良好的程序运行时能充分利用高速缓存。