- 操作系统底层工作的整体认识
- cpu相关概念
- cpu的指令结构
- cpu的缓存结构
- cpu运行安全等级
- 内存相关概念
- JMM
- cpu与内存条通过io桥通讯
- cpu内部结构:
- 控制单元 控制类指令,例条件、循环
- 运算单元 运算
- 数据单元 寄存器。存储指令与指令操作的数据(临时存储运算结果)
- 内存:待运行的指令和数据。cpu的数据单元从内存中加载指令和数据。
硬盘
- 现代cpu为提升执行效率,减少cpu与内存之间的交互(交互影响cpu效率)。一般在cpu上集成多级缓存架构。常见三级缓存架构.
cpu速度发展很快,内存速度跟不上,为解决io速度跟不上cpu运算速度的问题,cpu加入了三级缓存。 - cpu读取存储器数据过程:
- 从寄存器X取值,只需要一步,直接读取。
- 从一级缓存(L1 cache)取值,需要1-3步(或者更多):锁住cache行------>取值------>解锁。如果没有锁住就慢了。
- 从二级缓存(L2 cache)取值: 数据在L2时发生。L2加锁,然后把数据复制到L1.再执行读L1的过程,最后解锁L2
- 从三级缓存取:数据在L3时发生,数据从L3复制到L2,从L2复制到L1,从L1到CPU。L3在CPU独享,L1/L2在内核独享。
- 从内存取:
- 通知内存控制器占用总线带宽
- 通知内存加锁
- 发起内存读请求
- 等待回应
- 回应的数据保存到L3(没有就到L2)
- 重复从三级缓存取数据操作
- 解除总线锁定
- 局部性原理:cpu访问存储设备时,趋于集聚在一片连续的区域中。
- 时间局部性:如果一个信息项正在被访问,那么近期很可能会被再次访问,比如循环、递归、方法的反复调用等。
- 空间局部性:如果一个存储器的位置被引用,那么将来他附近的位置也可能会被引用。比如顺序执行的代码、连续创建的两个对象、数组等。
- 内存分内核空间、用户空间
- cpu运行状态分为内核态、用户态
- cpu有4个运行级别:ring0/ring1/ring2/ring3/ring4
linux和window只用到了ring0和ring3,操作系统内部程序指令通常运行在ring0级别,操作系统以外的第三方程序运行在ring3级别。 - 运行状态切换:第三方程序如果要调用操作系统内部函数功能,由于运行安全级别不够,必须切换cpu运行状态,从ring3到ring0,然后执行系统函数。所以JVM创建线程,线程阻塞唤醒是重型操作,因为CPU要切换运行状态。
- JVM创建CPU过程:
- cpu从ring3切换到ring0创建线程
- 创建完毕,cpu从ring0切换会ring3
- 线程执行JVM程序
- 线程执行完毕,切回ring0销毁线程
- 一个进程包括多个线程
- 内核线程KLT:系统内核管理线程(KLT),内核保存线程的状态和上下文信息,线程阻塞不会引起进程阻塞。多线程在多处理器系统上并行运行。线程的创建调度和管理由内核完成,效率比ULT要慢,比进程操作快。java使用KLT模型。
- 用户线程ULT:用户程序实现,不依赖操作系统核心,应用提供创建、同步、调度和管理线程的函数来控制用户线程。不需要用户态/内核态切换,速度快。内核对ULT无感知,线程阻塞则进程(包括它所有线程)阻塞.
java内存模型(java memory model)是一种抽象的概念,并不真实存在,它描述的是一组规则。
- 可见性 volatile,java并发轻量级锁机制 可以解决可见性(能否及时看到)。不保证原子性。
- 原子性 synchronized()。Lock
- 有序性 volatile禁止重排优化。synchronized无法禁止指令重排
https://vip.tulingxueyuan.cn/detail/p_6006cac4e4b00ff4ed156218/8



