Disk Geometry:
磁盘的结构如图,每个面为surface,surface上的同心圆为track,track包含sector,不同的surface的同半径track构成cylinder。越外围的的track应该包含越多的sectors,这样用于分割sectors的spare space不至于太多而浪费。
SSD:
传统的机械硬盘读写时需要旋转,而固态硬盘则不必如此故而得名。SSD是以flash memory为基础,由blocks组成,每个block又包含pages。一旦某个page的数据要更该,则需要erase整个block,所以寿命的限制是其缺点之一。
Locality:
我们的存储器分级是一个金字塔形,越上层的容量越小、速度越快。每一层作为下一层的cache(音同cash),如果我们需要下层的数据,需要一层层传上来。
Good locality是指我们多次访问相同或临近的地址,因为它们第一次被加载到高层的缓存中后就不用每一次再从下层加载,大大加快了速度。访问相同地址利用了temporal locality(时间的),访问临近地址利用了spatial locality(空间的)。
Cache memory:
我们所需要的内容如果在缓存中称作cache hit,反之称作cache miss。当cache为空时称作cold cache,我们开始进行数据的访问就相当于给它warm up(^o^)
Cache的结构如图
访问cache的地址分作三部分,最高位的t bits表示tag,中间的s bits表示set,最低位的b bits表示block。
访问时先匹配set,然后看数据所在行的valid bit是否为1,接着看tag是否匹配,如果以上三步都顺利就可以从相应block中取出数据啦。
启示:
我们写程序时要注意代码要locality friendly,比如说要选择
for (i=0; i<3; i++) for(j=0; j<3; j++) sum+=a[i][j];
最里层循环中的i和j顺序不能调换。sum作为局部变量会被加载到高层的缓存中,对它的多次访问利用了temporal locality;而对类似a[i][1]、a[i][2]地址相邻,满足spatial locality。
Memory Mountain:
这幅图咱们最熟悉了,就是书本封面嘛。
Size是指block的size,越小则读取越快。Stride-k可以理解为每k个元素,比如说访问stride-3,即访问a[0]、a[3]、a[6]……,k变大时并不利于spatial locality。
总的来说,size越小,stride越小,存储器的读取速度越快!