企业网站设计html,重庆招聘网官方网站,做一个个人网站,怎么做企业网站推广的方法这一文#xff0c;让我们分析一下#xff0c;《浅谈 Cache》 一文中的奇怪现象#xff0c;事实上如今来看也并不奇怪了。在什么情况下 r1 和 r2 都为 0 呢#xff1f;细致看代码#xff0c;你会发现#xff0c;两个线程分别被执行在不同的 CPU 核上#xff0c;而且在线程…这一文让我们分析一下《浅谈 Cache》 一文中的奇怪现象事实上如今来看也并不奇怪了。 在什么情况下 r1 和 r2 都为 0 呢 细致看代码你会发现两个线程分别被执行在不同的 CPU 核上而且在线程開始的阶段还使用了一个随机数是为了让两个线程能尽量同一时候执行。 如果 CPU0 执行 x 1; r1 y; CPU1 执行: y 1; r2 x; 假设以下的情况发生 x 在 CPU1 的 Cache 中。 y 在 CPU0 的 Cache 中。 1. CPU0 运行 x 1, cache miss, 发送 read invalidate 消息并把 x 的值 1 存入 Store Buffer 開始运行 r1 y, Cache 命中r1 为 0; 2. CPU1 运行 y 1cache miss, 发送 read invalidate 消息并把 y 的值 1 存入 Store Buffer, 開始运行 r2 xCache 命中r2 为 0; 3. CPU0 和 CPU1 各自收到了对方的消息并作出回应x 和 y 的值均应用到 Cache 中且都为 1; 主函数收到信号比較 r1 和 r2 的值奇迹发生了。 假设你知道我讲的这些细节就会发现事实上这并非奇怪了。那么假设解决问题呢 事实上答案就非常easy了要么让两个线程执行在同一个核心上要么在两个语句之间加上内存屏障经验证问题攻克了。 题外篇 在不同 CPU 架构下对内存的乱序訪问事实上是不同的一般的内存乱序分为下面四种: LoadStore, LoadLoad, StoreStore, StoreLoad。而且 X86 下仅仅会出现 StoreLoad 乱序也就是上面的样例我的 CPU 是 X86 的所以出现了这样的情况由此可知事实上 X86 内存乱序訪问的还不算太厉害。 简单解释一下x 1为 Store, 读取 y 的过程为 Load所以 Load 指令在 X86 下同意在 Store 还未更新到 Cache 中之前被运行。 走出一个误区内存乱序訪问与 CPU 乱序运行Out of Order即 OOO不同。早期的处理器为有序处理器In-order processors有序处理器处理指令通常有下面几步 1. 指令获取 2. 假设指令的输入操作对象input operands可用比如已经在寄存器中了则将此指令分发到适当的功能单元中。假设一个或者多个操作对象不可用一般是因为须要从内存中获取则处理器会等待直到它们可用 3. 指令被适当的功能单元运行 4. 功能单元将结果写回寄存器堆Register file一个 CPU 中的一组寄存器 相比之下乱序处理器Out-of-order processors处理指令通常有下面几步 1. 指令获取 2. 指令被分发到指令队列 3. 指令在指令队列中等待直到输入操作对象可用一旦输入操作对象可用指令就能够离开队列即便更早的指令未被运行 4. 指令被分配到适当的功能单元并运行 5. 运行结果被放入队列而不马上写入寄存器堆 仅仅有全部更早请求运行的指令的运行结果被写入寄存器堆后指令运行的结果才被写入寄存器堆运行结果重排序让运行看起来是有序的 从上面的运行过程能够看出乱序运行相比有序运行能够避免等待不可用的操作对象有序运行的第二步从而提高了效率。现代的机器上处理器运行的速度比内存快非常多有序处理器花在等待可用数据的时间里已经能够处理大量指令了。 如今思考一下乱序处理器处理指令的过程我们能得到几个结论 对于单个 CPU 指令获取是有序的通过队列实现 对于单个 CPU 指令运行结果也是有序返回寄存器堆的通过队列实现 由此可知在单 CPU 上不考虑编译器优化导致乱序的前提下多线程运行不存在内存乱序訪问的问题 CPU 尽管是乱序运行可是是顺序流出结果在我们看来乱序运行对我们来讲是透明的我们看到的结果和指令顺序是一样的。 转载于:https://www.cnblogs.com/gcczhongduan/p/4065365.html