Skip to Content
面试题库Operating System[面试题] 进程、线程、协程的区别是什么?

[面试题] 进程、线程、协程的区别是什么?

📖 版块 A:知识讲解版 (温故知新)

  • 进程(Process)
    1. 程序的一次运行实例。
    2. 资源分配的基本单位,拥有独立的地址空间、打开文件、页表等资源。
    3. 隔离性最强,但创建和切换成本也最高。
  • 线程(Thread)
    1. 进程内的一个执行流。
    2. CPU 调度的基本单位
    3. 同一进程内多个线程共享代码段、堆、打开文件等资源,但各自有独立的程序计数器、寄存器和栈。
    4. 相比进程更轻量,但也因此带来了共享资源下的并发安全问题。
  • 协程(Coroutine)
    1. 可以理解成“用户态线程”或者“更轻量的执行单元”。
    2. 调度不依赖操作系统抢占,而由应用程序在用户态自行控制切换时机。
    3. 切换成本低,适合大量 IO 密集型任务。
  • 三者核心区别
    1. 资源拥有权:进程拥有独立资源;线程共享进程资源;协程通常共享线程资源。
    2. 调度者不同:进程和线程主要由操作系统调度;协程由用户态框架调度。
    3. 切换成本:进程切换最大,线程次之,协程最小。
    4. 隔离性:进程最强,线程和协程更轻但隔离更弱。

🎤 版块 B:面试实战版 (高手逐字稿)

Q:进程、线程、协程的区别是什么?

🧠 破局思路:这道题最好的答法不是三行定义,而是顺着“为什么会从进程演化到线程,再演化到协程”去讲,这样逻辑会非常顺。

💬 高手逐字稿

我一般会把进程、线程、协程理解成操作系统并发模型不断“做轻”的三个阶段。

最早的是进程。进程本质上是程序的一次运行实例,它拥有独立的地址空间和系统资源,所以隔离性非常强。也正因为它资源独立,操作系统才会把它作为资源分配的基本单位。但进程的代价也很明显:创建成本高,切换成本高,进程之间通信也比较重。

后来为了提升同一应用内部的并发能力,就有了线程。线程可以理解成进程里的执行流,它共享进程的大部分资源,比如堆内存、代码段、打开文件,但每个线程有自己独立的栈和程序计数器。线程的好处是切换比进程轻量得多,所以它成了 CPU 调度的基本单位。但线程也带来了新的问题,因为资源共享了,所以锁竞争、可见性、竞态条件这些并发问题也就跟着来了。

再往后,在大量 IO 密集型场景下,人们发现线程即便比进程轻,还是不够轻。线程切换依然要陷入内核,调度也依赖操作系统,所以就演化出了协程。协程最大的特点是:调度权从内核态挪到了用户态。 也就是说,什么时候挂起、什么时候恢复,不再完全由操作系统抢占式决定,而是由应用框架自己控制。这样切换成本会非常低,特别适合海量连接、异步 IO 这种场景。

所以如果做一个一句话总结:

  • 进程解决的是资源隔离和独立性问题。
  • 线程解决的是同一进程内如何高效并发执行的问题。
  • 协程解决的是线程仍然太重、用户想自己控制调度的问题。

如果面试官再追问“那协程是不是一定比线程好”,我会直接回答:不是。 协程轻是轻,但它通常更适合 IO 密集型任务;如果是纯 CPU 密集型任务,最终还是要靠多线程甚至多进程去吃满多核 CPU。

最后更新于:
⏱️

登录后开始阅读

当前 MVP 版本只开放邮箱密码登录注册。完成登录后即可进入面试题内容。

还没有账号?先去注册