Java作为一个跨平台的语言,它的实现要面对不同的底层硬件系统,设计一个中间层模型来屏蔽底层的硬件差异,给上层的开发者一个一致的使用接口。Java内存模型就是这样一个中间层的模型,它为程序员屏蔽了底层的硬件实现细节,支持大部分的主流硬件平台。要理解Java内存模型以及一些处理高并发的技术手段,理解一些基本的硬件知识是必须的。这篇会说一下跟并发编程相关的一些硬件知识。
一个基本的CPU执行计算的过程如下:
1. 程序以及数据被加载到主内存
2. 指令和数据被加载到CPU的高速缓存
3. CPU执行指令,把结果写到高速缓存
4. 高速缓存中的数据写回主内存
这个过程中,我们可以看到有两个问题
1. 现代的计算芯片都会集成一个L1高速缓存,我们可以理解为每个芯片都有一个私有的存储空间。那么当CPU的不同计算芯片要访问同一个内存地址时,该内存地址的值会在CPU的不同计算芯片之间有多个拷贝,如何同步这些拷贝?
2. CPU读写是直接和高速缓存打交道,而不是和主内存直接打交道。因为通常一次主存访问在几十到几百个时钟周期,而一次L1高速缓存的读写只需要1-2个时钟周期,而一次L2高速缓存的读写只需要数十个时钟周期。那么CPU写到高速缓存的值何时写回到主内?如果是多个计算芯片在处理同一个内存地址,那么如何处理这个时间差是个问题。
对于第一个问题,不同的硬件结构处理的方式不一样。我们来理解一下互连线的概念。
互连线是处理器于主存以及处理器与处理器之间进行通信的媒介,有两种基本的互联结构:SMP(symmetric multiprocessing