协程,线程,进程的区别

2022-04-06
2804

协程

线程

进程

Golang

一、协程,线程,进程

1、进程

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信。由于进程比较重量,占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大,但相对比较稳定安全。

2、线程
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。线程间通信主要通过共享内存,上下文切换很快,资源开销较少,但相比进程不够稳定容易丢失数据。

3、协程
协程是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。


二、协程为什么比线程性能更好

1、线程

一个线程绑定一个任务,任务会在CPU内执行,在Windows和Liunx等系统中,任务的调度采用的时间片抢占调用方式。任务的状态分为运行状态和就绪状。举个例子,当任务1进行到就绪状态时,就会进行中断处理,并保存当前任务相关的执行信息(存在内存中),操作系统内核会分配接下来可以执行哪个任务,我们假设分配给了任务3执行。当任务3中断了,可能跳到了任务2,也可能跳回到了任务1,读取保存的执行信息,继续执行起来。

这里就会有3个线程之间的来回切换。

线程阻塞切换需要在操作系统的内核上面切换,会有用户态到内核态的切换。

2、协程

协程非常类似于线程。但是协程是协作式多任务的,而线程典型是抢占式多任务的。这意味着协程提供并发性而非并行性。协程相比线程,优势是它们可以用于硬性实时的语境(在协程之间的切换不需要涉及任何系统调用或任何阻塞调用),这里不需要用来守卫关键区块的同步性原语(primitive)比如互斥锁、信号量等,并且不需要来自操作系统的支持。有可能以一种对调用代码透明的方式,使用抢占式调度的线程实现协程,但是会失去某些利益(特别是对硬性实时操作的适合性和相对廉价的相互之间切换)