mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5
1305 字
3 分钟
OS笔记(五):线程
2026-06-05

OS笔记(五):线程#

本文是操作系统笔记系列的第五篇,详细讲解线程的概念、用户级线程与内核级线程的区别、多线程模型,以及Linux中的线程管理。


📚 目录#


一、线程的概念#

1.1 什么是线程?#

线程(Thread)可以理解为轻量级进程。它是:

  • CPU执行的基本单位
  • 程序执行流的最小单位

1.2 为什么引入线程?#

问题解决方案
进程切换开销大线程切换开销小
进程并发度有限同一进程的线程可以并发
进程间通信复杂线程间可以直接共享数据

1.3 进程 vs 线程#

对比项进程线程
本质资源分配的基本单位CPU执行的基本单位
资源拥有独立的资源几乎不拥有资源
切换开销大(切换地址空间)小(共享地址空间)
通信方式需要IPC机制直接读写共享变量
崩溃影响不影响其他进程可能导致整个进程崩溃

1.4 线程的属性#

  1. 线程是处理机调度的单位
  2. 多CPU计算机中,各线程可占用不同的CPU
  3. 每个线程都有一个线程IDTCB(线程控制块)
  4. 线程也有就绪、阻塞、运行三种基本状态
  5. 线程几乎不拥有系统资源
  6. 同一进程的线程共享进程资源
  7. 同一线程的线程通信无需系统干预
  8. 同一进程的线程切换不会引起进程切换
  9. 不同进程的线程切换会引起进程切换
  10. 切换同进程内线程的开销很小
  11. 切换进程的开销很大

二、线程的实现方式#

2.1 用户级线程(User-Level Thread)#

用户级线程

特点说明
管理者应用程序(线程库)
切换位置用户态
OS感知OS不知道线程存在

优点

  • 切换不需要切换到核心态,开销小、效率高

缺点

  • 一个线程阻塞会导致整个进程阻塞
  • 无法利用多核CPU

2.2 内核级线程(Kernel-Level Thread)#

内核级线程

特点说明
管理者操作系统内核
切换位置核心态
OS感知OS为每个线程建立TCB

优点

  • 一个线程阻塞不影响其他线程
  • 可以利用多核CPU

缺点

  • 切换需要切换到核心态,开销大

2.3 用户级 vs 内核级#

对比用户级线程内核级线程
切换开销
并发能力
多核利用不能
阻塞影响整个进程阻塞仅当前线程阻塞

重点:操作系统只能看到内核级线程


三、多线程模型#

3.1 一对一模型#

一个用户级线程对应一个内核级线程。

一对一模型

优点缺点
并发能力强线程管理成本高

3.2 多对一模型#

多个用户级线程对应一个内核级线程。

多对一模型

优点缺点
切换开销小并发性不好

3.3 多对多模型#

多个用户级线程对应多个内核级线程。

多对多模型

优点特点
兼顾并发性和开销折中方案

3.4 模型对比#

模型用户级:内核级并发性开销
一对一1:1最强最大
多对一N:1最弱最小
多对多N较强较小

四、线程的状态与控制#

4.1 线程的状态#

线程也有三种基本状态:

![线程状态](/assets/os-notes/Pasted%20image%2020260605180138.webp)
### 4.2 线程控制块(TCB)
TCB存储线程的信息:
| 信息 | 说明 |
|------|------|
| 线程ID | 唯一标识 |
| 程序计数器 | 下一条指令地址 |
| 寄存器值 | CPU寄存器状态 |
| 栈指针 | 线程栈的位置 |
| 线程状态 | 就绪/运行/阻塞 |
![线程组织](/assets/os-notes/Pasted%20image%2020260605180515.webp)
---
<a id="linux"></a>
## 五、Linux实战:线程管理
### 5.1 Linux中的线程
Linux中线程被称为**轻量级进程**(LWP),使用 `clone()` 系统调用创建。
### 5.2 查看线程
```bash
# 查看进程的线程
ps -T -p <PID>
# 查看所有线程
ps -eLf
# 使用top查看线程
top -H -p <PID>
# 使用htop(更直观)
htop -H

5.3 创建线程(C语言)#

cat > thread_demo.c << 'EOF'
#include <stdio.h>
#include <pthread.h>
void* thread_func(void* arg) {
printf("线程 %ld 运行中\n", (long)arg);
return NULL;
}
int main() {
pthread_t threads[3];
// 创建3个线程
for (long i = 0; i < 3; i++) {
pthread_create(&threads[i], NULL, thread_func, (void*)i);
}
// 等待线程结束
for (int i = 0; i < 3; i++) {
pthread_join(threads[i], NULL);
}
printf("所有线程执行完毕\n");
return 0;
}
EOF
gcc thread_demo.c -lpthread -o thread_demo
./thread_demo

5.4 创建线程(Python)#

python3 << 'EOF'
import threading
import time
def worker(tid):
print(f"线程 {tid} 开始")
time.sleep(1)
print(f"线程 {tid} 结束")
# 创建5个线程
threads = []
for i in range(5):
t = threading.Thread(target=worker, args=(i,))
threads.append(t)
t.start()
# 等待所有线程完成
for t in threads:
t.join()
print("所有线程执行完毕")
EOF

5.5 线程同步#

python3 << 'EOF'
import threading
counter = 0
lock = threading.Lock()
def increment():
global counter
for _ in range(100000):
with lock:
counter += 1
# 创建10个线程并发修改共享变量
threads = []
for _ in range(10):
t = threading.Thread(target=increment)
threads.append(t)
t.start()
for t in threads:
t.join()
print(f"最终计数: {counter}") # 应该是1000000
EOF

5.6 线程vs进程性能对比#

python3 << 'EOF'
import threading
import multiprocessing
import time
def task():
sum(range(1000000))
# 测试线程
start = time.time()
threads = [threading.Thread(target=task) for _ in range(4)]
for t in threads: t.start()
for t in threads: t.join()
thread_time = time.time() - start
# 测试进程
start = time.time()
processes = [multiprocessing.Process(target=task) for _ in range(4)]
for p in processes: p.start()
for p in processes: p.join()
process_time = time.time() - start
print(f"线程耗时: {thread_time:.3f}s")
print(f"进程耗时: {process_time:.3f}s")
EOF

5.7 查看线程详细信息#

# 查看线程栈信息
cat /proc/<PID>/task/<TID>/stack
# 查看线程状态
cat /proc/<PID>/task/<TID>/status
# 使用pstack查看线程栈
pstack <PID>

六、本章小结#

核心概念#

概念要点
线程CPU执行的基本单位,轻量级进程
用户级线程用户态切换,开销小,并发弱
内核级线程核心态切换,开销大,并发强
一对一模型并发强,开销大
多对一模型并发弱,开销小
多对多模型折中方案

线程实现方式对比#

对比项用户级线程内核级线程
切换位置用户态核心态
OS感知
切换开销
并发能力
多核利用不能

考研/期末常见考点#

  1. 线程和进程的区别
  2. 用户级线程和内核级线程的区别
  3. 三种多线程模型的特点和对比
  4. OS只能看到内核级线程
  5. 线程切换和进程切换的开销对比

思考题#

  1. 为什么说线程是”轻量级进程”?
  2. 用户级线程为什么不能利用多核CPU?
  3. 多对多模型是如何兼顾并发性和开销的?

上一篇OS笔记(四):进程通信 下一篇OS笔记(六):调度的概念、层次

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

OS笔记(五):线程
https://emilia520.icu/posts/os-216线程/
作者
火花花
发布于
2026-06-05
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录