0%

CSAPP 学习笔记 5 存储器层次结构

这一周看了CSAPP第六章存储器层次结构的前三节,下面是思维笔记。

第六章存储器层次结构

存储技术

存储器有着很多的种类,比如CPU的寄存器、高速缓存,主存(内存)的DRAM,机械硬盘、固态硬盘、U盘、SD卡、磁带等。不同的存储器,会用到不同的存储技术。其中寄存器的存储技术从性能上看是最好的,同时价格也最昂贵的,因此寄存器的大小相比于其他存储器,少得可怜,比如一般来说,通用寄存器只有16个,而1个寄存器只能存储64个bit。高速缓存采用的是SRAM,而主存用的是DRAM。SRAM用到了多个晶体管,比DRAM要快得多,会更加稳定,同时成本也更高。一般来说,高速缓存是几M的量级,而主存是以几G的量级,可见两者的价格差异。RAM有一个特点是断电后内容会丢失。

我们常用的U盘、SD卡等,并不是基于RAM,而是基于ROM。所谓ROM,翻译成中文便是只读存储器。个人觉得这个名字有点歧义,容易让人误解成数据不可更改。但实际上,ROM也有多个种类,我们常用的U盘基于EEPROM(电子可擦写只读存储器),是可以进行擦写的。而固态硬盘,基于闪存,它也是可擦写的。以前给手机刷机的时候,常常会听到ROM和固件这两个名词。所谓固件,是指写入到ROM中的程序。

机械硬盘,常常会听到一个参数叫转数。这个参数表示盘片旋转速度的速度。这个参数虽然重要,但却非影响硬盘随机IO时间的最重要因素。磁盘访问数据,由三个部分的时间组成,即寻道时间、旋转时间、传送时间。寻道时间是磁头定位到对应磁道的时间,这个时间平均占比是最大的,通常可占到整体时间的1/2以上,所以我们可以用两倍寻道时间来估计总时间。磁头定位到对应磁道,有专门的寻道算法,比如电梯算法。

固态硬盘,是近些年流行起来的存储器。其性能、价格皆介于主存和机械硬盘之间。由于固态硬盘采用了闪存,避免了机械硬盘缓慢的寻道和旋转,所以速度更快,特别是在随机IO的表现上。

根据历史趋势,存储器将会访问速度越来越快,越来越大,且会越来越便宜。但是,由于CPU的性能提升要比SRAM、DRAM、磁盘的速度快,所以两者的差距在增大,这将成为计算机的瓶颈。也因此,各级缓存的必要性就体现出来了,利用局部性原理,我们可以减弱这种差距。

局部性

局部性分为空间局部性及时间局部性。空间局部性指的是某个位置的数据被访问后,其附近的数据将可能被访问。时间局部性指的是某个位置的数据被访问后,这个位置还将可能被再次访问。

以前对于这个概念的认识有点模糊,对其带来的性能差异没有明确的认知。我们下面通过一个程序来看一下空间局部性带来的影响。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int sum1(int a[N][N]) {
int i, j, sum = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
sum += a[i][j];
}
}
return sum;
}

int sum2(int a[N][N]) {
int i, j, sum = 0;
for (int j = 0; j < N; j++) {
for (int i = 0; i < N; i++) {
sum += a[i][j];
}
}
return sum;
}

当N = 20000时,在我的机器上,sum1执行的时间为2.1s,而sum2执行的时间为5.6s,两者差距两倍多。

sum1之所以性能表现比sum2优秀,是因为它访问数据时的步长为1,让计算机能更好地利用空间局部性原理。

存储器层次结构

计算机的存储器层次结构从快到慢分为寄存器、L1高速缓存、L2高速缓存、L3高速缓存、主存、本地二级磁盘(本地磁盘)、远程二级存储(分布式文件系统、Web服务器)等。通过这样的层次结构,在大小、访问速度、价格等因素之间取得了折衷,让计算机的价格合理、访问速度较快、存储空间较大。

缓存无处不在,其目的是降低不同存储器之间速度差异带来的影响。计算机各级存储器之间,上层是下层的缓存。浏览器访问网页时,在本地磁盘有缓存,能提高用户打开同一网页的速度。Web服务器被访问的时候,本地磁盘也有缓存,能提高不同用户访问同一网页的速度。磁盘也有缓存,用于缓存磁盘扇区,提高计算机访问磁盘的速度。代理服务器,也可用来做缓存,能降低网络延迟。业务上,redis用作MySQL的缓存,是用内存来缓存磁盘的内容,缓解了随机I/O带来的性能问题。

(全文完)