线程

概念

线程是一个基本的CPU执行单元,也是程序执行流的最小单元

引入线程后,不仅是进程间可以并发执行,一个进程的不同线程之间也可以并发执行,提高了系统的并发度,使得一个进程内可以并发执行多项任务(例如QQ可以同时视频聊天,发送文件等等)

引入线程后,进程只作为除CPU以外的系统资源的分配单元(如打印机,内存地址空间等),即除CPU以外的系统资源还是直接分配给进程而不是某个线程

引入线程机制后,发生的变化

引入线程后发生的变化

线程的属性

  • 线程是处理机调度的单位
  • 多CPU计算机中,各个线程可以占用不同的CPU
  • 每个线程都有一个线程ID,和线程控制块(TCB)用来进行区分
  • 线程同样有就绪,阻塞,运行三种基本状态
  • 线程几乎不拥有系统资源
  • 同一进程的不同线程间可以共享进程的资源
  • 由于同一进程的不同线程间共享内存地址空间,所以各个线程间通信甚至无需系统干预
  • 同一进程中的线程间进行切换,不会引起进程切换
  • 不同进程中的线程进行切换,会引起进程切换
  • 切换同进程中的线程,系统开销很小
  • 切换进程,开销较大

线程的实现方式

用户级线程与内核级线程

用户级线程

用户级线程由应用程序通过线程库实现,所有的线程管理工作都是由应用程序负责的(线程的创建,撤销,切换等等)

用户级线程中,线程切换可以在用户态下直接完成,无需操作系统干预

这种实现方式在用户看来有多个线程(同时并发执行多项操作),但是在操作系统内核看来,并不能意识到线程的存在(线程切换不由操作系统控制,这也说明操作系统不能将这种线程分配到多个CPU上并行执行,操作系统不直接管理这种线程)

即用户级线程对用户不透明,对操作系统透明(计算机领域内,透明指的是无法看到)

内核级线程

内核级线程的管理工作由操作系统内核完成。即线程调度,线程切换等工作由内核负责。因此内核级线程的切换必须在核心态下执行

注意

操作系统只能“看见”内核级线程,因此只有内核级线程才是处理机分配的单位

以下方的多对多模型为例,其由三个用户级线程映射到两个内核级线程上,在用户看来,进程中同时有三个线程并发执行,但在操作系统看来,只有两个内核级线程,所以哪怕是在4核处理机的计算机上运行,该进程也最多只能被分配到两个核心,最所只有两个用户进程并行执行

多线程模型

多对一模型

多线程模型多对一

一对一模型

多线程模型一对一

多对多模型

多线程模型多对多