1. 计算机组成

1.1 CPU的并发控制(CPU级别)

cpu的并发控制一般指的就是在多核心cpu环境下, 对三级缓存,内存中数据的一致性保证, 以及对多核cpu流程的控制等

1.1.1 关中断

中断是指当出现需要时,CPU暂时停止当前程序的执行转而执行处理新情况的程序和执行过程。即在程序运行过程中,系统出现了一个必须由CPU立即处理的情况,此时,CPU暂时中止程序的执行转而处理这个新的情况的过程就叫做中断。 而关中断是指在此中断处理完成前,不处理其它中断.

1.1.2 缓存一致性协议

在CPU和内存的资源交换中,CPU常常需要等待内存,而浪费了大量的计算能力。三级缓存的出现正是为了弥补内存的慢和CPU的快而诞生的产物。

缓存的加入是为了解决CPU运算能力和内存读写能力的不匹配问题,简单来说就是为了提升资源利用率。那么在多CPU多核心下,每个核心都会有一个一级缓存或者二级缓存,也就是说一二级缓存是核心独占的(类似JMM模型,线程的工作内存是线程独占的,主内存是共享的)而三级缓存和主内存是共享的,这样就将导致CPU缓存一致性问题。为了解决这种不一致,大名鼎鼎的MESI协议随之而来。

MESI:Modified(修改),Exclusive(独占),Shared(共享),Invalid(无效)由以上数据的四种状态的首字母而来。

在缓存中数据的存储单元是缓存行(Cache line),主流的CPU缓存行都是64个字节。缓存行的四种状态由两个字节标识。

M(Modified): 这行数据有效,数据被修改了,和内存中的数据不一致,数据只存在于本Cache中。

E(Exclusive): 这行数据有效,数据和内存中的数据一致,数据只存在于本 Cache 中。

S(Shared): 这行数据有效,数据和内存中的数据一致,数据存在于很多 Cache 中。

I(Invalid): 这行数据无效。

MESI带来的相关问题, 比如进行了指令重排后的可见性问题, 是使用内存屏障解决的, 更多详情参考: https://www.cnblogs.com/hello-shf/p/12091591.html

1.1.3 系统屏障(内存屏障)

内存屏障,也称内存栅栏,内存栅障,屏障指令等, 是一类同步屏障指令,是CPU或编译器在对内存随机访问的操作中的一个同步点,使得此点之前的所有读写操作都执行后才可以开始执行此点之后的操作。

指令1 :sfence 写屏障 在sfence 指令前的写操作 必须在sfence 指令的写操作前完成。 指令2: lfence 读屏障 在lfence指令前的读操作 必须在lfence指令的读操作前完成。 指令3:mfence 读写屏障 在mfence 指令的读写操作 必须在mfence指令的读写操作前完成。

内存屏障存在的意义就是为了解决程序在运行过程中出现的内存乱序访问问题,内存乱序访问行为出现的理由是为了提高程序运行时的性能(比如指令重排)。

1.1.4 总线锁