进程、线程、协程

进程是资源分配的基本单位,线程是 CPU 调度的基本单位,协程是用户态的轻量级线程。

三者是层级包含关系:一个进程里有多个线程,一个线程里可以跑多个协程。

2a4693121a102a42ee5e3a8c96142f8a

 

进程:资源分配的最小单位

 进程是操作系统分配资源的基本单位,每个进程有自己独立的内存空间——代码段、数据段、堆、栈全部隔离。// Java 中每个运行的 JVM 就是一个进程
public static void main(String[] args) {
    ProcessHandle current = ProcessHandle.current();
    System.out.println("PID: " + current.pid());
    System.out.println("进程信息: " + current.info());
}

 

进程的三个核心特点:

隔离性强 — 一个进程挂了不影响其他进程。Chrome 每个标签页用独立进程就是这个原因,一个页面崩了不会拖垮浏览器。

创建开销大 — 需要分配独立内存空间、复制父进程资源(写时复制),代价不低。

通信复杂 — 进程间通信(IPC)要走管道、消息队列、共享内存等机制,比线程间通信麻烦得多。

 

线程:CPU 调度的最小单位

线程是进程内的执行单元。同一进程内的多个线程共享内存空间,但各自有独立的栈和程序计数器。

关键点:Java 线程和 OS 线程是 1:1 的关系(传统模型),每个 Java Thread 都对应一个操作系统线程。

上下文切换开销。线程的调度由操作系统内核完成,每次切换都要:

  1.  从用户态切到内核态
  2.  保存当前线程的寄存器、程序计数器等上下文
  3.  恢复目标线程的上下文
  4.  可能导致 CPU 缓存(TLB)失效

一次线程切换大约 1~10 微秒。听起来不多?但如果你有上万个线程频繁切换,光上下文切换就能把 CPU 吃满。

d626a3c7a42f6ddb7a7e4604476f7e13

 

协程:用户态的轻量级线程

协程和线程最大的区别是:协程的切换由程序自己控制,不需要操作系统内核参与。

因为完全在用户态完成调度,不需要陷入内核态,所以切换速度极快。而且协程不需要操作系统分配栈空间(线程栈通常 1MB),一个协程可能只需要几 KB 内存

posted @ 2026-05-06 23:27  KLAPT  阅读(10)  评论(0)    收藏  举报