前言
本文在操作系统的角度梳理下线程的概念和实现方式。
什么是线程,为什么引入线程
线程可以理解为轻量级进程。
线程是一个基本的CPU执行单元,也是程序执行的最小单位。
线程的引入进一步提高了系统的并发度,使得一个进程内也可以并发的处理各种任务。
进程是系统分配资源的基本单位,有独立的地址空间;线程是CPU调度的基本单位。
线程的属性
- 线程是处理机调度的单位
- 多CPU计算机中,各个线程可占用不同的CPU
- 每个线程都有一个线程ID、线程控制块 TCB
- 每个线程也有就绪、阻塞、运行三种基本状态
- 线程几乎不拥有系统资源
- 同一进程的不同线程间共享进程的资源
- 由于共享内存地址空间,同一进程中的线程间通信甚至无需系统干预
- 同一进程中的线程切换,不会引起进程切换
- 不同进程中的线程切换,会引起进程切换
- 切换同进程内的线程,系统开销小
- 切换进程,系统开销大
线程的实现方式
用户级线程
用户级线程由应用程序通过线程库实现。
- 所有的线程管理工作都由应用程序负责,包括线程切换。
- 用户级线程中,线程切换可以在用户态下即可完成,不用切换到核心态,无需操作系统干预。
- 在用户看来,是有多个线程,但是在内核看来,只有一个线程。即用户级线程对用户不透明,对操作系统透明。
- 可以这样理解,用户级线程就是从用户视角看能看到的线程。
内核级线程
内核级线程的管理工作由操作系统完成。
- 线程调度、切换等工作都由内核负责,因此内核级线程的切换必然需要在核心态下才能完成。
- 可以这样理解,内核级线程就是从操作系统内核视角看能看到的线程。
组合方式
在同时支持用户级线程和内核级线程的系统中,可以采用两者组合的方式,将n个用户级线程映射到m个内核级线程上n>=m。
- 操作系统只看得见内核级线程,因此只有内核级线程才是CPU调度的基本单位。
多线程模型
在同时支持用户级线程和内核级线程的系统中,采用组合的方式将n个用户级线程映射到m个内核级线程上n>=m。由此引出了多线程模型。
多对一模型
多个用户级线程映射到一个内核级线程,即每个进程只对应一个内核级线程。
-
优点:
用户级线程切换在用户态,不需要切换到核心态,系统开销小,效率高; -
缺点
当一个用户级线程被阻塞时,整个进程就会被阻塞,并发度不高;
多个线程无法在多核CPU上并行运行。
一对一模型
一个用户级线程映射到一个内核级线程。每个进程有与用户线程相同梳理的内核线程。
-
优点:
当一个线程被阻塞后,别的线程还可以继续执行,并发度高;
多线程可以在多核CPU上并行运行; -
缺点:
一个用户进程会占用多个内核级线程,线程切换由操作系统来完成,需要切换到核心态,线程管理成本高,开销大。
多对多模型
n个用户级线程映射到m个内核级线程(n >= m)。每个用户进程对应m个内核级线程。
集前二者之所长,避二者之所短。既能高并发,又能避免系统开销大。