操作系统底层认识(并发基础)
在深入了解和掌握并发之前,我们首先得先对我们所使用的操作系统底层的工作原理有一个大概的认识,对于我们后端开发人员来说操作系统中最最重要的两块是 CPU 和 内存。所以后面重点讲解的也在这两块。
冯诺依曼计算机模型
冯诺依曼计算机模型我想大家多多少少都有听过,我们现在的计算机模型都是基于这个发展而来。
计算机在运行时,控制器从内存中读取第一条指令,根据指令的指示去对应的内存中取数据进行相应的运算,将得出的计算结果再写回内存中,然后取出第二条指令同样在控制器的指挥下完成对应的操作,重复以上动作直到遇到停止命令。
程序和数据一样存储,一条一条的读取指令,自动的完成相应的动作。是计算机最基本的模型。
计算机五大核心组成部分
- 控制器
控制器相当于人脑的中枢神经,控制协调调度计算机其他组件的工作和运行 - 运算器
运算器顾名思义,主要是负责数据的运算和加工。 - 存储器
存储器用于数据的存储,已经在必要的时候提供数据支持。 - 输入设备
输入设备和输出设备统称为外设,输入设备负责将数据、程序等原始信息采集到计算机中来,如鼠标、键盘 - 输出设备
输出设备负责最终将数据的计算结果进行展示,如显示屏、打印机、投影仪等
上图是一个比较抽象的概念,对应于我们现代的计算机如下图构成
对应有 CPU 、系统总线 、内存条 等
那我们重点在于了解 CPU 与内存之间的整体运作模式
CPU 整体结构
控制单元
运算单元
存储单元
-
控制单元
控制单元由指令寄存器 IR (Instruction Register),指令译码器 ID (Instruction Decoder),操作控制器 OC (Operation Controller)。控制单元是协调操纵计算机的重要组成单元,它依次读取用户预先编译好的程序指令,存放到指令寄存器中,通过指令译码器确定指令操作,由操作控制器按确定的时序发送信号协调各个单元执行相关指令操作。 -
运算单元
运算单元是运算器的核心,它可以执行算数运算以及逻辑运算等操作。其接收控制单元发来的信号进行相应的行动,是一个执行单元。 -
存储单元
存储单元包含了 CPU 内部缓存以及寄存器,是 CPU 内部暂存数据的地方,其中对寄存器的访问是最快的。
CPU 缓存结构
CPU 为了平衡与内存直接读写效率上的差异设置了多级缓存
L1:逻辑核独享,逻辑上分为两部分 指令缓存、数据缓存
L2:物理核独享,逻辑核共享
L3:物理核共享
存储器存储空间大小:内存>L3>L2>L1>寄存器;
存储器速度快慢排序:寄存器>L1>L2>L3>内存;
缓存是由最小的存储区块-缓存行(cacheline)组成,缓存行大小通常为64byte。
CPU 读取内存数据过程
如果 CPU 要访问某一变量 A它首先会先从 L1 缓存中找变量 A ,如果没有找到,到 L2 中找,还是没有继续向下寻找 L3 -> 内存 最后从内存中读取数据,此时从内存读取 A 变量,拷贝一份副本到 L3 中,然后再拷贝一份到 L2,向上读取拷贝,最后寄存器从 L1 中拿到数据进行相应计算,最后将计算结果逐级写回到主内存中。(整个读取过程会锁住相应的缓存行)
同时 CPU 在读取数据的时候会遵循两个元则,空间局部性原则和时间局部性原则
空间局部性原则:CPU 认为在读取一个数据的时候其临近的数据也有很大的可能被读取到所以在加载的时候会将临近的一段数据也一并加载到缓存中。
时间局部性原则:CPU 在访问一个数据的时候会认为这个数据在接下来的一段时间内很有可能被再次访问到,所以会保留最近访问的数据副本在缓存中。
CPU 安全级别
CPU 在运行时划分了四个安全级别
ring0、ring1、ring2、ring3
其权限逐级递减。大多数的操作系统都只用到了 ring0 和 ring3 这两个级别,一般操作系统内部程序指令需要运行在 ring0 级别下,一般的用户操作运行在 ring3 级别。比如我们想创建一个线程 CPU 就需要从 ring3 级别先切换到 ring0 级别创建线程,创建成功后再从 ring0 级别切换回 ring3 级别。
如果要运行系统内部的某些函数操作,因为权限不够就需要进行安全级别的切换,这个操作对于 CPU 来说是较为重型的操作。
操作系统的内存管理
对于我们常用的操作系统,Windows 或者 Linux 其内存也是有着一块管理和划分的。
分为用户空间和内核空间,这样的划分也是出于系统安全的考虑。
以 32 位 4 G 内存的系统举例,其 1 G 内存会被划分为内核空间,其余 3 G 划分为用户空间。
内核空间只能由系统内部代码进行访问,这意味着,4 G 的内存只有 3 G 是可以由用户程序使用支配的。进程与线程只能运行在用户模式下或者内核模式下,内核空间和用户空间各维护一个堆栈,互不共享,也就是说线程在切换运行模式时会丢弃之前的堆栈,用户调用运行在用户模式下,系统调用运行在内核模式下。
由此也划分出两种线程模型
- 用户线程模型 ULT
线程的创建使用及销毁由用户控制,不需要进行线程 用户态/内核态的切换,内核对其无感知,速度快,线程阻塞则进程阻塞 - 内核线程模型 KLT
线程的创建使用及销毁由操作系统来控制,需要进行切换,速度慢于 ULT,线程阻塞对进程运行无影响
JVM 使用的是内核线程模型。
进程与线程
进程:
每个应用程序即为一个进程,现代的操作系统每运行一个程序就会创建一个进程,进程是 OS (操作系统)分配资源的最小单位
线程:
线程是 OS 上 CPU 调度的最小单元,也被称为轻量级进程。一个进程可以分配多个线程,每个线程都有自己独立的堆栈,包括局部变量、计数器等,也可以访问共享的内存空间,CPU 在多个线程中高速切换,让使用者感觉是多个线程在同时进行,这就是并发。相似的概念为并行,并行是真正意义上的同时运行。
虚拟机指令集架构
这里简单说一下,感兴趣的同学可以查阅相关资料
分为两种
- 栈指令集架构
- 寄存器指令集架构
Java 是典型的栈指令集架构,具有跨平台的特性
本文地址:https://blog.csdn.net/w903328615/article/details/109347877
上一篇: 手把手教你从入门到玩转mysql