原子操作

165 阅读2分钟

1. 概述

  1. 原子操作指的是由多步操作组成的一个操作,如果该操作是原子执行,则要么执行完所有操作,要么一步也不执行,所谓原子操作,也就是一个独立而不可分割的操作。在单核环境中,一般的意义下原子操作中线程不会被切换,线程切换要么在原子操作之前,要么在原子操作完成之后。更广泛的意义下原子操作是指一系列必须整体完成的操作步骤,如果任何一步操作没有完成,那么所有完成的步骤都必须回滚,这样就可以保证要么所有操作步骤都未完成,要么所有操作步骤都被完成。

  2. 单核系统单个机器指令就是原子操作,多核因为是多指令流并行执行的所以单个机器指令就不是原子操作了,因为其他核可能会操作同一片内存,会出现数据竞争问题

2. 原子操作的底层实现

  1. 总线加锁: 所谓的总线操作就是使用处理器提供一个 lock 信号,当一个处理器在总线上输出信号时,其他处理器请求会被阻塞,那么该处理器就可以独享内存,但总线锁定把 cpu 和内存之间的通信锁住了,其他处理器皆不能操作其他的内存,所以开销比较大
  2. 缓存加锁: 缓存锁定来保证原子性,所谓“缓存锁定”是指内存区域如果被缓存在处理器的缓存行中(高速缓存L1,L2,L3中),并且在Lock操作期间被锁定,那么当它执行锁操作回写到内存时,处理器不在总线上声言 LOCK 信号,而是修改内部的内存地址,并允许它的缓存一致性机制来保证操作的原子性,因为缓存一致性机制会阻止同时修改由两个以上处理器缓存的内存区域数据,当其他处理器回写已被锁定的缓存行的数据时,会使缓存行无效