Cache 一致性
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如果cache中出现一个"脏"的拷贝,一个写回操作就要在它被读 之前完成 相对于更新协议,我们关心无效协议
更新协议或写广播.在写更新方案中,处理器写一个字与另一处理器读
出它之间的延时通常比较小. 但是,由于带宽极其珍贵,大多数处理器使用写无效方案
前奏:并行I/O
访问
并行I/O的问题
内存 硬盘:物理内存可能是过时的,如果 Cache 硬盘 内存:Cache可能有 和 对应的数据
合并E,M的状态意味 着什么?
2级Cache
处理器通常有2级Cache
小L1在片内,大L2在片外
包括的资源:L1里的项必然在L2里
L2上的无效 L1上的无效
监视L2不会影响CPU-L1的带宽 会出现什么问题呢?
如果CPU-L1 和 L2-Bus之间的交互涉及相同的地址,那么互锁是必须的
干涉
在L2上读A不命中,读A请求放在总线上 Cache-1需要读入一行,状态改变为共享 内存也可能应答这个请求 内存知道它有过时的数据吗? Cache-1需要通过内存控制器干涉内存为缓存-2提供正确的数 据
监视Cache的动作
观察到的总线周期
高速缓存状态 地址没有保存 保存,但是没有修改 保存,修改 地址没有保存 保存,但是没有修改 保存,修改
高速缓存动作
读周期 内存到硬盘
写周期 硬盘到内存
共享内存的多处理机
使用监视机制来确保所有的 处理器看到的内存都一样
Cache状态迁移图
每个高速缓存的标记 M:修改专有 E:专有,未修改 S:共享 I:无效
Cache的一致性
SMPs中内存的一致性
假设CPU-1更新A为200. 写回:内存和Cache-2有过时的值 写直达: Cache-2有过时的值 这些过时的数值有什么问题吗? 对于编写的程序,共享内存看起来会是什么样子呢?
写回 Cache&SC
T1被执行 Cache-1写回Y
T2被执行 Cache-1写回X Cache -2写回 X,Y
预留装入&条件存储
有专门的寄存器用来保存预留标记和地址,以及条件存储的输出
如果监视者看到一个到预留寄存器里某个地址的一个存储事务,这个 预留位要设为0.
– 多个处理器可以同时预留'aБайду номын сангаас – 这些指令类似一般的装入/存储指令,要使用总线
性能:
预留装入&条件存储
内存(总线)事务的总数不必要减少,但是,把一个原子 指令划分为预留装入&条件存储: 增加总线的利用率(减少处理器的停滞时间),特别是在 事务分离总线上 减少Cache乒乓效应,因为试图获得信号量的处理器不必 每次执行一个存储操作.
乱序装入/存储&CC
分块Cache 一次一个请求+CC SC 非分块Cache 多个请求并发(地址不同)+CC => 松散内存模型 CC确保所有的处理器看到一个相同的对应同一地址的装入 和存储顺序
�
多Cache系统
当今的系统一般具有分层的Cache 每个Cache只能有一个父亲,却可以没有或者有多个孩 子. 只有父亲和他的孩子可以直接交流 拥有的资源在父亲和孩子之间维持 例如:
SC的Cache一致性协议
写请求:
在写操作完成以前(以后),地址在其他Cache中变成无效(更新)
读请求:
错误的共享
一个Cache块包含多个字 Ache一致性保证是在块级而不是在字级 假设M1写一个Wordi,M2写一个Wordk,并且两个字地址 相同,会出现什么状况呢? 这个块可能被多次不必要地变为无效,因为地址共享了一个 相同的块
同步和Cache
进程1 进程2 进程3
Cache一致性协议会导致mutex在P1,P2的Cache之间传来传去(乒乓现象) 通过第一次读mutex位置(非自动地)会减少乒乓次数,而且只有在发现它变 为0的时候才执行交换.
写直达 Cache&SC
T1被执行 T2被执行
写直达Cache也不能解决顺序一致性
维护顺序一致性
SC对于正确的生产者-消费者问题和专有代码是足够的 (例如:Dekker) 一个存储单元的在不同的Cache中的多份拷贝会导致SC 破坏 硬件支持在下面这些情况下是需要的:
– 在一个确定的时间只有一个处理器有往一存储单元写的权利. – 没有计算机可以在写操作之后装入一个以前的拷贝 =>Cache一致性协议
监视 Cache[Goodman 1983]
方案:Cache可以监视DMA传输,然后"做正确的事". 监视Cache标记是双端口的.
当Cache控制总线时,用于驱动内存总线
监视内存总线上的读端口
一个监视Cache就和你一个喜欢窥视的邻居一样,他一直在看你在干什么,并且干涉 着你的生活.正是由于监视Cache存在,Cache为了处理那些当前在高速缓存内部的 那些块就会一直查看内存总线.这种相似在这里被破坏了,这个喜欢窥视的Cache只 会在你的行为确实影响到它的时候才会做点什么,就象一个喜欢窥视的邻居也只 会对你做的坏事感兴趣一样.
与总线占据相关的性能
一般来说,在没有其它处理器干涉内存的情况下,一个 读—修改—写指令需要两次内存操作. 在一个多处理器结构中,总线在整个原子读,写操作中需 要加锁.
对于简单总线来说,这种加锁代价较大; 对于事务分离总线来说,这种加锁代价很大.
现在的处理器使用
装入-预留 和 条件存储 事务分离总线有一个读- 请求的事务,后跟一个包含数据的内存应答事务. 当内存读这些被请求的地址字时,分离的事务使得其他部件使用总线. 通常意味着CPU必须对总线进行仲裁以请求数据,内存必须仲裁总线,以返回数据. 每一个事务必须标记.事务分离总线有较高的带宽和较高的延时.
写不命中 其它CPU读/写 一行 其它CPU要写
两个处理器的例子
观察
如果一行在M或E里,那么没有其他的Cache有这行的有效数据.
存储器要保持一致性,多个不同的拷贝不能同时存在.
Cache 一致性状态编码
有效的和脏位可以用来编码S,I,(E,M)的状态 V=0,D=x =>失效 V=1,D=0 =>共享(不是脏的) V=1,D=1 =>专有(脏的)
更新协议或写广播.在写更新方案中,处理器写一个字与另一处理器读
出它之间的延时通常比较小. 但是,由于带宽极其珍贵,大多数处理器使用写无效方案
前奏:并行I/O
访问
并行I/O的问题
内存 硬盘:物理内存可能是过时的,如果 Cache 硬盘 内存:Cache可能有 和 对应的数据
合并E,M的状态意味 着什么?
2级Cache
处理器通常有2级Cache
小L1在片内,大L2在片外
包括的资源:L1里的项必然在L2里
L2上的无效 L1上的无效
监视L2不会影响CPU-L1的带宽 会出现什么问题呢?
如果CPU-L1 和 L2-Bus之间的交互涉及相同的地址,那么互锁是必须的
干涉
在L2上读A不命中,读A请求放在总线上 Cache-1需要读入一行,状态改变为共享 内存也可能应答这个请求 内存知道它有过时的数据吗? Cache-1需要通过内存控制器干涉内存为缓存-2提供正确的数 据
监视Cache的动作
观察到的总线周期
高速缓存状态 地址没有保存 保存,但是没有修改 保存,修改 地址没有保存 保存,但是没有修改 保存,修改
高速缓存动作
读周期 内存到硬盘
写周期 硬盘到内存
共享内存的多处理机
使用监视机制来确保所有的 处理器看到的内存都一样
Cache状态迁移图
每个高速缓存的标记 M:修改专有 E:专有,未修改 S:共享 I:无效
Cache的一致性
SMPs中内存的一致性
假设CPU-1更新A为200. 写回:内存和Cache-2有过时的值 写直达: Cache-2有过时的值 这些过时的数值有什么问题吗? 对于编写的程序,共享内存看起来会是什么样子呢?
写回 Cache&SC
T1被执行 Cache-1写回Y
T2被执行 Cache-1写回X Cache -2写回 X,Y
预留装入&条件存储
有专门的寄存器用来保存预留标记和地址,以及条件存储的输出
如果监视者看到一个到预留寄存器里某个地址的一个存储事务,这个 预留位要设为0.
– 多个处理器可以同时预留'aБайду номын сангаас – 这些指令类似一般的装入/存储指令,要使用总线
性能:
预留装入&条件存储
内存(总线)事务的总数不必要减少,但是,把一个原子 指令划分为预留装入&条件存储: 增加总线的利用率(减少处理器的停滞时间),特别是在 事务分离总线上 减少Cache乒乓效应,因为试图获得信号量的处理器不必 每次执行一个存储操作.
乱序装入/存储&CC
分块Cache 一次一个请求+CC SC 非分块Cache 多个请求并发(地址不同)+CC => 松散内存模型 CC确保所有的处理器看到一个相同的对应同一地址的装入 和存储顺序
�
多Cache系统
当今的系统一般具有分层的Cache 每个Cache只能有一个父亲,却可以没有或者有多个孩 子. 只有父亲和他的孩子可以直接交流 拥有的资源在父亲和孩子之间维持 例如:
SC的Cache一致性协议
写请求:
在写操作完成以前(以后),地址在其他Cache中变成无效(更新)
读请求:
错误的共享
一个Cache块包含多个字 Ache一致性保证是在块级而不是在字级 假设M1写一个Wordi,M2写一个Wordk,并且两个字地址 相同,会出现什么状况呢? 这个块可能被多次不必要地变为无效,因为地址共享了一个 相同的块
同步和Cache
进程1 进程2 进程3
Cache一致性协议会导致mutex在P1,P2的Cache之间传来传去(乒乓现象) 通过第一次读mutex位置(非自动地)会减少乒乓次数,而且只有在发现它变 为0的时候才执行交换.
写直达 Cache&SC
T1被执行 T2被执行
写直达Cache也不能解决顺序一致性
维护顺序一致性
SC对于正确的生产者-消费者问题和专有代码是足够的 (例如:Dekker) 一个存储单元的在不同的Cache中的多份拷贝会导致SC 破坏 硬件支持在下面这些情况下是需要的:
– 在一个确定的时间只有一个处理器有往一存储单元写的权利. – 没有计算机可以在写操作之后装入一个以前的拷贝 =>Cache一致性协议
监视 Cache[Goodman 1983]
方案:Cache可以监视DMA传输,然后"做正确的事". 监视Cache标记是双端口的.
当Cache控制总线时,用于驱动内存总线
监视内存总线上的读端口
一个监视Cache就和你一个喜欢窥视的邻居一样,他一直在看你在干什么,并且干涉 着你的生活.正是由于监视Cache存在,Cache为了处理那些当前在高速缓存内部的 那些块就会一直查看内存总线.这种相似在这里被破坏了,这个喜欢窥视的Cache只 会在你的行为确实影响到它的时候才会做点什么,就象一个喜欢窥视的邻居也只 会对你做的坏事感兴趣一样.
与总线占据相关的性能
一般来说,在没有其它处理器干涉内存的情况下,一个 读—修改—写指令需要两次内存操作. 在一个多处理器结构中,总线在整个原子读,写操作中需 要加锁.
对于简单总线来说,这种加锁代价较大; 对于事务分离总线来说,这种加锁代价很大.
现在的处理器使用
装入-预留 和 条件存储 事务分离总线有一个读- 请求的事务,后跟一个包含数据的内存应答事务. 当内存读这些被请求的地址字时,分离的事务使得其他部件使用总线. 通常意味着CPU必须对总线进行仲裁以请求数据,内存必须仲裁总线,以返回数据. 每一个事务必须标记.事务分离总线有较高的带宽和较高的延时.
写不命中 其它CPU读/写 一行 其它CPU要写
两个处理器的例子
观察
如果一行在M或E里,那么没有其他的Cache有这行的有效数据.
存储器要保持一致性,多个不同的拷贝不能同时存在.
Cache 一致性状态编码
有效的和脏位可以用来编码S,I,(E,M)的状态 V=0,D=x =>失效 V=1,D=0 =>共享(不是脏的) V=1,D=1 =>专有(脏的)