INTERACTIVE LAB

systemsVIP0 次浏览 更新于 2026-09-29

进程、线程与协程

系统讲解“进程、线程与协程”的核心概念、常用方法与实践要点。

前言

线程与进程,这是两个非常通用的概念,并不仅仅局限于语言本身,因为这是操作系统所提供的,无论什么语言,特别是偏底层语言(比如c、c++、rust等),都能通过对应的函数来创建、操作进程与线程。

但同时要注意,操作系统也有不同类型的,比如主流的windows系统、linux系统、mac系统等等。

虽然各个系统都统一有进程与线程这两个概念,但具体的调用方式,也就是函数接口并不完全一致。

所以如果你使用C/C++在不同的系统上开发软件,并且不使用跨平台的库,那么调用的API就不相同,这也就导致你的程序不跨平台,从而开发难度倍增。

而高级的语言则会提供跨平台的库,比如java、python、rust等等,无论什么平台,都给你提供统一的调用接口,从而实现一份代码,跨平台运行,减少程序员的开发量。

至于协程,则是为了提高线程效率而在应用层实现的一个概念,使得一个线程可以拥有多个协程执行任务。

进程

首先我们来聊聊进程,最直观的解释就是:一个应用程序就是一个进程

或者更进一步的说,一个windows平台上以.exe后缀结尾的可执行文件,当其运行起来之后就是一个进程。

虽然这么说在现在看来有些不合适了,但对于新手理解起来确实会更加的容易。

我们可以在window系统中的任务管理器中看到当前电脑上所有运行中的进程(应用程序):

image-20230927143101328

调出方式为:Win+X快捷键,然后选择任务管理器菜单。

这个页面就是当前我电脑上运行的所有进程,也就是所有的应用程序。

对于操作系统来说,进程是基本的资源分配单位。

怎么理解?比如上图每个进程后面有CPU、内存等内容,其中列出的就是当前某个进程所占用的系统内存、CPU,也就是系统资源。

所以如果你发现电脑卡了,就可以来到任务管理器中,看看是哪个进程占CPU、内存多,然后将它关闭即可。

这就是进程的基本概念:资源分配的基本单位。

并且各个进程是彼此独立的,比如,你QQ崩溃了,一般来说,是不会影响微信的!

但你会发现,任务管理器中很多进程是可以展开的:

image-20230927144021435

比如我在当前浏览器中,打开了本站点,这里就会出现一个标签页。

如果外面的Microsoft Edge是进程,那这些叫什么呢?它们后面也有内存、CPU占用啊!

而这就是前面我说的不合适的原因了,因为现在很多程序都偏爱制作多进程应用。

也就是说,一个应用本身是一个进程组,它是一系列进程的集合,而不单单只是一个进程。

这样做肯定是有好处也有坏处的。

好处就是刚刚所说,进程之间相互彼此独立,比如浏览器中,我一个页面崩溃了,并不会导致整个浏览器崩溃,同时也不会影响到其它页面。

但坏处也很明显,因为每个进程都需要分配资源,就会导致多进程应用对资源占有量一般都比单进程要大的多。

不信的话你可以试一试在浏览器中一次性开几十个页面,一般电脑可能就直接卡死了,不过由于现代浏览器会自动将不活跃的页面休眠释放资源,也不一定会卡死。

以一个基本的C语言代码为例:

int main(){}

虽然它什么也没干,但只要你编译执行它,那它就是一个进程!

关系图如下:

graph TD OS[系统] --> P1[进程1] OS --> P2[进程2] P1 -.-> PNote[进程是资源分配单位<br/>多个进程互相独立]

线程

进程很容易理解,就是电脑资源分配的基本单位嘛,并且各个进程相互独立。

那么线程呢?

可能你早就看到过线程的概念,只不过你从来没有注意过。

因为在你买手机、电脑的时候,一般都会有一个配置说明:几核几线程。

比如我的电脑就是14核20线程:

image.png

一般来说,一个物理核心同时只能执行一个线程,只不过现代CPU大多采用了超线程技术,让某些物理核心可以同时执行两个线程,因此就会出现线程数量比核心数量多的情况。

而CPU核心是干嘛的?当然是执行计算了,换句话说,就是执行代码的。

该实验为 VIP 专享内容,
请开通后继续阅读后续 70% 并运行完整示例~

DISCUSSION

评论 0

还没有评论,来留下第一条吧。