多线程相关基本知识

本文涉及知识点: 并发与并行概念,cpu三级缓存基本概念,缓存一致性运转流程,volatile关键词可见性的实现方式等

 

首先区分两个概念,并发与并行

并行:只存在于cpu多核的场景,无论微观还是宏观都是同时运行多个指令

并发:同一个时间点只会有一个指令在运行,cpu通过时间片轮换的方式使得多个指令快速交替运行


介绍cpu的缓存与主存关系

cpu 缓存 分三级,一级缓存有两个,一个是指令缓存,一个是数据缓存  单cpu多核的情况,共享三级缓存,如果没有三级缓存则二级缓存共享

多线程相关基本知识

上图为多cpu的模式,多cpu的情况如果需要共享数据则不得不从主内存中获取,如果是单cpu则只需要将数据缓存在三级缓存中即可.

cpu处理数据在寄存器中,而寄存器的数据则从缓存中获取.

寄存器无法直接从主内存中获取数据,只能通过缓存获取,获取数据时先从一级缓存中获取,如果没有则找二级缓存,再没有三级缓存,再没有才从主内存中查找,获得数据后依次给一二三级缓存赋值


缓存一致性协议 

MESI  M:修改 E:独占 S:共享 I:无效   通过总线嗅探机制(广播) 更新状态

一个线程在操作某一个对象时,该对象为E(独占)状态,此时如果有其他线程也在操作该对象,则状态修改为S(共享),在一个线程已经把对象修改后,会将其改为M(修改)状态,其他正在使用的该对象则改为I(无效)状态,获取到I(无效)状态的对象则不可使用,需要重新获取,等待线程将该对象重新会写进主存,然后重新获取,回写的时候对象状态为E(独占),其他线程获取后又变为S,然后重复之前流程

比如说有A,B两个线程都对某个对象X进行操作,A先获取到对象,B后获取到对象

在A线程中,X的状态变化: E(此时B未获取到)-->S(此时B已获取到)->M(A修改了对象,其他线程中的相同对象改为I)->回写进主存

在B线程中,X的状态变化:S(A抢先一步获取到了对象)->I(A修改了对象,此时B需要重新从主存中获取新值)->等待A回写进主存->E(A已回写进主存,B获取到对象)


缓存一致性协议通过Lock源语触发,而Lock源语需要volatile 关键字,加锁等手段触发

Lock通过锁缓存行的方式保证缓存一致性,大小为64byte,当数据超过64byte时,则出现跨缓存行现象,缓存一致性协议失效,这时则会锁总线(cpu缓存与主存之间数据交换的渠道)

未完待续......