清楚明白进程、线程、协程

sunnyroc  2024-03-17 12:50  阅读 1,739 次 评论 0 条

进程

进程是运行中的程序(或者说代码),一个程序可以产生多个进程,多个进程之间的内存空间是独立的

图 1

进程由操作系统内核调度并分配资源,是分配资源的基本单位。在短时间内 cpu 可以在多个进程中快速切换造成多进程同时执行的错觉,这叫做并发,在多核 cpu 的情况下两个进程同时被不同的核心处理才叫并行

图 2:进程并发
图 3:进程并行

由于进程间资源不共享,所以需要通过 IPC 进行通信,而这会产生较大的资源开销,再加上进程间频繁切换产生的资源开销,进程间的并发一般只体现在操作系统上同时运行多个程序。

如果在同一个程序内需要并发执行(例如 Word 需要同时进行输入、统计、拼写检查、打印等 )的情况下如果使用多进程来处理那么显然会产生非常大的资源开销(比如进程创建与终止时的资源分配或释放、进程间的信息传递),所以我们需要更小的调度单位,也就是线程

线程

一个进程可以包含多个线程,线程是 cpu 调度的最小单位,同一进程内的不同线程可以共享进程的资源,但每个线程的栈是独立的

图 4:thread

进程把多个任务通过线程分为多个执行流程,所以线程是程序的实际执行者,所以每个进程至少要包含一个线程,因为线程间共享进程资源,信息传递成本更小,切换速度更快,所以线程可以减小并发执行的时间与空间开销

图 5

线程可以看成一个轻量级的进程,但是与进程一样,线程也由操作系统内核进行调度,频繁的创建、销毁、切换依然会对于系统内核造成不小的负担,虽然可以通过线程池来减小创建和销毁的开销,但并发调度产生的内核资源开销还是比较大的,而协程并发就是一种对内核透明,由开发者管理的并发手段

协程

协程又叫做微线程,同一线程内可以拥有多个协程,它相对于线程更轻量,默认情况下在 kb 级别(线程在 mb 级别)

协程是用户态的,并且对内核透明,所以协程完全由开发者编写的程序所控制和管理,所以在协程切换时对内核资源几乎没有开销,这也就实现了更高效的并发

同一线程内的协程是并发执行的(串行),即使 cpu 是多核的,可以支持进程并行和线程并行,但线程中的协程只能是并发执行的,当一个协程运行时其它协程会被挂起

由于在同一线程内并发执行,所以协程间不存在读写冲突,切换协程时只需要保存寄存器上下文和栈到线程的堆区并在恢复时读取即可,并且访问全局变量时不需要加锁。虽然单一线程下的协程无法实现并行,但换来了极高的并发效率

在 go 中的协程就是 goroutine,本质上是一个可以被随时挂起或恢复的特殊的函数,如果当前的 goroutine 被阻塞那么会主动把控制权交给同一线程内的其它协程,当所有 goroutine 被阻塞时自然就发生了程序的死锁

图 6

协程既不是进程也不是线程,无法相互替代

本篇文章来源于: Transistor

本文地址:https://www.roc666.com/2024/03/industry/language/processes_threads.html
版权声明:欢迎分享本文,转载请保留出处!
相关文章 关键词:

发表评论


表情