进程、线程与协程
基本概念
进程
进程(Process)是操作系统中资源分配和调度的基本单位。每个进程有自己的内存空间和系统资源,是一个独立运行的程序实例。进程之间是相互隔离的,通常一个进程的崩溃不会影响到其他进程。
线程
线程(Thread)是进程中的一个执行路径。一个进程可以包含多个线程,它们共享进程的内存空间和资源,但每个线程有自己的栈和寄存器。线程是 CPU 调度的基本单位,线程之间的切换比进程更轻量级。
协程
协程(Coroutine)是一种比线程更轻量级的存在。在许多编程语言中,协程是用户态的调度单位,它们可以在单线程中实现并发。协程通过程序员显式调用来切换,而不是由操作系统进行调度。协程主要用于处理异步任务,具有较高的效率。
虚拟线程 (Virtual Threads)
虚拟线程(在 Java 中称为 Virtual Threads,在其他上下文中可能称为轻量级线程或用户态线程)是一种由语言运行时或虚拟机管理,而非操作系统内核直接管理的线程。它是 JDK 19 及以上版本中 Project Loom 的核心特性。虚拟线程在底层仍然由平台线程(即传统的内核线程)承载,但其创建、调度和阻塞的代价极低,数量可达百万级。其核心目标是让开发者能够以简单的“一个请求一个线程”的同步编程模型,编写出高并发的应用程序,而无需关心复杂的异步回调或反应式编程。
虚拟进程 / 轻量级进程 (Lightweight Processes, LWP)
轻量级进程是操作系统内核支持的一种线程实现方式(如在早期的 Solaris 系统中),可以看作是内核线程。它比传统进程更轻量,共享更多的资源(如地址空间),但比用户态线程(协程)重,因为其调度仍然由内核负责。在现代 Linux 中,通常不严格区分线程和轻量级进程,用户态线程通过内核的线程调度器(如 NPTL)映射到内核的调度实体上。虚拟进程的概念有时也与容器(如 Docker)技术相关联,容器提供了一种轻量级、隔离的进程运行环境,比传统虚拟机更高效。
比较
| 特性 | 进程 | 线程 (内核线程) | 虚拟线程 (用户态线程) | 协程 | 轻量级进程 (LWP) |
|---|---|---|---|---|---|
| 调度方式 | 由操作系统内核进行调度,切换时需要保存和恢复所有的 CPU 状态和内存空间。 | 同样由操作系统内核进行调度,但由于线程共享进程的内存空间,切换时只需保存和恢复 CPU 寄存器和栈指针。 | 由用户态运行时(如 JVM)调度,挂起时仅保存少量栈帧和上下文到堆内存。阻塞操作会将其从载体线程上卸载,不阻塞内核线程。 | 由程序员在用户态显式调度,无需操作系统参与,切换时只需保存和恢复少量上下文信息。 | 由操作系统内核进行调度,是内核支持的可调度实体,比进程切换轻,但比纯用户态调度重。 |
| 资源消耗 | 创建和销毁进程需要较多的资源,尤其是内存和 CPU 时间。 |



