一、线程的概念

线程(Thread)操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运行单位。

  • 一个进程至少包含一个主线程,可以创建多个子线程。
  • 同一进程内的所有线程共享该进程的内存地址空间、文件句柄、全局变量等资源
  • 线程自己只拥有少量私有资源:程序计数器、寄存器、栈、线程私有数据等。

简单理解:

  • 进程 = 程序运行的容器(独立资源)
  • 线程 = 容器里真正干活的执行流

二、线程的主要特点

  1. 轻型实体线程几乎不拥有独立系统资源,只保留少量运行必需信息,创建、销毁、切换开销远小于进程。

  2. 独立调度与分派线程是 CPU 调度的基本单位,多线程可在多核 CPU 上真正并行执行

  3. 并发执行同一进程内多个线程可交替执行,实现并发,提高程序响应速度和吞吐量。

  4. 共享进程资源同一进程内线程共享:

    • 代码段、数据段、堆空间
    • 打开的文件、信号处理、进程 ID 等线程间通信成本极低,无需复杂进程间通信(IPC)。
  5. 私有栈空间每个线程有独立栈,用于保存局部变量、函数调用栈,互不干扰。

  6. 进程崩溃会导致所有线程终止线程依赖进程存在,进程退出,所有线程都会被销毁。

三、线程 vs 进程(简要对比)

特性 进程 线程
资源拥有 独立资源,相互隔离 共享进程资源
调度单位 传统 OS 调度单位 现代 OS 最小调度单位
切换开销
通信方式 管道、消息队列、共享内存等 直接读写共享变量
健壮性 一个崩溃不影响其他进程 一个线程崩溃可能导致整个进程崩

四、线程的主要作用

  • 提高程序并发能力,充分利用多核 CPU
  • 提升响应速度(如 UI 线程 + 后台工作线程)
  • 减少阻塞等待浪费(I/O 时可让其他线程继续执行)
  • 简化程序结构,模块化处理多任务

线程的实现方式 & 多线程模型

一、线程的三种实现方式

从操作系统层面,线程主要分为三类实现:

1. 内核级线程(KLT,Kernel-Level Thread)

  • 由操作系统内核直接管理、调度
  • 内核负责创建、销毁、切换线程
  • 优点:
    • 多核 CPU 上可真正并行
    • 一个线程阻塞,其他线程仍可运行
  • 缺点:
    • 线程切换、创建开销较大
    • 需要内核态 / 用户态切换

典型:Windows 线程、Linux POSIX 线程(pthread)


2. 用户级线程(ULT,User-Level Thread)

  • 在用户空间实现,内核完全不知道线程存在
  • 由用户态线程库(如 Green Thread)管理调度
  • 优点:
    • 线程切换极快,无内核态开销
    • 可自定义调度算法
  • 缺点:
    • 一个线程阻塞(如 I/O)会导致整个进程阻塞
    • 无法利用多核并行

3. 混合型线程(轻量级进程 + 用户线程)

  • 用户线程绑定到轻量级进程 LWP
  • LWP 再由内核调度
  • 兼顾:
    • 用户线程切换快
    • 内核可调度、支持多核、不全局阻塞

典型:Solaris 线程、早期 Java 线程模型

二、多线程模型(线程映射关系)

用户线程内核线程之间的对应关系。

1. 多对一模型(Many-to-One)

  • 多个用户线程 → 1 个内核线程
  • 调度在用户空间完成
  • 优点:高效、切换快
  • 缺点:一个线程阻塞则全部阻塞,无法多核并行

2. 一对一模型(One-to-One)

  • 1 个用户线程 → 1 个内核线程
  • 目前主流操作系统(Linux/Windows)采用
  • 优点:
    • 真正并行
    • 线程独立,互不阻塞
  • 缺点:线程创建 / 切换开销稍大

3. 多对多模型(Many-to-Many)

  • n 个用户线程 → m 个内核线程(n ≥ m)
  • 兼顾并行性与效率
  • 优点:
    • 不会因一个线程阻塞全部
    • 可充分利用多核
  • 缺点:实现复杂
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐