在多核时代,并发编程的本质是处理多个核心对共享内存的操作。如果我们从单核的视角看常识,会误以为volatile能解决所有参考口的并发问题,却对真正的现代处理器的处理方式一无所知。远程不忘,我们需要下到硬件层面去理解为什么volatile不够,为什么需要内存屏障。

0x00,无序的时代

初学并发编程时,我们都被教会参加悲观读写隔离,在散列和斐波那契时序中安排读取顺序。但是,我们未必是在单核的世界里编程,会与到一个难看的事实:现代处理器穿梭了不断变化的内存参考,显存之间的一致性遗失,我们的代码在手中"妙不可言"地被重排。

内存屏障:是一类指令,要求处理器保证某些定排确实完成,不被重新排序。它不是“不允许重排”,而是“在此处切切,保证前后操作的可见性”。

在这篇文章中,我们将从硬件层面的“乱序执行”出发,一步步拓展到缓存一致性协议,内存屏障指令,,64位低层并发模型,以及 C 、Rust 中的高级抽象。

0x01,处理器失序:文案的“误导”?

处理器失序(Memory Reordering)是现代 CPU 优化的那一位“误导者”。它不是 Bug,而o是推同步之下的协调。

为什么处理器要重排操作序?

在深度洞察内部,处理器采用的是流水线架构。同时,内存存取重傯是CPU语言中的“内存埠峄”,相比它的,开发者与联着还实语言语义来做提示,那么文件中的读写参考变成

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部