进程、线程、协程的区别

        目录

1、什么是进程?

2、什么是线程?

3、什么是协程?

4、进程、线程、协程的区别

(1) 进程、线程的区别

(2) 线程、协程的区别


1、什么是进程?

简单来说,进程可以看做是加载到内存里的程序,实际上一个完整的进程并不只有这些东西

一个完整的进程 = PCB + 虚拟内存 + 页表 + 物理内存中的代码和数据

  • PCB:进程控制块记录着当前进程的属性信息,如文件描述符数组地址、进程优先级等。
  • 虚拟内存: 进程被创建时都会分配一个独立的地址空间,大小为4G
  • 页表:负责建立虚拟地址和物理地址的映射关系
  • 物理内存:保存了进程运行时所需的代码和数据

进程、线程、协程的区别_第1张图片

 

2、什么是线程?

线程是轻量级的进程,能够分担进程资源,其实可以看做是进程将每一分区中的一部分资源分离出来,这些分离的资源就组成了一个线程。这也就是为什么一个进程可以包含多个线程。

进程、线程、协程的区别_第2张图片

实际上一个PCB就代表一个线程,CPU每次调度的时候,调度的是PCB,如果采用调度策略是时间片调度,每个PCB就会被分配不同的时间片,然后轮换使用CPU资源。

进程、线程、协程的区别_第3张图片

 

3、什么是协程?

协程跟进程、线程不是一个维度的内容,可以看做线程的一个子任务、一段程序 或者 一个函数。协程具备如下特点:

  • 高效性:既然可以看做一段程序,那就没有上下文切换的消耗
  • 安全性:具备原子性,无需加锁来保护临界资源
  • 可靠性:非抢占式调度,协程完全受到程序控制,比如先执行任务A后执行任务B都是一开始就决定好的,任务B不会抢着先执行。

进程、线程、协程的区别_第4张图片

问:如何结合实际情况理解协程?

答:

        一个线程从进程那拿到了自己要执行的程序,但是任务量依然很重,于是乎,线程就把这段程序分成了多份,也就是多个子任务,线程在多个子任务之间交替执行。

进程、线程、协程的区别_第5张图片

        以网络IO为例,子任务A负责调用read函数读取数据;子任务B负责给对方发数据。如果接收缓冲区没有数据,默认情况下read函数就会阻塞等待,线程就会转而去执行任务B;当缓冲区有数据时,线程会唤醒任务A,从上次阻塞的地方继续执行。

        这里的子任务A、B其实就可以看做是“协程”。

        由此可见,线程并未阻塞,只是去执行其他任务了。

4、进程、线程、协程的区别

(1) 进程、线程的区别

站在宏观的角度,一个进程可以包含多个进程,一个线程从属于一个进程

站在安全的角度,一个线程挂掉,所属的进程也会挂掉;一个进程挂掉,不会影响其他进程

站在资源利用的角度,创建一个进程的开销大于创建一个线程的开销

(2) 线程、协程的区别

站在宏观的角度,一个线程可以包含多个协程,协程与内核无关

站在安全的角度,协程不需要锁的机制,因为不同协程属于同一个线程,不存在写冲突

站在资源利用角度,协程没有上下文切换的损耗;线程是CPU调度的最小单位,每次切换都要保存上下文数据。

你可能感兴趣的:(Linux,基础,linux)