计算机内存模型(转)

内存模型,英文名Memory Model,他是一个很老的老古董了。他是与计算机硬件有关的一个概念。编程

CPU和缓存一致性缓存

随着CPU技术的发展,CPU的执行速度愈来愈快。而因为内存的技术并无太大的变化,因此从内存中读取和写入数据的过程和CPU的执行速度比起来差距就会愈来愈大,这就致使CPU每次操做内存都要耗费不少等待时间。多线程

因此,人们想出来了一个好的办法,就是在CPU和内存之间增长高速缓存。缓存的概念你们都知道,就是保存一份数据拷贝。他的特色是速度快,内存小,而且昂贵。并发

那么,当程序在运行过程当中,会将运算须要的数据从主存复制一份到CPU的高速缓存当中,那么CPU进行计算时就能够直接从它的高速缓存读取数据和向其中写入数据,当运算结束以后,再将高速缓存中的数据刷新到主存当中。编程语言

而随着CPU能力的不断提高,一层缓存就慢慢的没法知足要求了,就逐渐的衍生出多级缓存。优化

按照数据读取顺序和与CPU结合的紧密程度,CPU缓存能够分为一级缓存(L1),二级缓存(L2),部分高端CPU还具备三级缓存(L3),每一级缓存中所储存的所有数据都是下一级缓存的一部分。.net

这三种缓存的技术难度和制形成本是相对递减的,因此其容量也是相对递增的。线程

当CPU要读取一个数据时,首先从一级缓存中查找,若是没有找到再从二级缓存中查找,若是仍是没有就从三级缓存或内存中查找。blog

单核CPU只含有一套L1,L2,L3缓存;若是CPU含有多个核心,即多核CPU,则每一个核心都含有一套L1(甚至和L2)缓存,而共享L3(或者和L2)缓存。进程

 

单线程。cpu核心的缓存只被一个线程访问。缓存独占,不会出现访问冲突等问题。

单核CPU,多线程。进程中的多个线程会同时访问进程中的共享数据,CPU将某块内存加载到缓存后,不一样线程在访问相同的物理地址的时候,都会映射到相同的缓存位置,这样即便发生线程的切换,缓存仍然不会失效。但因为任什么时候刻只能有一个线程在执行,所以不会出现缓存访问冲突。

多核CPU,多线程。每一个核都至少有一个L1 缓存。多个线程访问进程中的某个共享内存,且这多个线程分别在不一样的核心上执行,则每一个核心都会在各自的cache中保留一份共享内存的缓冲。因为多核是能够并行的,可能会出现多个线程同时写各自的缓存的状况,而各自的cache之间的数据就有可能不一样。

在CPU和主存之间增长缓存,在多线程场景下就可能存在缓存一致性问题,也就是说,在多核CPU中,每一个核在本身的缓存中,关于同一个数据的缓存内容可能不一致。

 

处理器优化和指令重排

上面提到在CPU和主存之间增长缓存,在多线程场景下会存在缓存一致性问题。除了这种状况,还有一种硬件问题也比较重要。那就是为了使处理器内部的运算单元可以尽可能的被充分利用,处理器可能会对输入代码进行乱序执行处理。这就是处理器优化。

除了如今不少流行的处理器会对代码进行优化乱序处理,不少编程语言的编译器也会有相似的优化,好比Java虚拟机的即时编译器(JIT)也会作指令重排。

可想而知,若是任由处理器优化和编译器对指令重排的话,就可能致使各类各样的问题。

 

并发编程的问题

原子性是指在一个操做中就是cpu不能够在中途暂停而后再调度,既不被中断操做,要不执行完成,要不就不执行。

可见性是指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其余线程可以当即看获得修改的值。

有序性即程序执行的顺序按照代码的前后顺序执行。

 

缓存一致性问题其实就是可见性问题

处理器优化是能够致使原子性问题

指令重排会致使有序性问题

 

参考连接:

http://www.hollischuang.com/archives/2550原文:https://blog.csdn.net/qq_35642036/article/details/82798679 

相关文章
相关标签/搜索