古法编程秘籍(五):什么是进程和线程?从软件到 CPU 的一次完整旅程

Hi!这里是 JustHappy 这是专为编程初学者准备的专栏。学了几年还分不清进程/线程/CPU线程/核心?这篇不背定义,带你把链路从"程序文件→进程→线程→系统调度→CPU执行→核心→硬件线程"一次串通:谁管资源、谁管调度、谁真在算。

我觉得这一篇《古法编程秘籍》最大的价值,不是背熟"进程是资源分配单位、线程是 CPU 调度单位"这种句子。

而是帮你第一次把这条链路搭起来: 软件世界 → 操作系统 → 硬件世界

很多人学了几年编程,还是会把下面这些东西混成一团:

进程 / 线程 / CPU 线程 / CPU 核心

但它们其实属于不同层级。你只要把层级搞清楚,概念就不会再打架

话不多说,我们开始吧!

先把三层世界摆出来

一台电脑你可以粗暴分成三层:

  • 应用软件:微信、Chrome、VSCode......
  • 操作系统:Windows / Linux / macOS
  • 硬件:CPU、内存、硬盘(SSD)

你写的代码,最终一定要落到硬件上执行;但它不是"直接落下去"的------中间必须经过操作系统这层"翻译 + 管理 + 调度"。

程序:它一开始只是硬盘里的文件

你写下 console.log("Hello") 的时候,很容易产生一种错觉:好像代码已经在工作了。

但在真正运行之前,它本质就是磁盘里的一个文件:

  • main.exe
  • node.exe
  • chrome.exe

这时候它还没开始跑,也没有占用你的内存,更没有"占用 CPU"。

所以更准确的说法是:

程序(Program)= 存在磁盘上的代码文件。

进程:程序一运行,就变成"一个被系统托管的实例"

当你双击打开 Chrome,操作系统会做一堆事(你看不见但它在忙):

  • 把程序从硬盘加载进内存
  • 给它分配内存空间
  • 准备运行环境、打开必要的资源
  • 建立各种系统层面的记录(方便管理)

这时候产生的就是 进程(Process)

你可以把它理解成一句人话:

进程 = 一个正在运行的软件实例。

同一个 Chrome,你开多个窗口,可能就会有多个进程(或者至少多个进程/子进程在协作),它们都归操作系统管。

线程:进程更像"容器",真正跑代码的是线程

很多人会误以为:进程负责执行代码。

其实进程更像一个"资源容器",它拥有(或说它名下挂着)这些东西:

  • 内存
  • 文件句柄
  • 网络连接
  • 缓存
  • 运行环境

但真正一行一行执行代码的,是 线程(Thread)

所以一句最关键的对照是:

进程负责拥有资源,线程负责执行代码。

而且一个进程里可以不止一个线程。比如浏览器里常见的结构大概是:

  • 渲染线程
  • 网络线程
  • GPU 相关线程
  • JS 线程(或者多线程协作)

到这里你要牢牢记住一句话:

线程是软件概念。

CPU:它根本不认识"Chrome",它只认识指令

现在我们进入硬件世界。

CPU 其实不认识这些词:Chrome、微信、VSCode、进程......

CPU 认识的只有两类东西:

  • 机器指令
  • "当前要执行的那条指令属于哪个执行流"(你可以理解为:属于哪个线程)

所以从 CPU 的视角,世界长这样:

某个线程的指令 → 执行 → 再换下一个线程的指令 → 执行......

也就是说:

CPU 调度/执行的对象是线程,而不是进程。

进程更像是操作系统层面的"管理单位";线程才是"交给 CPU 跑起来的执行单位"。

操作系统:真正的调度员

很多人以为 CPU 在"管理线程",其实不是。

CPU 主要负责算。

谁先算、谁后算、算多久、被打断怎么办------这些安排工作的是操作系统。

线程们会不断地对操作系统说:我准备好了,我要运行。

操作系统维护队列、优先级、时间片、各种调度策略,然后把"下一段该执行的线程"交给 CPU。

所以三者职责可以这么记:

  • 进程由操作系统管理(资源、隔离、权限等)
  • 线程由操作系统调度(谁先跑、跑多久)
  • CPU 负责执行(把指令真正算出来)

为啥你感觉"同时运行",但其实可能是轮流的

如果你只有一个 CPU 核心,那某一时刻它只能执行一个线程。

你看到的"微信 + Chrome + VSCode 同时在跑",更多时候其实是:

线程 A 跑一小会儿 → 暂停

线程 B 跑一小会儿 → 暂停

线程 C 跑一小会儿 → 暂停

切换速度太快,你就产生了"同时"的错觉。

真正意义上的并行,往往来自多核心:

一个核心同一时刻跑一个线程。

四核同一时刻理论上可以跑四个线程。

CPU 参数里的"线程":跟软件线程不是一回事

买 CPU 你会看到:8 核 16 线程、12 核 24 线程......

这里的"线程"说的不是你代码里创建的那种线程,而是 硬件线程(Hardware Thread) ------也就是 CPU 能同时暴露给操作系统的"硬件执行单元数量"(常见的就是超线程带来的效果)。

而你在程序里创建的,是 软件线程(Software Thread)

它们名字相同,但层级不同:

  • 软件线程:你程序能开多少个,主要看你写什么、系统允许什么(可以远大于 CPU 的线程数)
  • 硬件线程:CPU 能同时提供多少个"硬件执行位",数量是固定的(比如 16)

所以经常会发生这种结构:

你创建了 1000 个软件线程

↓ 操作系统调度

映射到 16 个硬件线程(可同时看到的执行单元)

↓ CPU 真正执行

一张图把这条链路记住

这条链路你记住就够了,剩下的概念都能往里放:

最后一句话:别再把它们当成同一个东西

进程、线程、CPU 核心、CPU 线程不是"一个概念的不同说法"。

它们是从软件到硬件的不同层级的名字:

程序是文件;进程是运行实例;线程是执行流;操作系统负责调度;CPU 负责执行;核心/硬件线程决定"同一时刻能跑多少"。

把层级分清楚,你再看任何"并发/并行/多线程"资料,都不会再像玄学。

相关推荐
AlienZHOU7 分钟前
AI Coding 时代下,我的技术面试实践分享
前端·后端·面试
狗头大军之江苏分军2 小时前
《潮水漫过十七岁》开学了
后端
苏三说技术3 小时前
如何看待GPT-6在UP主众测中碾压夺冠?它是现在最强大模型吗?
后端
mldong3 小时前
一份 JSON,一条能跑的审批流:把报销流程送上工作流引擎
后端·架构
wno7043 小时前
Spring Boot WebFlux增删改查
java·spring boot·后端
Captaincc3 小时前
AI用量v0.1.11更新发布 新增 jusage doctor 诊断指令 托盘展示token 和余额 新增 AutoClaw 支持
前端·后端·vibecoding
aramae4 小时前
模拟实现strlen()函数 (C语言)
c语言·开发语言·后端
计算机魔术师5 小时前
德国Wiki被黑后两周,OpenAI终于把模型失控的账本摊开了
前端
kyriewen5 小时前
我让 AI 当面试官面了我一轮:第 3 个追问我就卡住了(附 10 道追问清单)
前端·面试·ai编程
IT_陈寒6 小时前
Python的GIL把我坑惨了,多线程跑得比单线程还慢
前端·人工智能·后端