进程、线程、协程分别是什么概念?

进程(Process)和 线程(Thread)

进程(Process)和 线程(Thread)是操作系统中的重要概念。

进程是指计算机中已经运行的程序,它是操作系统资源分配的最小单位。进程拥有独立的内存空间和系统资源,如打开的文件、网络连接等。在操作系统中,每个进程都拥有一个唯一的标识符,称为进程ID。

线程是进程中的执行单元,一个进程可以包含多个线程,它们共享进程的内存空间和系统资源。线程是CPU调度的最小单位,它可以看作是进程中的一个独立执行流程。与进程不同的是,线程没有自己的系统资源,只有一部分与进程共享的资源。在操作系统中,每个线程都拥有一个唯一的标识符,称为线程ID。

可以将进程和线程的关系类比为一家工厂。工厂代表一个进程,工厂中的工人代表线程。每个工人负责自己的一部分工作,但是他们共享工厂的资源,如原材料、设备等。

总的来说,进程和线程都是操作系统资源分配和调度的基本单位,它们之间的关系是多对一的,即多个线程可以属于同一个进程,共享进程的资源。

协程(Coroutine)

协程(Coroutine)是一种用户态的轻量级线程,也称为协作式多任务处理,与传统的抢占式多任务处理方式不同,协程的调度不由系统来控制,而是由程序员自己控制。在协程内部,程序可以自己决定在何处挂起、何时恢复执行。协程可以有效地避免多线程并发操作时出现的死锁、竞争、状态同步等问题,同时协程又可以充分利用 CPU 资源,提高程序执行效率。

在协程中,所有任务共享一个线程,通过在任务之间切换来实现并发,这种方式可以避免线程切换时的性能损耗,也可以避免线程之间的同步问题。协程主要有以下特点:

  • 协程是一种轻量级的线程,其切换过程不需要操作系统介入,而是在用户态实现的。
  • 协程是一种非抢占式调度方式,需要程序员显式地让出执行权。
  • 协程可以共享全局变量等状态信息,但是需要程序员自己管理状态同步。

协程在很多语言中都得到了广泛的应用,例如 Python 中的 asyncio、Lua 中的 coroutine 等。在前端领域中,JavaScript 的 Generator 函数就是一种协程实现方式。