作者回复: 任何原子操作都是真对某一个共享资源而言的,即内存中的同一个小块区域以及相关的缓存。这个区域足够小,因此通常只用一个CPU指令就可以完成对它的读或写。
所以,这并不是说,一遇到原子操作,所有的CPU核心就都不工作了。你要理解“中断”这个词的真正含义。这里的细节还是很多的,涉及到cache line、多核CPU协调机制(几种方案)、LOCK原语(CPU不同方案不同)等等。一句两句说不太清楚,你可以自己去找资料看看。
总之,你可以理解为,针对不同共享资源的原子操作是有可能并行进行的。而针对相同共享资源的原子操作,即使存在多CPU核心,它们页不可能并行进行。
作者回复: 不一定,P 把 G 交给 M 就不管了,调度器发现还有 M 闲着就会继续从那些 P 那边拿 G。
作者回复: 临界区是指互斥锁保护的区域。锁只能保证操作上的互斥,或者说串行,但不能保证不被中断。“互斥”和“不中断”是两个不同的概念。锁保护的代码没有原子性一说,在执行的过程中是有可能被中断的,即可能会被撤下CPU,转而运行其他并发的代码。
互斥锁里面会用到原子操作,但那只是其中的一个或几个步骤而已。原子操作只能针对原始的内存地址来做,其中的一个原因是它对CPU的性能影响巨大。也正因为如此,原子操作根本无法顾及某段代码这么大颗粒度的东西。