CAS
这里只是做一些总结,详情请参考https://blog.****.net/pcwl1206/article/details/84892287
CAS:一种硬件对并发的支持,针对多处理器操作而设计的处理器中的一种特殊指令,用于管理对共享数据的并发访问。
包含的三个操作数:
1.内存地址V
2.旧预期值 A
3.更新值B
CAS进行操作的时候,过程是当内存地址V对应的值为A时,才将B的值赋值给地址V上
原子操作:指的是不可中断的一个或一系列操作。
处理器的相关术语:
- 缓存行:缓存的最小操作单位
- 比较交换:CAS操作
- cpu流水线:cpu流水线的工作方式就像工业生产上的装配流水线,在cpu中由5-6个不同功能的电路单元组成一条指令处理流水线,将一条X86指令分层5-6步后再由这些单路单元分别执行,这样就能实现在一个cpu时钟周期完成一条指令
- 内存顺序冲突:内存顺序冲突一般由假共享引起,假共享指的是多个cpu同时修改一个缓存行的不同部分而引起其中一个cpu的操作无效。
处理器如何实现原子操作:
- 32位Al-32处理器使用基于对缓存加锁或总线加缩的方式来实现处理器之间的原子操作
- 一般内存,处理器自动保证基本内存操作的原子性,但复杂内存操作需要二个机制来保证内存操作的原子性.
1.使用总线锁来保证原子性:所谓总线锁,指的是使用处理器提供的LOCK #信号,当一个处理器在总线上输出此信号的时
候,其他处理器的请求会被阻塞,那么该处理器可以独占使用共享内存。
为什么i++不是线程安全的?
进行i++时,可分为三个步骤,第一:读i的值,第二:进行加1,第三:赋值,我们进行二次i++操作,预期的结果是3,
但实际结果是2,原因是多个处理器同时从各自的缓存中读取变量 i,分别进行加1操作,然后分别写入系统内存,当中给
出图解:图片地址也是上面的转发地址。
2.使用缓存锁保证原子性:由于总线锁定把cpu和共享内存之间的通信锁住了,这使得锁定期间其他处理器不能操作其内存
的数据,这样的开销比较大,因此有了使用缓存锁来保证原子性,缓存锁定是指,如果缓存处理器缓存行中的内存区域在
Lock操作期间被锁定,当它执行锁操作回写内存时,处理器不在总线上声言LOCK #信号,而是修改内部的内存地址。但
有二种情况不使用缓存锁,第一:当操作的数据不能被缓存在处理器内部,或操作的数据跨多个缓存行(cache line),则处理器会调用总线锁定,第二:有些处理器不支持缓存锁定。