线程简介
- 线程:一条线程指的是***进程中***一个单一顺序的控制流,是***最小调度单元***。
传统操作系统中,每个进程只有一个地址空间和一个控制线程。 - 需要多线程的原因:
- 许多应用同时发生多种活动,某些活动随着时间推移会被阻塞,可以把应用程序分解成准并行运行的多个顺序线程。
- 线程比进程更加轻量,创建撤销快。
- 线程能够提高I/O密集型的进程的性能,而不能提高CPU密集型的。
经典线程模型
进程模型基于两个概念:资源分组处理与执行。
线程模型:资源分组是进程的工作,在CPU上被调度执行是线程的工作。
线程特点
- 所有线程的地址空间相同
- 共享所有的全局变量
每个进程中的内容 | 每个线程的内容 |
---|---|
地址空间 | 程序计数器 |
全局变量 | 寄存器 |
打开的文件 | 堆栈 |
子进程 | 状态 |
即将发生的定时器 | |
信号与信号处理程序 | |
账户信息 |
线程状态
- 运行
- 阻塞
- 就绪
- 终止
- 线程状态之间的转换和进程状态转换一样。
- 所有的线程都是平等的。
POSIX线程包
线程调用 | 描述 |
---|---|
pthread_create | 创建新的线程 |
pthread_exit | 结束调用的线程 |
phread_join | 等待特定的线程退出 |
pthread_yield | 自动放弃CPU,来运行另一个线程 |
pthread_attr_init | 创建并且初始化一个线程的属性结构 |
pthread_attr_destroy | 删除一个线程的属性结构 |
用户级线程:把线程放在用户空间中。
- 内核角度:按照***单线程进程***管理。
- 每个进程维护一个***线程表***,记录线程的属性。
- 每个进程里的线程表由***运行时系统***管理
优点:
- 线程切换迅速。
- 允许每个进程自定义调度算法
- 可以在不支持线程的操作系统上实现。
缺点:
- 线程阻塞,不知道多线程的存在,因此同一进程中只能有一个线程运行。
- 线程没有时钟中断,不能自动让出CPU。
内核级线程
- 通过系统调用来创建或者撤销一个线程。
- 内核的***线程表TCB***保存了线程的信息。
- 所有能够阻塞线程的调用都采用系统调用的形式实现。
内核回收线程:标志为不可允许,不删除内核数据。
混合线程:用户级线程与某些或者全部的内核线程多路复用。
- 内核识别内核级线程,对其调度。
- 内核级线程有一个用户线程的集合,可以轮流使用。
多路复用:多个用户线程对应一个内核线程。