文章目录
一.概念
- 有的进程可能需要“同时”做很多事情,而传统进程只能串行的执行一系列程序。为此,引入了线程,来增加并发度
- 可以把线程理解为轻量级进程
- 线程是一个基本的CPU执行单元,也是程序执行流的最小单元
二.线程带来的变化
- 进程只是资源分配的基本单位,线程成为调度的基本单位
- 各线程间也可以并发,提高了并发性
- 线程间并发,如果是同一进程内的线程,则不需要切换进程环境,系统开销减小
三.线程的属性
- 线程是处理机调度的单位
- 多CPU计算机中,各个线程可以占用不同的CPU
- 每个线程都有一个线程控制块(TCB)
- 线程也有运行,就绪,阻塞三种基本状态
- 线程几乎不拥有系统资源(因为引入线程以后,进程是资源分配的基本单位,线程只是处理机调度的基本单位)
- 同一进程的不同线程共享进程的资源
- 由于共享内存空间地址,同一进程内的线程间进行通信甚至不需要系统干预
- 同一进程中的线程切换,不会引起进程切换
- 不同进程中的线程切换,会引起进程切换
四.用户级线程和内核级线程
1.用户级线程
- 用户级线程由应用程序通过线程库实现
- 所有线程管理工作由应用程序负责
- 用户级线程,线程切换可以在用户态下完成,无需操作系统干预
- 在用户看来,是有多个线程,但是操作系统内核并意识不到用户级线程的存在
2.内核级线程
- 内核级线程的管理工作都由操作系统内核完成
- 因此内核级线程的切换必须在核心态下才能完成
- 当有多个处理机时,一个进程的多个线程可以同时执行
- 内核级线程是操作系统内核可以感知到的
3.两者的关联性
- 它们之间的差别在于性能
- 内核支持线程是OS内核可感知的,而用户级线程是OS内核不可感知的
- 用户级线程的创建、撤消和调度不需要OS内核的支持
- 用户级线程执行系统调用指令时将导致其所属进程被中断,而内核支持线程执行系统调用指令时,只导致该线程被中断
- 在只有用户级线程的系统内,CPU调度还是以进程为单位,处于运行状态的进程中的多个线程,由用户程序控制线程的轮换运行;在有内核支持线程的系统内,CPU调度则以线程为单位,由OS的线程调度程序负责线程的调度
- 用户级线程的程序实体是运行在用户态下的程序,而内核支持线程的程序实体则是可以运行在任何状态下的程序
五.线程的实现方式
- 在同时支持内核级线程和用户级线程的系统中,可采用二者组合的方式:将n个用户级线程映射到m个内核级线程(n>m)
- 由于操作系统只感知得到内核级线程,因此只有内核级线程是处理机分配的单位
eg:
上图中,该进程由两个内核级线程和三个用户级线程组成。在用户看来,这个进程中有三个线程,但因为只有两个内核级线程,即使该进程在一个四核处理机上运行,也最多只能分配到两个核,最多有两个用户级线程并行执行。
六.多线程模型
1.多对一模型
- 多个用户级线程映射到一个内核级线程
- 优点:
用户级线程的切换可以直接在用户态实现,不用切换到核心态,效率高 - 缺点:
当一个用户级线程被阻塞时,整个进程都会被阻塞(因为多对一,对操作系统而言它只能看到一个内核级进程,当一个用户级线程阻塞了,该内核级进程也就阻塞了,操作系统就会去处理别的内核级线程),并发度不高。多个线程不可在多核处理机上并行运行。
2.一对一模型
- 一个用户级线程映射到一个内核级线程
- 优点:
当一个线程阻塞时,别的线程还可以继续执行,并发能力强,多线程可在多核处理机上并行执行 - 缺点:
一个用户进程(注意这是进程)会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,线程管理的成本高,开销大。
3.多对多模型
- n个用户级线程映射到m个内核级线程(n>m)
- 克服了多对一的并发性不高的问题,也克服了一对一开销太大的缺点
七.小结
- 线程就是轻量级进程,就是把进程细分了
- 有了线程以后,线程就成为了调度的基本单位
- 用户级线程就是用户视角下的线程,与内核牵扯不是很大
- 内核级线程是操作系统内核视角下的线程,是由内核进行管理的
- 只有内核级线程是处理机分配的单位,因为操作系统看不到用户级线程