写博客意味着要考试了,边写边复习。
考的是计算机体系结构,其实和操作系统重合度有点高,在memory这方面。
讲讲cache。
一、为什么要有cache呢?
CPU在运行程序的时候需要各种各样的数据,数据都放在内存中(main memory ),CPU要什么数据,就会告诉内存,“你把第xxx块的数据放到总线上递给我吧”。
本来这样也没什么问题,可是就是太慢了。
计算机中有个叫memory wall 的东西,大概意思是 计算机发明到现在,CPU计算速度提升了几千万倍(大概),存储系统的速度却只提升了几十倍。CPU在前面跑得飞快,但是每次需要个什么存储系统内的数据,就要等存储系统慢慢找,找到了给它。
那就做个快点的呗。又有一个原理,叫什么名字我忘了,大意是说,越大的存储系统,寻址时间越大,越小的存储系统,寻址时间越短。该怎么妥协呢?于是cache就诞生了,我把常常用的东西放到一个小的存储芯片里面,不就能整体提高速度了嘛。
二、cache寻址过程
上图展示了一个简单的cache寻址过程。原来CPU只需要告诉内存,我要xxxx块,有了cache后,就直接告诉cache了。但是cache小呀,如图,右边内存有那么多,但是cache只有4块,这里就存在一个映射关系。
对于原来的一个地址 0010xx,在cache中什么位置呢,在中间两位 10的位置上。但是还有1110xx 1010xx这些地址会映射到这一块上,所以需要地址的高两位也放入cache中作为tag,以便区分是否是需要的那块地址。
拿到一个32位地址,首先把中间10位,叫index位,找出来去找到第xxxxx行的cache的地方,然后用高20位,叫tag位,去比较这一行的tag,如果相等那就说明就是这一块。
三、组关联映射
cache要是能存储的多点就好了,但是多了寻址又变慢了。于是组关联又有了。相同的index位找到一组,一组中有多行。
同样的255,同样的8位index, 每一组却有4个。只需要比较这四个中,哪个tag和地址请求相等,就得到想要的了。
四、关于替换算法
cache大小是有限的,当我需要把某一块地址放入cache中的一组,这一组的几个block都有了,那么就需要替换出某一块出去。替换哪一块又要涉及到替换算法。
LRU policy:Least Recently Used,把最近最少使用的替换出去。也就是上次使用距现在时间最长的那一块。
在硬件实现上,用pseudo LRU 实现
五、关于写
如果cache hit
write through :把cache 和memory一起写了,简单但是费事。
write back : 只把cache写了,并且在cache中用dirty位表示此数据已经被更改过。
如果cache miss
no write allocate : 把memory写了
write allocate : 把要改的那块放入cache中,然后写。
write buffer:
写总是耗时的,可以把写交给write buffer 而不是cache本身 ,这样cache可以继续进行其他操作。
六、关于cache的性能
Average Memory Access Time= Hit Time+(Miss Rate * Miss Penalty)