Java并发基础(二)| 8月更文挑战

257 阅读5分钟

这是我参与8月更文挑战的第3天,活动详情查看:8月更文挑战

前言

Java并发基础一主要介绍了冯诺依曼计算机模型,进程与线程,线程模型,内核态和用户态等概念,本文主要介绍CPU基本架构,CPU上下文切换的一些场景,介绍CPU硬件架构模型中一些常见的术语。

1. 计算机硬件架构图

image.png

2. CPU内部结构

  • 控制单元
  • 存储单元
  • 运算单元

image.png

2.1 控制单元

控制单元是整个CPU的指挥控制中心,由指令寄存器IR(Instruction Register)、指令 译码器ID(Instruction Decoder)和 操作控制器OC(Operation Controller) 等组成, 对协调整个电脑有序工作极为重要。

2.2 运算单元

运算单元是运算器的核心。可以执行算术运算(包括加减乘数等基本运算及其附加运算) 和逻辑运算(包括移位、逻辑测试或两个值比较)

2.3 存储单元

存储单元包括 CPU 片内缓存Cache和寄存器组,是 CPU 中暂时存放数据的地方,里面保存着那些等待处理的数据,或已经处理过的数据,CPU 访问寄存器所用的时间要比访问内存的时间短。

2.4 计算机硬件多CPU架构

image.png

2.4.1 多CPU

一般我们的计算机通常都会有两个或者两个以上的CPU组成的

2.4.2 CPU多核

一个多核的CPU也就是一个CPU上有多个处理器核心.
核心又是啥? 核心(Die)又称为内核,是CPU最重要的组成部分。CPU中心那块隆起的芯片就是核心,是由单晶硅以一定的生产工艺制造出来的,CPU所有的计算、接受/存储命令、处理数据都由核心执行。(百度百科:CPU内核)

2.4.3 CPU寄存器

每个CPU都包含一系列的寄存器,它们是CPU内内存的基础。CPU在寄存器上执行操作的 速度远大于在主存上执行的速度。这是因为CPU访问寄存器的速度远大于主存。

2.4.5 CPU缓存

即高速缓冲存储器,是位于CPU与主内存间的一种容量较小但速度很高的存储器。高速缓存还分成3级缓存。

2.4.6 内存

一个计算机还包含一个主存。所有的CPU都可以访问主存。主存通常比CPU中的缓存大得多.

CPU读取存储器数据过程

主要依据上面CPU架构图,取不同位置数据的值,经历的过程是不一样的,比如读寄存器里面的值直接读取, 读取缓存里面的值,涉及到3级缓存,存在枷锁解锁的过程。

3. CPU 上下文切换

我们知道,Linux 是一个多任务操作系统,它支持远大于 CPU 数量的任务同时运行。当然,这些任务实际上并不是真的在同时运行,而是因为系统在很短的时间内,将 CPU 轮流分配给它们,造成多任务同时运行的错觉。

每个任务运行前,CPU 都需要知道任务从哪里加载、又从哪里开始运行,也就是说,需要系统事先帮它设置好 CPU寄存器和程序计数器(Program Counter,PC)

3.1 什么是CPU上下文?

CPU 寄存器和程序计数器就是 CPU 上下文,因为它们都是 CPU 在运行任何任务前,必须的依赖环境。

3.2 什么是 CPU 上下文切换?

就是先把前一个任务的 CPU 上下文(也就是 CPU 寄存器和程序计数器)保存起来,然后加载新任务的上下文到这些寄存器和程序计数器,最后再跳转到程序计数器所指的新位置,运行新任务。

而这些保存下来的上下文,会存储在系统内核中,并在任务重新调度执行时再次加载进来。这样就能保证任务原来的状态不受影响,让任务看起来还是连续运行。

根据任务的不同,CPU的上下文切换可以分为不同的场景,也就是进程上下文切换线程上下文切换中断上下文切换

3.2 进程上下文切换

Linux 按照特权等级,把进程的运行空间分为内核空间和用户空间,分别对应着下图中, CPU 特权等级的 Ring 0 和 Ring 3。

  • 内核空间(Ring 0)具有最高权限,可以直接访问所有资源;
  • 用户空间(Ring 3)只能访问受限资源,不能直接访问内存等硬件设备,必须通过系统调用陷入到内核中,才能访问这些特权资源。

image.png

进程既可以在用户空间运行,又可以在内核空间中运行。从用户态到内核态的转变,需要通过系统调用来完成。

  • 进程上下文切换,是指从一个进程切换到另一个进程运行。
  • 而系统调用过程中一直是同一个进程在运行。 所以,系统调用过程通常称为特权模式切换,而不是上下文切换。但实际上,系统调用过程中,CPU 的上下文切换还是无法避免的。

进程上下文切换跟系统调用又有什么区别呢?

image.png

3.3 线程上下文切换

线程与进程最大的区别在于:线程是调度的基本单位,而进程则是资源拥有的基本单位。说白了,所谓内核中的任务调度,实际上的调度对象是线程;而进程只是给线程提供了虚拟内存、全局变量等资源。

3.4 中断上下文切换

为了快速响应硬件的事件,中断处理会打断进程的正常调度和执行,转而调用中断处理程序,响应设备事件。而在打断其他进程时,就需要将进程当前的状态保存下来,这样在中断结束后,进程仍然可以从原来的状态恢复运行。

参考

深入理解CPU上下文切换

性能瓶颈--CPU(上下文切换)