作者简介

CodeStats开源项目作者、全栈底层技术深耕者,自研 IoC 容器、手写简易 Tomcat,深耕 Java Web 底层造轮实战。长期以硬核源码解析+落地实战的方式,拆解框架与计算机底层逻辑,摒弃空谈理论,用通俗语言讲透硬核技术。专注帮开发者打通技术底层认知,借助AI赋能开发,大幅提升编程效率,让复杂的计算机原理,人人都能听懂、看透、学懂。


📑 目录

  1. 第一个问题:程序执行,本质上到底在干什么?

  2. 冯·诺依曼的答案:一台“愚蠢”但极快的机器长什么样?

  3. 指令的真相:CPU 真的“听懂”高级语言吗?

  4. 操作系统登场:如何用一个 CPU “欺骗”无数个程序?

  5. 中断的本质:谁在背后强行打断 CPU?

  6. 终极回答:你移动鼠标时,CPU 到底执行了什么?

很多人写了几年代码,始终搞不懂一个核心问题:

为什么双击一个软件、运行一段代码,程序就能跑起来?CPU 到底是怎么执行代码的?明明单核 CPU 只能串行工作,为什么电脑能同时运行浏览器、音乐、办公软件,毫无卡顿?

看似神奇的电脑运行效果,根本没有任何“黑魔法”。

所有程序的运行、系统的并发、鼠标键盘的响应,全部逃不出 冯·诺依曼架构 的底层逻辑。

今天抛开晦涩公式、摒弃空洞理论,从 CPU 单条指令执行,到操作系统的“欺骗式并发”,一次性讲透程序运行的终极本质。全文干货无废话,看懂这篇,彻底打通计算机底层认知!


一、程序执行的终极本质:CPU 只会做一件“蠢事”

我们写的 Java、C++、Python 高级代码,IDE、编译器、框架,全都是上层封装。剥离所有软件层外衣,直达硬件底层,CPU 的工作逻辑简单到极致。

CPU 没有理解能力、没有思维、不会“读懂代码”,它只会机械执行一套无限循环的固定流程:

  1. 查看程序计数器(PC):这是一张专属“便签”,记录下一条指令的内存地址;

  2. 根据地址,从内存中取出对应指令;

  3. 执行指令(运算、搬数据、跳转地址等);

  4. 更新程序计数器,指向下一条指令;

  5. 重复以上所有步骤,无限循环。

一句话总结:程序运行,就是程序计数器不断“指路”,CPU 机械执行的过程。

CPU 就像一台极致高速的复读机,笨拙、死板,但每秒可以重复数十亿次循环,这就是所有软件运行的底层根基。


二、冯·诺依曼架构:所有电脑的终极蓝图

如今的智能手机、超级计算机、台式电脑,无论性能多强、功能多复杂,全部沿用70多年前的冯·诺依曼架构。整套体系仅由5个核心部件组成,用厨房类比,一秒看懂核心逻辑:

核心部件

厨房类比

核心作用

存储器(内存)

带编号的菜谱+食材货架

存储所有程序指令(菜谱)和运行数据(食材),每个内存格子有唯一地址

运算器(ALU)

厨师的手与刀具

只负责纯粹运算:加减、比较、数值处理,无任何逻辑判断能力

控制器(CU)

厨师的大脑

读取指令、分发任务、控制整机运行节奏

程序计数器(PC)

手指

全文最核心部件,永远指向下一步要执行的指令地址

总线

传输传送带

负责数据、指令传输,同一时间只能传输一样内容,这就是经典冯·诺依曼瓶颈

核心结论:程序就是内存中有序排列的二进制指令集合,程序运行,就是CPU顺着PC指针,逐行取指、执行的全过程。


三、颠覆认知:CPU 根本听不懂你写的代码

很多新手误区:认为 CPU 可以识别 Java、C++ 等高级语言。

大错特错!CPU 唯一能识别的语言,只有机器码(0和1)

我们手写的高级代码,必须经过编译、解释层层翻译,最终转化为 CPU 可识别的二进制指令。

以最简单的 a = 1 + 1 为例,最终会被拆解为3条底层机器指令:

  1. LOAD R1, [100]:将内存100地址的数值1,载入CPU内部寄存器R1;

  2. LOAD R2, [101]:将内存101地址的数值1,载入CPU内部寄存器R2;

  3. ADD R1, R2:运算器计算两数之和,结果覆盖回R1寄存器。

看似一步到位的加法运算,CPU 需要走完完整的时钟周期流程,全程机械执行,无任何“理解”:

  • 时钟周期1:PC指向首条指令,CPU读取指令;

  • 时钟周期2:执行取数操作,PC自动后移;

  • 时钟周期3:读取第二条指令;

  • 时钟周期4:执行二次取数,PC继续后移;

  • 时钟周期5:读取加法指令;

  • 时钟周期6:执行运算,完成赋值。

这就是代码运行的真相:所有高级逻辑,都会被拆解为无数条简单的CPU指令,由PC指针逐行驱动执行。


四、操作系统的核心骗局:单核CPU如何实现“同时运行”?

核心问题:CPU 同一时间只能执行一条指令,为什么电脑能同时挂着微信、浏览器、音乐、文档?

答案很扎心:我们看到的“并发”,是操作系统精心编织的骗局。

真正的真相是:单核CPU永远只能串行执行程序,所谓同时运行,是高速切换的视觉错觉。

操作系统是拥有最高硬件权限的特殊程序,依靠时间片+中断机制,实现多程序调度,整套流程堪称极致的“换人操作”:

  1. 定时闹钟:主板硬件定时器,每隔1毫秒左右就向CPU发送硬件中断信号;

  2. 强制夺权:CPU执行完当前指令后,检测到中断信号,立刻暂停当前用户程序;

  3. 进程快照(保存现场):操作系统记录当前程序所有寄存器状态、PC指针地址,完整存档到内存进程表;

  4. 切换程序(恢复现场):从进程表调取另一个程序的存档,还原寄存器与PC指针状态;

  5. 继续执行:CPU顺着新的PC指针,继续执行新程序的指令。

操作系统每秒会在几十个、上百个程序间切换上千次,切换速度远超人类视觉感知。我们以为的“多程序并行”,本质是CPU 高速轮流执行不同程序的指令片段


五、中断:掌控CPU的底层核心开关

大家肯定疑惑:CPU 为什么会乖乖听操作系统调度?凭什么能被强行暂停、切换?

核心关键:中断

中断不是软件代码,是硬件级电信号,是用户程序与操作系统控制权切换的唯一桥梁。没有中断,操作系统永远无法主动调度CPU。

日常电脑运行中,三类中断最核心:

  • 定时器中断:操作系统并发调度的核心,用于进程时间片切换;

  • 外设中断:鼠标、键盘、U盘等设备触发,通知CPU处理外部数据;

  • 软中断:程序主动调用 read、write 等系统调用时触发,主动请求内核服务。

CPU 处理中断的逻辑,是硬件固化、不可更改的:

  1. 执行完当前整条指令,绝不中途中断;

  2. 检测硬件中断引脚,判断是否有信号传入;

  3. 若有中断,立刻保存当前PC指针、程序状态到内核栈;

  4. 查询中断向量表,锁定对应的内核处理程序地址;

  5. 强制修改PC指针,跳转执行内核中断逻辑;

  6. 处理完成后,恢复原有程序状态,继续正常执行。


六、场景落地:移动一次鼠标,CPU完整执行链路

结合上面所有原理,我们拆解一个最日常的场景:轻轻移动鼠标1毫米,电脑底层完整的执行流程,看懂才算真正吃透原理。

1. 硬件层:触发信号

鼠标光学传感器捕捉位移变化,USB控制器将动作编码为标准电信号,向主板中断控制器发送外设中断请求。

2. CPU硬件层:强制跳转

CPU 跑完当前正在执行的软件指令,检测到鼠标中断信号,暂停当前程序,保存运行现场,根据中断号跳转至操作系统鼠标处理程序。

3. 内核层:处理数据

操作系统读取USB端口的位移数据,封装成鼠标移动事件,存入对应前台程序的消息队列;同时判断时间片是否耗尽,按需触发进程调度。

4. 应用层:响应事件

当前台程序(游戏、桌面、浏览器)被调度获得CPU时间片后,读取消息队列中的鼠标事件,执行业务逻辑(调整视角、移动光标等)。

5. 输出层:画面更新

程序调用图形接口,将最新画面数据传递给显卡,渲染输出,我们最终看到鼠标光标移动。

整个过程中,CPU 全程不认识“鼠标”,不懂“画面”,它只忠实完成一件事:跟着PC指针执行指令、响应中断、切换程序。


七、终极总结:计算机底层的4个核心本质

读完全文,彻底告别底层迷茫,记住这4个终极结论,吃透所有程序运行逻辑:

  1. 程序的本质:存储在内存中,有序排列的二进制机器指令集合;

  2. 程序执行的本质:CPU 循环执行「取指令-执行指令-更新PC指针」的机械过程;

  3. 并发的本质:操作系统利用定时器中断,高速切换进程现场,制造并行错觉;

  4. 外设交互的本质:硬件触发中断,强制接管CPU控制权,完成数据读写与响应。

计算机从无魔法,只有极致严谨的工程逻辑。

所有复杂的框架、系统、软件,拆到底层,都是 PC 指针与中断机制的简单配合。看懂这些,你就比80%的开发者更懂计算机底层!


✅ 码字不易、硬核干货无注水

建议点赞+收藏,彻底吃透程序运行底层逻辑!后续持续更新底层原理、源码拆解、AI赋能开发实战,关注我,带你跳出表层编码,深耕底层本质,实现技术进阶!

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐