存储器层次结构基础(一)

最近在看David Patterson的量化研究方法,顺便记录一下自己的理解。

现代的计算机中的存储器实际是分为很多层次的,从上往下容量不断增大,成本降低,访问速度下降。


Register->Cache(SRAM)->Memory(DRAM)->Disk->Distributed System

由于相邻的两级之间的访问速度往往相隔1000倍以上,所以设计人员就需要设计合理的调度算法尽量让程序跑的更快,也是非常有技术含量的活儿。

1.缓存内部的结构

处于效率的原因,一般情况下缓存内部会分为组,有直接映射缓存和全相联缓存。一般移动的基本单位是组里的块,一个组会有多个或一个块。在直接映射缓存中每个块每个组只有一个块,利用(块地址 Mod 缓存内组数)算出应该映射到哪个组,而全相联中只有一个组,所以块可以放在任意地方。

2.读取缓存策略

现代的技术中主要有两路策略

1)直写缓存,也就是更新缓存中的内容同时回送给Memory,这样虽然耗时间但可以保证一致性,在并行中的满足可见性应该就是使用的直写缓存,如Java中用volatile声明的变量。

2)回写缓存,当然上面的那种方法开销是不小的,因为每次送给Memory的速度可不是一笔小开销,所以回写缓存中,只有当在替换这个块时,才会将修改的数据回送给Memory。

当然这两种策略都使用了写缓冲区的策略,将数据放入缓冲区之后可以马上进行缓存操作,不需要等待将数据送到主存的响应。

3.效率

为了衡量不同的缓存组织方式的效率,有一个专业指标——缺失率:未能命中目标次数/总的访问cache的次数

缺失的情景主要由3个方面组成:

1)Compulsory:对一个数据块的第一次访问,肯定得从memory内读出才可以,称为强制缺失。

2)Capacity:如果缓存不能容纳程序运行期的所有块则必须要做出取舍,就会容易出现一个块一会儿离开cache一会儿进入cache,这种称之为容量缺失。

3)Conflict:如果放置策略不是全相联的,很有可能会出现两个块映射到同一个组上,而一个组只能容纳一个块,则必须要移出一个,类似于hash冲突,这时候也容易造出一个块忽进忽出,称之为冲突缺失。(e.g. 有3个组编号分别为1、2、3,进来一个地址为5的块,5%3=2将他放到组2,又进来块地址为8的块,8%3=2,这时候得把5从组2上替换掉,这时候5又进来了,又得替换,往复几次之后明显利用率不够,效率大大折扣)

4.应对的策略

聪明的设计人员也想到了应对方案:

1)增大每个块的大小:可以在一定程度上缓解强制缺失的损失,就譬如你出门多带点东西,用的时候可以直接拿出来就不用跑回宿舍去取了。但整个cache空间是有限的,块变大了,意味着你能带块的个数就变少了!继续刚才的例子,你出门带的东西是有限的,刚才出门一手拎一袋零食还可以背一个书包,但现在有一袋米要扛回家,肯定只能扛一袋米咯。所以块个数的减少会容易出现容量缺失和冲突缺失。

2)增大缓存大小:这个优点不用多说了吧,但缺点就是:钱!功耗增大!命中的时间也要增加!

3)提高相关联程度:这个可以减小冲突缺失的损失,但会延长命中时间。因为你得去找阿,就和hash表的最差查找效率也会到达线性复杂度一个道理。

4)采用多级缓存:可以设置一个非常小的一级缓存L1,从而跟上CPU的时钟频率。一个稍微大点的二级缓存L2,收集容纳许多本来要对主存储器进行的访问,这个大了命中速度就慢了,这也没办法。现在的配置一般都是与3级缓存。如Macbook pro中的配置为一级缓存:128kb,二级缓存:1MB,三级缓存:6MB。而Thinkpad t440的三级才3MB,这些细微差距在实际运行中的差距还是不小滴。有些i7的新款已经到了12MB了。

5)将读取缺页指定高于写入操作的优先级:一般在写缓冲区内实现这个优化,由于写缓冲区有实时的更新值,所以先写后读会有安全隐患,一种解决方案是在读取缺失时检查写缓冲区的内容,如果没有冲突最好,如果有得先读完了再写。举例如果系统在读一个块内数据,而此时有另一个程序要往此区域写数据,这时系统已经读了一半了,如果挂起读的线程让写操作得到调度,写完之后内存里的数据的确得到更新,但读出来的数据就很可能不是最新的被更改过的值。所以一定要按顺序来,给读设立高优先级。

6)在缓存索引期间避免地址转换:因为地址转换需要时间,所以此举可以缩短命中的时间。一般在L1中是采用了此类优化,但这样就会限制L1的大小与结构,同时增加了系统的复杂度。一种常用的优化方式是使用页偏移地址(虚拟地址与物理地址相同部分)来索引缓存,但这样不用经历复杂的地址转换过程(访问TLB),从而提高命中的速度!











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值