1.allocate
先确定一下allocate的概念,就是在cache miss的时候,去内存中读写数据过程中给这个数据分配cacheLine并存储到cache。
其中write-allocate可以分为两种情况:
- 先读要改写数据对应的cacheLine大小的数据回来,存储到新分配的cacheLine上,然后将要修改的写数据更新到cacheLine中
- 直接分配cacheLine,将数据存储到该cacheLine
以上两种fill cacheline的过程适用于不同的情况,第一种适用于写数据不是整个cacheLine大小,由于和内存交互的最小单元是cacheLine,所以只能先读整个cacheLine,这个过程称为读改写。
显然第二种就属于完全替换整个cacheLine的情况,当然完全替换整个cacheLine也可以采用第一种方式。
必须要分清的是read trans miss对应的是read allocate;而write trans miss对应的是write allocate,即使write miss后allocate的cacheLine的fill可能需要从内存中读数据。
2.cache的读策略与read allocate
上表是ArmV8架构手册给出的memType及mem属性,在cacheability中cacheable为何只有write-Through Cacheable和Write-Back Cacheable而没有提到read的属性呢?
我们在说write-Through和write-back cache的时候,并不是说该cache不能支持读trans,而是因为默认情况下write-through和write-back的cache的读策略都是一样的。
对于cacheable的trans,读首先要在cache中查找,
- 如果hit,那么就得到所需的数据
- 如果miss就去内存中读取
在miss后读取内存的过程中,对读回的数据处理又分了两类
- read allocate :就是将读回的数据分配一个cacheLine存储在cache中
- read non-allocate:读回的数据直接给master使用,而不在cache中缓存
而默认情况下都是使用read allocate的cache【无论是write-back还是write-through】
3.cache的写策略与write allocate
常用的cache写策略是write-back和write-through,Arm目前也支持这两种回写策略,还有其他的策略不在这里体现。
既然是cacheable的写trans,首先到cache中查找,若:
Hit时:
write-through:将写数据更新到cacheLine,同时将该Dirty的cacheLine写到内存中
write-back:直接将数据更新到cacheLine,并不立即写到内存中去,在该cacheLine被逐出cache时,写到内存中。
miss时,按照allocate分为两种情况:
write allocate :此时在cache中分配一个cacheLine(fill cacheLine过程见本文第一章),然后按照hit的情况,分write-back和write-through回写数据
write non-allocate:此时无论write-back还是write-through都是直接将数据写往内存中。文章来源:https://www.toymoban.com/news/detail-851944.html
ARM的cache和mem零散记录(属性)-CSDN博客这边博客中提到的write stream mode就是典型的使用write non-allocate的场景。文章来源地址https://www.toymoban.com/news/detail-851944.html
到了这里,关于cache读写策略(write-back/through)与分配策略(allocate)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!