1.进程和线程
进程特点:
- 资源所有权(存放进程映像)
- 调度/执行
独立两个特点:
资源所有权 -> 进程
调度/执行 -> 线程
1.1 多线程
- 概念: 单个进程可以并发执行
- 每个线程都有自己的
- 执行状态 (就绪、进行。。。)
- 线程上下文 (独立程序计数器)
- 执行栈
- 静态储存空间 (保存局部变量)
- 可共享的内存和资源 (内存间通信)
![](https://i-blog.csdnimg.cn/blog_migrate/12942afc24762de5458c226048f81f99.png)
线程优点
- 创建时间短
- 终止时间短
- 切换实践短
- 通信时间短(无须调用内核)
线程使用例子
- 前后台同时工作
- 异步处理
- 执行速度快
- 模块化程序结构(多输入/输出)
调度和分派 是在 线程基础 上完成的。
1.2线程功能
线程状态:
运行态、就绪态、阻塞态 (挂起无意义)
基本操作
- 派生 (父进程生成子进程,一般也会派生一个线程)
- 阻塞
- 解除阻塞
- 结束
线程同步 (详见下一章)
使用同步操作可以将防止因为资源被其他线程修改而导致结果错误。
换句话说,就是 保护资源,有的操作不能同时做
2. 线程分类
2.1 用户级和内核级线程
![](https://i-blog.csdnimg.cn/blog_migrate/bab595d8c66fc862dfc7e6745adfe11f.png)
用户级线程 ULT
- 线程库管理线程,不需要内核参与,内核仍操作进程,进程就绪态时所有线程都不能继续运行,即便他是运行态,直到进程重新变为运行态
- 优点
- 线程切换节省两次转换(不用调用内核)
- 可以为进程量身定做调度算法
- 不受操作系统限制(因为不调用内核)
- 缺点
- 线程执行系统调用时,会阻塞所有当下进程的线程
- 同一进程无法多线程处理,因为内核只能调用一个进程
- 改进缺点2
- 使用多进程程序 (开销巨大)
- 使用“套管技术” : 把一个产生阻塞的系统调用转换为非阻塞的系统调用
套管例子:替代直接调用一个系统IO例程,让线程调用一个应用级的IO套管例程,这个套管例程中的代码用于检査并确定IO设备是否忙。如果忙,该线程进入阻塞态并把控制权传送给另一个线程。这个线程重新获得控制权后,套管例程会再次检査IO设备。
内核级线程 KLT
内核为进程及进程内的每个线程维护上下文信息,调度由内核基于线程完成。
- 优点
- 内核可以同时把同一个进程中的多个线程调度到多个处理器中;
- 进程中的一个线程被阻塞时,内核可以调度同一个进程中的另一个线程。
- 内核例程自身也可是多线程的。
- 缺点
- 线程切换慢(调用内核)
### 混合方法
用户空间完成 线程创建、调度和同步
内核空间解决 阻塞单个线程
2.2 其他方案
线程:进程 | 描述 |
---|---|
1:1 | 执行的每个线程是唯一的进程,它有自己的地址空间和资源 |
N:1 | 一个进程定义了一个地址空间和动态资源所有权。可以在该进程中创建和执行多个线程 |
1:M | 一个线程可以从一个进程环境迁移到另一个进程环境。允许线程 |
M:N | 轻松地在不同系统中移动结合了前两者的属性 |