线程、多线程模型
目录
一、什么是线程、为什么要引入线程
二、引入线程机制后的变化
三、线程有的属性
四、线程的实现方式
五、多线程模型
一、什么是线程、为什么要引入线程
1、线程引入原因分析:
- 没有引入进程之前,程序只能串行运行,进程时程序的一次运行
- 有的进程有可能需要 “同时” 做很多事,而传统的进程只能串行的执行一系列程序,为此,引入线程 增加并发度
- 传统进程是程序执行流的最小单位,引入线程后,线程成为程序执行流的最小单位
- 例如:微信中可以同时发消息和视频聊天
2、线程:
- 可以把线程理解为轻量级进程。线程是基本的CPU执行单元,也是程序执行流的最小单元。引入线程后不仅进程可以并发,进程内的线程也可以并发,进一步提升了系统的并发度。
- 引入线程之后,进程只作为除CPU之外系统资源的分配单元(打印机等系统资源),线程作为处理机的分配单元
二、引入线程机制后有什么变化
1、资源分配、调度
- (1)传统进程机制中,进程是资源分配、调度的基本单位
- (2)引入线程后,进程成为资源分配的基本单位,线程成为调度的基本单位
2、并发性
- (1)传统进程机制中,只能进程间并发
- (2)引入线程后,各线程间也可以并发,提升了并发度
2、系统开销
- (1)传统的进程间并发需要切换进程的运行环境,系统开销很大
- (2)线程间并发,如果是在同一进程内,不需要切换运行环境,系统开销小
- (3)引入线程后,并发所带来的系统开销减小
三、线程的属性
- 线程是处理机调度的基本的单位
- 多CPU计算机中,各个线程可以占用不同的CPU
- 每个线程都有一个线程ID和线程控制块TCB
- 线程也有就绪、阻塞、运行三种基本状态
- 线程几乎不拥有系统资源
- 同一进程的不同线程间共享进程的资源
- 由于共享内存地址空间,同一进程的线程间通信甚至不用系统干预
- 同一进程的线程切换不会引起进程切换
- 不同进程的线程切换会引起进程切换
- 切换同进程内的线程系统开销很小
- 切换进程系统开销 很大
四、线程的实现方式
1、用户级线程 应用程序通过线程库实现
- 所有的线程管理工作都由应用程序负责,包括线程切换
- 用户级线程中,线程切换在用户态下即可完成,无需系统干预
- 在用户看来有多个线程,但是在操作系统的内核看来,操作系统意识不到线程的存在。因此,用户级线程对用户不透明,对操作系统透明
- 可以理解为:用户级线程是从用户的角度看到的
2、内核级线程
- 所有的线程管理工作都由操作系统的内核负责,包括线程调度和线程切换
- 内核级线程的切换必须要在核心态下才能完成
- 可以理解为:内核级线程就是从操作系统内核角度看到的线程
3、组合方式:
- 在同时支持用户级线程和内核级线程的系统中采用两者的组合方式,将N个用户级线程映射到M个内核级线程上(N>=M)
- 因为操作系统内核只 “看得见” 内核级线程,因此,内核级线程才是处理机分配到的单位
五、多线程模型
1、问题引入: 在同时支持用户级线程和内核级线程的系统中,由几个用户级线程映射到内核级线程的问题引入多线程模型
2、多对一模型:
- 多个用户级线程映射到一个内核级线程
- 优点是:线程切换在用户态下即可完成,线程管理开销小
- 缺点是:当一个用户级线程阻塞后,整个进程都会被阻塞,系统并发度不高
3、一对一模型:
- 一个用户级线程映射到一个内核级线程,一对一
- 优点是 :一个线程阻塞还有其他线程,因此系统并发度高
- 缺点是:一个用户进程会占用多个内核级线程,线程切换的是内核级线程,需要 到核心态,所以系统开销大
4、多对多模型:
- 将N个用户级线程映射到M个内核级线程
- 优点:解决了一对一模型一个用户进程占用多个内核线程导致的系统开销 大问题,也解决了多对一模型的并发度不高问题
5、知识点总结: