1.什么是CPU多级缓存模型?
1.1.基本概念
现代CPU为了提升执行效率,减少CPU与内存的交互(交互影响CPU效率),一般在CPU上集成了多级缓存架构,常见的为三级缓存结构。于是当从内存中读取数据时,并不是只读自己想要的部分。而是读取足够的字节来填入高速缓存行。根据不同的 CPU ,高速缓存行大小不同。如 X86 是 32BYTES ,而 ALPHA 是 64BYTES 。并且始终在第 32 个字节或第 64 个字节处对齐。这样,当 CPU 访问相邻的数据时,就不必每次都从内存中读取,提高了速度。 因为访问内存要比访问高速缓存用的时间多得多。
可以理解为在CPU上内置了一个很小的内存,但是这个内存读写速度远远大于内存,一般分为一级缓存,二级缓存,部分CPU还有三级缓存。
下图为intel的图解
1.2.CPU多级缓存架构
2.什么是MESI缓存一致性协议?怎么解决并发的可见性问题?
MESI(Modified-Exclusive-Shared-Invalid)协议是一种广为使用的缓存一致性协议,类似读写锁 对于同一地址的读内存操作是并发的,针对同一地址的写操作是独占的,对于内存地址写操作同一时间只能由一个处理器来执行。为了保持数据的一致性,MESI将缓存条目的状态划分为Modified.Exclusive,Shared,Invalid
MESI协议中一个缓存条目的状态Flag值分为以下四种
1. Invalid(无效的,记为I) 相应缓存行中不包含任何内存地址对应的有效副本数据,是缓存条目的初始状态
2. Shared(共享的,记为S)缓存行中包含相应内存地址数据的副本,其他处理器高速缓存中也可能包含相应地址内存的副本,缓存行中的数据与内存的一致
3. Exclusive(独占的,记为E)缓存行独占相应内存地址数据的副本,其他处理器高速缓存不包含相同的副本或者副本失效,缓存行中的数据与主内存数据一致
4. Modified(更改过,记为M)相应缓存行包含更新后的数据,其他处理器相同tag的缓存行只有唯一的M状态,与主内存的数据不一致
MESI定义了一组message用于协调各个处理器的读写内存操作,处理器在执行内存的读写操作时,在必要的情况下会往bus中发送特定的请求消息,每个处理器拦截这些消息,在一定情况下往bus回复消息。
3.什么是JAVA内存模型?
1)当class文件被jvm加载时,首先经过ClassLoader,经过
- Bootstrap CLassloder
- Extention ClassLoader
- AppClassLoader
这里也可以自定义ClassLoader,之后ClassLoader会根据该文件的className根据双亲委派机制进行判断该class文件是否已经被加载进jvm中。
方法区
2)加载进入运行时数据区时,该class文件会放入方法区中,我更乐意称之为类模板。实例化一个类的时候会根据这个模板去进行实例化。
堆
3)当实例化一个类的时候,在堆中开辟一片内存空间,根据class去实例化一个对象。
程序计数器,虚拟机栈,本地方法栈
4)程序计数器,虚拟机栈,本地方法栈都属于线程私有的内存空间,程序计数器是用来标记程序执行位置,本地方法栈,用来调用native方法。 虚拟机栈,一个线程执行时会把要执行的方法,压入虚拟栈中。如main方法执行,则先进入栈中,形成一个栈帧,这个栈帧中包含了运行时数据,如局部变量,操作数栈,动态链接,方法返回地址等。
4.线程安全之可见性、有序性、原子性是什么
可见性:线程间可以互相访问到。例如被static修饰的变量,这些变量在方法区可以使用类名.属性名的方式获取到。
有序性:允许编译器和处理器对指令进行重排序,但是重排序过程不会影响到单线程程序的执行,却会影响到多线程并发执行的正确性。例如i++
原子性:提供互斥访问,同一时刻只能有一个线程对数据进行操作(Atomic、CAS算法、synchronized、Lock)