# 4.1 进程和线程(Threads)
## 4.1.1 简介
- OS区别对待以下问题:
- Resource ownership(资源所有权): 进程包括一个虚拟地址空间来保存进程映像
- 资源所有权的单位称为进程或任务。
- Scheduling/execution((调度/执行): 遵循可能与其他进程交错的执行路径
- 调度的单位称为线程或轻量进程。
## 4.1.2 多线程(Multithreading)
- Single-Thread(单线程)
- 单线程指一个进程中只有一个线程在执行的传统方法。(线程的概念并不明确)
- MS-DOS支持单进程、单线程
- 一些UNIX系统支持多进程、每个进程单线程
- Multithreading(多线程)
- 多线程指操作系统支持在一个进程中执行多个线程的能力。
- Process:资源分配单位和保护单位
- 有一个保存进程映像的虚拟地址空间(code, data,stack, and PCB)
- 保护对处理器、内存、其他进程、文件和I/O资源的访问
- 包含一个或多个线程
- Thread:调度执行的单位
- 每个线程都有:
- 执行状态(运行、就绪等)
- 未运行时,保存的线程上下文(PC)
- 具有执行栈(Stack)
- 栈:存储局部变量和函数调用参数,从栈顶取,也在栈顶放置新区域。
- 对于局部变量,一些线程静态存储
- 访问其进程的内存和资源
- 线程的优点:
- 创建更快(创建一个线程比创建一个进程所用的时间更少)(不重新分配内存等资源)
- 结束快(终止一个线程比终止一个进程所用的时间更少)
- 切换快(同进程的两个线程之间)(相同镜像,不用切换页表)
- 通信快(因为同进程的线程共享内存和文件,它们能够不经过内核而互相通信)
- 线程收到进程很多操作的影像:
- 挂起:挂起进程会挂起该进程的所有线程
- 终止:终止进程会终止该进程的所有线程
## 4.1.3 线程功能特性
- 线程的状态
- Runging, Ready,Blocked
- 与线程状态改变相关的操作:
- Spawn(派生)
- 派生另一个线程
- Block(阻塞)
- Unblock(解除阻塞)
- 完成
- 取消分配寄存器上下文和堆栈
- 在进程中:
- 所有线程共享相同的地址空间和其他资源
- 一个线程对资源的任何更改都会影响其他线程
# 4.2 线程类型
## 4.2.1 User-Level Threads (ULT,用户级线程)
- 由线程库管理多线程。
- 所有线程管理都有应用程序完成。
- 内核不知道线程的存在,调度基于进程完成的。
- 需要通过线程库二次调用线程。
- ![[用户级线程 示意图.png]]
## 4.2.2 Kernel-Level Threads(内核级线程)
- 内核维护进程和线程的上下文信息
- 调度基于线程完成。
- ![[内核级线程 示意图.png]]
- ULT的优势(与KLT相比)
- 切换消耗更小
- 调度策略可以根据不同应用而不同
- ULTs可以在任何操作系统上运行,无需修改底层内核
- ULT的劣势(与KLT相比)
- ULT按进程调度(一个线程阻塞,则该进程的所有线程阻塞)
- 线程不能分配到多核(一个多线程应用不能发挥多进程的优势)
- 解决缺点的方法:
- 用多进程代替多线程
- Jacketing套管 针对阻塞问题
- KLT的优势(与ULT相比)
- 克服了ULT的两个主要缺点
- 多CPU执行(一个进程中的多个线程可以同时在多个处理器上运行)
- 仅阻塞单个线程(一个线程阻塞不会使同进程中的其他线程阻塞)
- KLT的劣势(与ULT相比)
- 线程切换需要模式切换到内核
## 4.2.3 Combined Approaches 混合方式
- 线程
- 创建/调度/同步完全在用户空间完成
- 允许映射到内核(来自单个应用的多个ULT映射到一些(较小或相等)数量的(可调)KLT。)
![[组合方法 示意图.png]]
- Combined Approaches的优点:
- 多CPU运行
- 仅阻塞单个线程