计算机原理(一)操作系统底层浅析
一、冯诺依曼计算机模型详解
重要性:现代计算机的产生是基于冯诺依曼计算机模型设计的。
计算机五大核心组成部分
- 运算器:顾名思义,主要进行计算,算术运算、逻辑运算等都由它来完成。
- 存储器:这里存储器只是内存,不包括内存,用于存储数据、指令信息。
- 控制器:控制器是是所有设备的调度中心,系统的正常运行都是有它来调配。
- 输入设备:负责向计算机中输入数据,如鼠标、键盘等。
- 输出设备:负责输出计算机指令执行后的数据,如显示器、打印机等。
根据冯诺依曼计算机模型发展至今,衍生出来的硬件很多,但对于我们程序员来说比较核心的有两部分:CPU、内存,所以下面我们重点学习的也是这两部分。
二、CPU
定义:CPU(central processing unit),即中央处理器。在冯诺依曼计算机体系中,CPU一般是由控制器和运算器两部分组成。
PS:一个计算机可以装多个CPU【主板决定的】
PS:多个CPU和多个核是不一样的概念,一个CPU可以有多个核
PS:核又分为逻辑核和物理核。【windows可以通过任务管理器查看】
//打印逻辑核数量 int i = Runtime.getRuntime().availableProcessors();
CPU指令结构
CPU内部结构:
- 控制单元
- 运算单元
- 数据单元
下面通过一张图来简单了解一下CPU和内存交互的模型:
控制单元
定义:控制单元是整个CPU的指挥控制中心,对协调整个电脑有序工作极为重要。
组成:
- 指令寄存器IR(Instruction Register)
- 指令译码器ID(Instruction Decoder)
- 操作控制器OC(Operation Controller)
工作流程:
根据用户预先编好的程序,依次从存储器中取出各条指令,放在指令寄存器IR中
通过指令译码器ID进行指令译码(分析)确定应该进行什么操作
操作控制器OC按确定的时序,向相应的部件发出微操作控制信号。
运算单元
定义:运算单元是运算器的核心。可以执行算术运算和逻辑运算。
工作流程:运算单元所进行的全部操作都是由控制单元发出的控制信号来指挥的。【执行部件】
存储单元
定义:CPU 中暂时存放数据的地方
组成:
- CPU片内缓存Cache
- 寄存器组
PS:CPU 访问寄存器所用的时间要比访问内存的时间短。寄存器是CPU内部的元件,拥有非常高的读写速度,所以在寄存器之间的数据传送非常快。
CPU缓存结构
现代CPU为了提升执行效率,减少CPU与内存的交互(交互影响CPU效率),一般在CPU上集成了多级缓存架构,常见的为三级缓存结构:
- L1 :分为数据缓存和指令缓存,逻辑核独占
- L2 :物理核独占,逻辑核共享
- L3 :所有物理核共享
PS:L1、L2内核独享 L3内核共享【均无法跨CPU共享】
存储器存储空间大小:内存>L3>L2>L1>寄存器
存储器速度快慢排序:寄存器>L1>L2>L3>内存
CPU做多级缓存【一般3级】的原因:
- CPU发展很快【摩尔定律18个月性能提升一个档次】,内存发展跟不上。
- CPU和内存插在不同的地方上,通信要通过物理的连接通道,影响性能。
缓存行
定义:缓存的最小存储区块
大小:通常为64byte【字节】
举个🌰:比如L1缓存大小是512kb,而缓存行大小为64byte,那么L1里就有512 * 1024/64缓存行~
CPU运行安全等级
CPU有4个运行级别:
- ring0【内核态】
- ring1
- ring2
- ring3【用户态】
Linux与Windows只用到了2个级别:ring0、ring3,操作系统内部内部程序指令通常运行在ring0级别,操作系统以外的第三方程序运行在ring3级别。
第三方程序如果要调用操作系统内部函数功能,由于运行安全级别不够,必须切换CPU运行状态,从ring3切换到ring0然后再执行系统函数,所以JVM创建线程,和线程阻塞唤醒是重型操作,因为CPU要切换运行状态,内部非常复杂。
PS:线程有2个堆栈,一个在内核态,一个在用户态【内部原理复杂不做了解,大致应该是在CPU需要切换运行状态时,堆栈信息也要有一份在相应的运行状态上】
三、进程与线程
什么是进程?
定义:进程是OS(操作系统)资源分配的最小单位。
现代操作系统在运行一个程序时,会为其创建一个进程。
举个🌰,启动一个Java程序,操作系统就会创建一个Java进程。
什么是线程?
定义:线程是OS(操作系统)调度CPU的最小单元。PS:也叫轻量级进程(Light Weight Process)。
在一个进程里可以创建多个线程,这些线程都拥有各自的计数器、堆栈和局部变量等属性, 并且能够访问共享的内存变量。
CPU在这些线程上高速切换,让使用者感觉到这些线程在同时执行,即并发的概念,相似的概念还有并行!
线程上下文切换过程
四、小问答
Q:JVM是采用的哪一种线程模型?
CPU调度的基本单位线程,也划分为:
- 内核线程模型(KLT)
- 用户线程模型(ULT)
JVM使用的是KLT内核线程模型。
内核线程模型(KLT)
内核保存线程的状态和上下文信息。
线程的创建、调度和管理由内核完成,效率比ULT要慢,比进程操作快。
PS:线程阻塞不会引起进程阻塞。
用户线程模型(ULT)
用户程序提供创建、同步、调度和管理线程的函数来控制用户线程。
不需要用户态/内核态切换,速度快。
PS:内核对ULT无感知,线程阻塞则进程(包括它的所有线程)阻塞。
Q:CPU读取存储器数据过程?
- 情况1:CPU直接读取寄存器X的值,最快。
- 情况2:CPU要取L1的某个值:
- 1、把缓存行锁住
- 2、取出数据
- 3、解锁。
- 情况3:CPU要取L2的某个值:
- 1、先到L1里取
- 2、L1当中不存在,则L2开始加锁
- 3、加锁以后,把L2里的数据复制到L1,再执行读L1的过程【上面3步】
- 4、解锁。
- 情况4:CPU取L3:与情况3类似,只不过先由L3复制到L2,再从L2复制到L1,然后从L1到CPU。
- 情况5:CPU取内存则最复杂:
- 1、通知内存控制器占用总线带宽
- 2、通知内存加锁
- 3、发起内存读请求
- 4、等待回应,回应数据保存到L3(如果没有就到L2),再从L3或者L2到L1,再从L1到CPU
- 5、解除总线锁定
Q:为什么JVM创建线程,线程阻塞唤醒是重型操作?
因为涉及到运行状态的切换,从ring3切换到ring0,然后执行系统函数,这中间的操作非常复杂。
Q:CPU为何要有高速缓存?
CPU在摩尔定律的指导下以每18个月翻一番的速度在发展,然而内存和硬盘的发展速度远远不及CPU,这就造成了高性能能的内存和硬盘价格及其昂贵。
然而CPU的高度运算需要高速的数据,为了解决这个问题,CPU厂商在CPU中内置了少量的高速缓存以解决I\O速度和CPU运算速度之间的不匹配问题。
Q:什么是局部性原理?
定义:在CPU访问存储设备时,无论是存取数据抑或存取指令,都趋于聚集在一片连续的区域中。
时间局部性(Temporal Locality)
如果一个信息项正在被访问,那么在近期它很可能还会被再次访问。
🌰:循环、递归、方法的反复调用等。
空间局部性(Spatial Locality)
如果一个存储器的位置被引用,那么将来他附近的位置也会被引用。
🌰:顺序执行的代码、连续创建的两个对象、数组等。
Q:带有高速缓存【3级缓存】的CPU执行计算的流程?
- 1.程序以及数据被加载到主内存
- 2. 指令和数据被加载到CPU的高速缓存
- 3. CPU执行指令,把结果写到高速缓存
- 4. 高速缓存中的数据写回主内存
Q:JVM创建线程CPU的工作过程?
- step1:CPU从ring3切换ring0创建线程【用户态->内核态】
- step2:创建完毕,CPU从ring0切换回ring3【内核态->用户态】
- step3:线程执行JVM程序【用户态内执行Java程序】
- step4:线程执行完毕后,线程的销毁还得切回ring0
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
2020-07-03 算法学习(一)冒泡排序