线程概念
线程是进程内的一个执行分支,其执行粒度比进程更细。
Linux 中理解线程
在 Linux 中创建一个进程时会创建新的 task_struct、进程地址空间、页表,并在物理内存中重新开辟资源。而创建线程时,仅创建 task_struct,不创建独立的地址空间和页表,多个线程共享同一进程的地址空间及页表。
Linux 实现方案:
- 线程在进程内部执行,即在线程的进程地址空间内运行。
- 线程的执行粒度比进程更细,执行的是进程代码的一部分。
问题:线程为什么要在进程的进程地址空间内运行?
解释:任何执行流要执行都需要资源,进程地址空间是进程的资源窗口。
重新定义线程与进程
对于 CPU 而言,只需调度执行流(task_struct)即可。
问题:什么是线程?
解释:线程是操作系统调度的基本单位。
问题:什么是进程?
解释:将执行流(task_struct)、进程地址空间、页表以及物理内存中的资源统称为进程。从内核角度看,进程是承担分配系统资源的基本实体。
执行流本身也是一种资源。
进程与线程的关系
进程内部包含多个线程,进程负责资源分配,线程则是执行单元。
问题:如何理解以前没有线程时的进程?
解释:操作系统以进程为单位分配资源,此时进程只有一个执行流。因此,单执行流进程是进程的一种特例,而多执行流进程是常态。
操作系统需管理线程 —— 先描述再组织。
- Windows 系统分别维护线程控制块(TCB)和进程控制块(PCB)。
- Linux 系统复用进程结构体,通过'轻量级进程'模拟线程。因此 Linux 没有真正意义上的线程,而是使用进程结构模拟。
Linux 中的执行流被称为轻量级进程(LWP),关系为:线程 ≤ 执行流 ≤ 进程。
重谈进程地址空间
虚拟地址转换到物理地址的过程如下(以 32 位为例):
虚拟地址 = 页目录索引 (10 bits) + 页表索引 (10 bits) + 页内偏移 (12 bits)
尽管理论上页表可达 1MB 大小,但实际创建进程仍是一项较重的工作。
类型的本质是偏移量,用于向 CPU 提供寻址依据。例如:起始地址 + 类型 = 起始地址 + 偏移量。
如何理解线程分配进程地址空间中的资源?
线程分配的是进程地址空间的一个范围。
总结:内核中并无明确线程概念,但存在轻量级进程(LWP)概念。因此,操作系统通常提供轻量级进程的系统调用而非直接支持线程。
线程与进程对比




