并发_JMM与并发三大特性
2023-03-29 15:01:13 13 举报
AI智能生成
JMM,并发
作者其他创作
大纲/内容
计算机基础
计算机五大核心组成部分
控制器(Control)
运算器(Datapath)
存储器(Memory)
输入(Input system)
输出(Output system)
CPU指令结构
控制单元
控制单元是整个CPU的指挥控制中心,由指令寄存器IR(Instruction Register)、指令译码器ID(Instruction Decoder)和 操作控制器OC(Operation Controller) 等组成
运算单元
运算单元是运算器的核心。可以执行算术运算(包括加减乘数等基本运算及其附加运算)和逻辑运算(包括移位、逻辑测试或两个值比较
数据单元
存储单元包括 CPU 片内缓存Cache和寄存器组,是 CPU 中暂时存放数据的地方
CPU缓存结构
三级缓存结构
L1 Cache,分为数据缓存和指令缓存,逻辑核独占
L2 Cache,物理核独占,逻辑核共享
L3 Cache,所有物理核共享
特点
存储器存储空间大小:内存>L3>L2>L1>寄存器
存储器速度快慢排序:寄存器>L1>L2>L3>内存;
高速缓存以解决I\O速度和CPU运算速度之间的不匹配问题
CPU运行安全等级
4个运行级别
ring0
ring1
ring2
ring3
ring1
ring2
ring3
操作系统内部内部程序指令通常运行在ring0级别
Linux与Windows只用到了2个级别:ring0、ring3
,操作系统以外的第三方程序运行在ring3级别
第三方程序如果要调用操作系统内部函数功能,由于运行安全级别不够,必须切换CPU运行状态,从ring3切换到ring0,然后执行系统函数
所以线程阻塞唤醒是重型操作了
内存管理
用户空间
可由用户代码 和 内核代码进行引用
内核空间
只能由内核代码进行访问
因为有两种空间,进程与线程只能运行在用户方式(usermode)或内核方式(kernelmode)下
内核线程(KLT)
系统内核管理线程(KLT),内核保存线程的状态和上下文信息,线程阻塞不会引起进程阻塞。在多处理器系统上,多线程在多处理器上并行运行。线程的创建、调度和管理由内核完成,效率比ULT要慢,比进程操作快。
用户线程(ULT)
用户程序实现,不依赖操作系统核心,应用提供创建、同步、调度和管理线程的函数来控制用户线程。不需要用户态/内核态切换,速度快。内核对ULT无感知,线程阻塞则进程(包括它的所有线程)阻塞。
CPU高速缓存
局部性原理
在CPU访问存储设备时,无论是存取数据抑或存取指令,都趋于聚集在一片连续的区域中,这就是局部性原理
时间局部性(Temporal Locality)
空间局部性(Spatial Locality)
如果一个存储器的位置被引用,那么将来他附近的位置也会被引用
比如顺序执行的代码、连续创建的两个对象、数组等
例如一个二维数据求和,你横向相加的速度,必定快于纵向相加的速度
JMM模型
JMM是围绕原子性,有序性、可见性展开
主内存
是共享数据区域
所有线程创建的实例对象都存放在主内存中
实例对象是成员变量还是方法中的本地变量(也称局部变量)
信息包括
类信息
常量
态变量
多条线程对同一个变量进行访问可能会发生线程安全问题
工作内存
主要存储当前方法的所有本地变量信息
还有主内存中的变量副本拷贝
线程中的本地变量对其它线程是不可见的
线程间无法相互访问工作内存,因此存储在工作内存的数据不存在线程安全问题。
内存模型与硬件内存架构的关系
硬件内存
寄存器
缓存
主内存
JMM
主内存
工作内存
JMM只是一种抽象的概念,是一组规则,并不实际存在
主内存与工作内存之间的具体交互协议
八大原子操作
lock(锁定)
unlock(解锁)
read(读取)
load(载入)
use(使用)
assign(赋值)
store(存储)
write(写入)
并发编程的可见性,原子性与有序性问题
可见性
当一个线程修改了共享变量的值,其他线程能够看到修改的值
保证可见性
通过 volatile 关键字
通过 内存屏障
通过 synchronized
通过 Lock
通过 final
有序性
即程序执行的顺序按照代码的先后顺序执行
原子性
一个或多个操作,要么全部执行且在执行过程中不被任何因素打断,要么全部不执行
CPU高速缓存
局部性原理
在CPU访问存储设备时,无论是存取数据抑或存取指令,都趋于聚集在一片连续的区域中,这就是局部性原理
时间局部性(Temporal Locality)
空间局部性(Spatial Locality)
如果一个存储器的位置被引用,那么将来他附近的位置也会被引用
比如顺序执行的代码、连续创建的两个对象、数组等
例如一个二维数据求和,你横向相加的速度,必定快于纵向相加的速度
0 条评论
下一页