线程的概念
线程定义:
线程是进程内一个相对独立的可调度的执行单元。
线程属性:
- 轻型实体:TCB+堆栈+一组寄存器
- 独立调度和分派的基本单位;
- 可并发执行;
- 共享进程资源;
- 线程有生命周期,在生命期中有状态变化。
![](https://pic4.zhimg.com/v2-fcba03131af92fe0b6d7c8920a3c646f_b.jpg)
![](https://pic4.zhimg.com/80/v2-fcba03131af92fe0b6d7c8920a3c646f_hd.jpg)
线程状态
- 就绪态;
- 执行态;
- 等待态;
- 终止态。
Windows 的线程状态:
(1)初始化状态; (2)就绪状态;
(3)备用状态; (4)运行状态;
(5)等待状态; (6)转换状态
(7)终止状态;
线程管理
TCB的管理:
按照线程的状态,分别将线程的线程控制块(TCB)组织在相应的队列中进行管理。
主要的线程控制原语:
- 线程创建原语
- 线程撤销原语;
- 线程阻塞原语;
- 线程唤醒原语
线程调度:
与进程调度相似
线程同步:
与进程同步相似
线程通信:
由于同一个进程内部中的多个线程之间是可以共享进程的相关资源的,因此只要在进程内部设置一个共享资源,使得线程之间互相共享即可,不需要操作系统内核的支持。
线程实现机制
用户级线程(ULT)
完全由用户应用程序实现的线程机制。该线程的所有功能都是由该应用程序来管理完成的。
示例:POSIX Pthreads; Mach C-threads;Solaris threads
![](https://pic1.zhimg.com/v2-f7cf4e47bd34829212b10e1eb1043fa4_b.jpg)
![](https://pic1.zhimg.com/80/v2-f7cf4e47bd34829212b10e1eb1043fa4_hd.jpg)
在如上图所示,在用户空间中创建一个通信服务器,其中包含线程管理程序(实现对线程的管理);操作系统只为该通信服务器创建一个通信服务器进程,操作系统调度这个进程的运行,也就是为这个进程分配CPU和布置现场。当该通信服务器获得CPU的使用权后,会运行线程管理程序,创建多个用户级线程,让这些进程共享操作系统分配的CPU,实现多线程功能。
运行时系统(线程库):
提供多线程应用程序的开发环境和运行环境。
由一组管理和控制线程的函数(过程)集合组成。它们作为进程代码的一部分,驻留在进程的用户空间。
运行时系统功能:
(1)线程控制;
(2)线程调度;
(3)线程同步;
(4)线程通信;
![](https://pic2.zhimg.com/v2-5bbfe690e5f46fc0b61abd9491116821_b.jpg)
![](https://pic2.zhimg.com/80/v2-5bbfe690e5f46fc0b61abd9491116821_hd.jpg)
用户级线程的优点:
(1)线程的调度及切换开销小;
(2)线程调度由应用程序完成,可以选择最适当的算法;
(3)可运行在任何操作系统上
用户级线程的缺点:
(1)线程系统调用时,将导致所属进程阻塞; (如下图,当T1线程申请系统调用,在T1线程执行系统调用的过程中,操作系统会将整个P1进程阻塞,从而导致此时P1进程的T2和T3线程不能获取CPU进行运行。)
(2)核心只将处理器分配给进程,同一进程中的两个线程不能同时运行于两个处理器上;(OS只会为进程分配CPU,比如只分配一个CPU给P1进程,而不会因为P1进程存在3个线程而分配3个CPU。从而会导致对系统资源的浪费,空闲资源得不到充分的使用。)
![](https://pic1.zhimg.com/v2-a47f0564b0f1166f8a4ce3c08b9ac500_b.jpg)
![](https://pic1.zhimg.com/80/v2-a47f0564b0f1166f8a4ce3c08b9ac500_hd.jpg)
内核级线程(KLT)
完全由OS内核实现的线程机制。
示例:Windows 2000/xp, Solaris, Digital UNIX
内核级线程的实现:
(1)OS创建进程时,可为该进程分配一个任务数据区,其中包含一组TCB空间; (OS可看见线程)
(2)当进程创建一个线程时:
- 分配并填写一个空白TCB;
- 为线程分配栈空间。(存放在OS内核区域)
(3)OS内核实现线程的阻塞/唤醒、线程调度、线程同步、线程通信;
(4)撤销线程:
- 回收该线程所有资源;
- 回收TCB。
![](https://pic4.zhimg.com/v2-622cf14327d1541f517f9deae50dc547_b.jpg)
![](https://pic4.zhimg.com/80/v2-622cf14327d1541f517f9deae50dc547_hd.jpg)
内核级线程优点:
(1)对多处理器,核心可以同时调度同一进程的多个线程;
(2)阻塞是在线程一级完成;
(3)核心例程是多线程的;
内核级线程缺点:
同一进程内的线程切换调用内核,系统开销大。