原子操作,内存屏障,锁
1.原理:CPU提供了原子操作、关中断、锁内存总线,内存屏障等机制;OS基于这几个CPU硬件机制,就能够实现锁;再基于锁,就能够实现各种各样的同步机制(信号量、消息、Barrier等等等等)。
2.所有的同步操作最基础的理论就是原子操作。内存屏障,锁都是为了保证在不同的平台或者是CPU类型下的原子操作。
3.原子操作在单核,单线程/无中断,且编译器不优化的情况下是确定的,是按照C/C++代码顺序执行的,所以不存在异步问题
解释一下这几个知识点为什么会引起异步操作:
首先了解一下cpu处理指令的步骤:
1.早起的处理器为有序处理器,指令处理顺序:
a.读取指令
b.执行指令如果寄存器可写就从内存取出a的数据到寄存器,寄存器不可写就等待
c.寄存器处理指令
d.将寄存器结果存入内存
2.现在的处理器大多数为乱序处理器,处理顺序:
a.读取指令
b.指令被划分到指令队列
c.指令在队列中等待,如果寄存器可写就从内存取出a的数据到寄存器,寄存器不可写就等待
d.寄存器处理指令
e.将执行结果存入队列(而不是立即写入寄存器堆)
f.只有当所有更早的请求执行的指令结果被写入内存之后,执行的结果才会被存入内存(执行结果重排序,让执行看起来是有序的)
那么问题来了:1.一条简单的a++语句究竟会有这么多条指令,而这一组指令是可以在任意时候异步执行的(共享数据)
a.单核多线程情况下,线程是存在中断的,中断的时候cpu调用另一线程的同一指令组,所以是可能出现交叉执行的可能,也就是说单线程或者关掉中断可以解决异步问题,但很多时候这种做法并不实际
b.多核多线程情况下共享数据被多个核并