在学习并发编程时,我们知道,多条指令不被分割操作被成为原子操作。但是,对于CPU是如何保证原子性的呢。
1、对于单核CPU
对于单核cpu,所有的事件都是串行,执行完第一才会去执行第二个。所以,单核CPU实现原子操作比较简单。
在单核CPU中,每个指令都保证是原子的,即中断只会在指令之间发生。Intel x86指令集支持内存操作数的inc操作,将多条指令的操作在一条指令内完成。因为进程的上下文切换是在总是在一条指令执行完成后,所以不会写撕裂或者读撕裂等并发问题。
2、对于多核CPU
对于多核CPU,保证单条指令并不能解决并发问题,因为多个核心可能同时运行同一个赋值语句。
1、使用总线锁
总线锁用来锁住某一个共享内存。当一个cpu要对内存进行操作时,会加上总线锁,限制其他cpu对共享内存操作。Intel x86指令集提供了指令前缀lock用于锁定前端串行总线(FSB),保证了指令执行时不会受到其他处理器的干扰。
2、使用缓存锁
使用总线锁,会锁定cpu与内存的通信,所以开销很大。有的cpu架构提供开销更小的缓存锁。缓存锁在一个cpu进行回写时,会使用缓存一致性机制来保护内部内存,当其他处理器回写已被锁定的缓存行的数据时会起缓存行无效。
3、CAS
CAS(Compare and Swap),cas记录原来内存中的值old,和将要修改的值new。CAS会检测现在内存中的值now,如果now和old一致,则说明没有别的cpu进行了内存修改,执行new值的更新。如果new和old值不等,则说明值已被修改,丢弃new值。