线程问题产生原因:写缓冲器与无效化对列问题

引入写缓冲器与无效化队列的目的:

        从 MESI 我们可以得知,在进行写数据的时候是处于一种阻塞的状态,只有等待写操作进行完毕,其他处理器存于高速缓存的数据被设置为 I (无效)的时侯,待其返回设置完毕的命令的时候,我们的执行处理器才能够继续执行。这个问题导致了延迟,我们也是为了解决这个问题,而导入写缓冲器与无效化队列。解决完毕以后的处理器在进行操作就是相当于一种异步的方式。

写缓冲器:

       执行方式,当要开始写操作的时候,会先去判断当前执行处理器的高速缓存的缓存条目的状态,情况1,如果 状态是E(独占) or  M(修改) 的状态就直接把我们要写入的数据直接写入到高速缓存当中。情况二,如果是 S (共享状态) 就会直接先把数据写到写缓冲器当中,并且发送 Invalidate 信息到总线去,通知其他处理器如果拥有这个数据,就把状态更改为 I (无效)状态,进而发送 ReadSponse 返回执行的处理器中,在继而把写缓存的数据转移到高速缓存区当中。情况三,过程如情况二一样,其中执行处理器发送的指令更改为 Read Invalidate;

无效化队列:

       用于当执行处理器查询到自己的高速缓存状态为 S or  I  的时候就会发送到其他处理器的信息,其他处理对他先进行存储,而为进行操作,然后提前发送 响应信息给 执行处理器,就能够解决延迟等待的问题,本质就是为异步。

引入后的读方式:

        当进行读数据的时候,会先去执行处理器的写缓冲器先进行读取,如果没有读取到数据,就去高速缓存区域当中读取数据。

引入后的写方式:

      写的方式在描述写缓存的时候其中的情况 1,2,3,就是为写方式。

导致内存重排序:

因为存在写缓冲器,无效化队列。

 (1)写缓冲器:可能出现某一线程 A 更改数据后直接然后存入执行处理器的写缓冲区中,在其他线程 B 执行这个一相同数据还是继续从高速缓存中取出原始数据,在线程 A 中看来 B线程的执行顺序就是被重排序的。

 (2)无效化队列: 当线程 A 写入数据时,先存入到写缓冲区当中,然后通知其他其处理进行无效化设置,然后其他处理器对信息进行存储如无效化队列后进行反馈,然后线程A把存储在写缓冲区中数据写入到高速缓存当中。此时B线程想要读取,数据时,因为消息还存储在队列中,并没有进行执行,然后B线程还是从执行处理器的高速缓存中拿到旧的数据。在A眼中B就是无效的。 

导致不可见性问题:

原因也是因为写缓冲器还有无效化队列

(1)写缓冲器暂存的数据,其他的执行处理器无法见。

(2)无效化队列存在未执行的,其他执行处理器获取数据来自于他本身的高速缓存当中。

解决可见性问题,以及内存重排序问题:

(1)为我们的执行程序 添加 加载屏障,存储屏障 就能够解决这个问题。

存储屏障知识传送门:存储屏障

 

上面的为个人见解,有误望提出。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值