古法编程秘籍(五):什么是进程和线程?从软件到 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 负责执行;核心/硬件线程决定"同一时刻能跑多少"。

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

相关推荐
BLSxiaopanlaile29 分钟前
关于常见 map的一些比较探究
后端
爱编程的小金35 分钟前
前端请求库的下一个进化方向:从 Promise 到策略化
前端·alova·前端请求库·请求策略
hsg7736 分钟前
简述:Jensen Huang‘s Footsteps网站全内容分析
前端·javascript·数据库
花大师1 小时前
基于深度学习的鼠标轨迹真实性检测系统
后端
珑墨1 小时前
前端 AI 开发通用skill
前端
kyriewen1 小时前
一个人+Cursor,7天上线付费小程序:第1天我就想放弃了
前端·微信小程序·cursor
大家的林语冰1 小时前
Angular 王者归来,第 22 个主版本亮相,一大波前沿技术再度引领潮流!
前端·javascript·前端框架
小江的记录本1 小时前
【Spring全家桶】Spring Cloud 2023.0.x:微服务核心理论、CAP/BASE定理(附《思维导图》+《面试高频考点清单》)
java·spring boot·后端·spring·spring cloud·微服务·面试
老毛肚1 小时前
jeecgboot TS + Vue 模板化 03
前端·javascript·vue.js