学习操作系统P3 多处理器编程:从入门到放弃 (线程库;现代处理器和宽松内存模型)

 

 啊

 

 

 

操作系统会自动把线程放置在不同的处理器上

可以用top观察CPU使用率

 

 

 

 

 

 

 啊

 

 啊

 

 

 

 甚至连一个简单的求和程序都做不对

a

 

 汇编语言中的 lock: CPU的特性,通过总线加锁,解决多处理器的并发问题

 

 啊

 

 

 

 

a

a

a

 

 asm volatile("":::"memory"); 用来告诉编译器这里不要优化

a

 

a

 

这里的 asm volatile("" : : "memory"); 的作用是:防止编译器把 printf 放到 y = 1 前面

根据jyy画出的状态机所示,这个代码有可能的结果只有 

x = 0, y = 1; 

x= 1, y= 0;

x = 1, y = 1;

无论如何不可能得到 x=0 y =0

a

 

然而,实际上,我们得到了 0 0,原因是什么呢?

 

 

在CPU里,汇编指令会被翻译成更小的 u OPs,并且重排

今天的处理器基本就是在 乱序执行 的框架下,不停做各种优化

 

在执行到 movl $1, (x) 时,已经 cache miss

乱序处理器在等待 cache 的时候会继续执行下一条指令,从而导致 多处理器间即时可见性的丧失

TODO: 这一段实话说看不懂,也许我应该做完CPU cache 的部分再来看

 

 

 

 

 ARM 和 RISC-V 的内存模型更差,很难保证内存的一致性

 

 解决方案:加上 mfence

mfence 保证内存写入共享内存以后,才可以执行下一条指令

 

 

posted @ 2023-02-26 17:01  yinhuachen  阅读(58)  评论(0编辑  收藏  举报