多线程相关基本知识

本文涉及知识点: 并发与并行概念,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缓存与主存之间数据交换的渠道)


用户态与内核态

Linux的架构中将特权分为两个层次,0与3,其中0的特权等级高于3,0特权级在操纵系统资源上是没有任何限制的,可以执行任何操作,而3则会受到极大的限制。我们把特权级0称之为内核态,特权级3称之为用户态。

普通的应用程序线程在用户态(rang 3),涉及io,socket等操作的线程在内核态,当应用程序涉及到io等操作是涉及的线程会切换为内核态(rang 0),使用完毕再切换回用户态

线程的创建时  java 中 new Thread().start 则调用内核态函数创建线程 

线程上下文切换在内核态中处理

 

未完待续......

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值