探讨进程、线程和协程的区别

·  阅读 450

前言

「这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战

探讨进程、线程和协程的区别一直是一个热门话题,特别是面试的时候,这个问题也成为了面试中的”八股文“。

每次面试的时候,回答这个问题的时候我其实都是比较心虚的,即使我提前背好了答案,究其原因还是我不理解它们之间的区别,

所以,这篇文章来了,也是我最近研究三者区别的一点总结,希望对大家有所帮助!

概念

首先从概念讲起,进程的定义是”正在运行中的程序的一个抽象“,这句话有几个关键点,一是它是一个程序,二是它是运行中的。

怎么理解这句话呢,比如我们的操作系统,会按照各种软件,比如音乐软件,或者社交软件(微信、QQ),这些软件就是一个程序,当它们没运行的时候,并不会产生一个进程,当它们运行了,这时候进程就出现了(在这里不讨论这些程序是否使用多进程)。

接下来就是线程了,线程的定义操作系统能够进行运算调度的最小单位,大部分情况下,它们被包含在进程之中,是进程中实际运作单位。这句话同样有几个关键点,一是运算调度,二是包含在进程中

怎么理解这句话呢,其实就是创建一个进程的时候,实际上也会创建一个线程,进程中的任务实际是由线程执行的,进程包含线程,它们是包含的关系,一个进程可以有多个线程。

不过,上面的解释是基于一定前提的,就是在Linux系统下,且内核版本大于2.6。因为不同操作系统,对进程线程的设计是不同的,而且就算是Linux系统,不同内核版本,进程线程的设计也是不同的。

最后就是协程了,根据维基百科的解释,协程的定义是计算机程序的一类组件,推广了协作式多任务的子例程,允许执行被挂起与被恢复。

说实话,这句话真的是”听君一席话,如听一席话“。为了更好地理解,我总结了下,协程和线程主要有两点不同:一是是否由系统调度,二是是抢占式调度还是协作式调度

对于线程,它由操作系统调度,并由其调度器决定是哪个线程运行,调度算法是抢占式的,且属于操作系统内核中的一种算法;而对于协程,其调度算法由程序员或者编程语言决定,且调度算法是协作式调度,即协程是主动让出,让其他协程去执行(通过关键字yield)。

关系

一个进程包含多个线程,它们之间是 1:N的关系;

一个线程可以包含多个协程,它们一般是 1:N的关系,但也有 N:M 关系,即多个线程对应多个协程,典型如Goroutine。

区别

前面已经从定义上,简单讲解了三者的区别,接下来会从其他方面来进行对比。

进程 VS 线程

1、进程是操作系统资源分配的基本单位,线程是操作系统运行调度的基本单位

2、进程的内存地址空间是隔离的,线程的内存地址空间是共享

3、进程之间是互相独立的,线程之间是独立又共享

4、进程上下文切换时,资源消耗较大;线程上下文切换时,资源消耗较少

线程 VS 协程

1、线程由操作系统调度,协程由用户或者编程语言调度

2、线程是抢占式调度,协程是协作式调度

3、线程上下文切换时,资源消耗较大;协程上下文切换时,资源消耗较少(进程 > 线程 > 协程)

4、线程能利用CPU多核的优势,实现并行;协程无法利用CPU多核的优势(1:N的模型下),只能实现并发(并不意味协程就比线程慢)

5、线程切换会涉及到内核态,而协程切换纯粹在用户态进行

写在最后

以上就是我这段时间研究进程、线程、协程的一些总结啦,如果有用的话,麻烦点个赞哇!!

参考

协程
Difference between a "coroutine" and a "thread"

分类:
后端
收藏成功!
已添加到「」, 点击更改