线程
1. 引入线程后的进程与线程
1.1. 线程特点
- 调度的基本单位:引入线程后,线程变成调度和分派的独立运行的基本单位,不同进程或同一进程的线程可并发运行
- 拥有资源:线程本身不拥有系统资源,仅拥有保证独立运行的必要资源,但线程可以访问所在进程地址空间中的每一个虚拟地址以及进程所拥有的资源
- 独立性:同一进程的不同线程往往为了提高并发性和相互合作而建立,共享进程的内存地址空间和资源
- 支持多处理机系统:可将一个进程的多个线程分配到多个处理机上,使它们并行运行,加速进程。
1.2. 线程的状态
与传统进程一样,线程之间也存在着共享资源和相互合作的制约关系,因此线程运行也有间断性。相应的,进程运行时也有执行状态、就绪状态和阻塞状态,三种状态之间的转换与传统进程一致。
1.3. 线程控制块 TCB
系统为每个线程配置一个线程控制块 TCB,将所有用于控制和管理线程的信息都记录在线程控制块中。线程控制块通常有:
- 线程唯一标识符、线程运行状态、优先级、信号屏蔽(对某些信号加以屏蔽)
- 一组寄存器:包括 PC、状态寄存器、通用寄存器
- 线程专有存储区:用于线程切换时存放现场保护信息和线程相关的统计信息
- 堆栈指针:在线程运行时会经常出现进程调用,而进程调用会出现多重嵌套,此时必须将每次进程调用中所使用的局部变量和返回地址保存起来。TCB 也需设置两个堆栈指针(指向用户自己堆栈的指针和指向内核栈的指针
1.4. 多线程 OS 中的进程特点
- 进程是一个可拥有资源的基本单位:包括用户的地址空间、实现进程(线程)同步和通信的机制、已打开的文件、已申请到的 I/O 设备,以及一张有内核进程维护的地址映射表(用于实现用户程序逻辑地址到其内存物理地址的映射)
- 支持多线程技术::每个进程都含有若干个相对独立的线程,可并发执行
- 进程不再是一个可执行实体:进程中的线程作为独立运行(调度)的基本单位,但进程仍然有与执行相关的状态,对进程施加的与进程状态有关的操作对其所有线程起作用
2. 线程的实现
线程在不同系统中的实现方式不同,但都必须直接或间接取得内核支持。
2.1. 内核支持线程 KST(Kernel Support Threads)的实现
OS 中的所有系统进程和用户进程都在 OS 内核的支持下运行,内核支持线程的创建、阻塞、撤销和切换都是在内核空间实现。
在仅设置了内核支持线程的 OS 中,系统创建一个新进程时,便为它分配一个任务数据区 PTDA(Per Task Data Area),其中包括多个 TCB。每当进程要创建新线程时,便为新线程分配一个 TCB;线程终止时,当进程中的其他线程执行了分离函数后,才回收线程的所有资源和 TCB;当线程调度选中一个线程后,便将处理机分配给它。
内核支持线程 KST优缺点
- 内核能同时调度多处理器系统中同一进程的多个线程并行执行
- 当进程中的线程被阻塞,内核能随时调度任何进程中的线程占用处理器
- 内核支持线程具有很小的数据结构和堆栈,线程切换快
- 内核本身采用多线程技术
缺点是:用户线程的切换需要从用户态转到核心态进行
2.2. 用户级线程 ULT(User Level Threads)实现
用户级线程是在用户空间中实现的,对线程的创建、撤销、同步与通信功能等都无需内核支持,内核不知道用户级线程的存在。对于设置了用户级线程的系统,其调度仍是以进程为单位。
所有的用户级线程都具有相同的结构,都运行在同一个中间系统(运行时系统或内核控制线程)上。
运行时系统指所有用于管理和控制线程的函数集合,其中包括创建、撤销、调度、同步与通信功能的函数。当线程需要系统资源时,将该要求传送给运行时系统,由后者通过相应的系统调用来获得系统资源。
用户级线程优缺点
优点:
- 线程切换不需要转换到内核空间
- 不同进程可根据自身需要选择不同的调度算法
- 用户级线程的实现与 OS 平台无关,在不支持线程机制的 OS 上也能实现
缺点:
- 大多数系统调用将同时使线程及其所在的进程阻塞
- 多线程应用不能利用多处理机并发执行一个进程中的多个线程
2.3. 组合方式实现
在组合方式线程系统中,内核支持多个内核支持线程的建立、调度和管理,也允许用户应用程序建立、调度和芙蓉里用户级线程。用户级线程通过分时多路复用内核支持线程实现,程序员可按应用需要配置内核支持线程数目。
每个进程拥有多个轻型进程 LWP(Light Weight Process),LWP 可通过系统调用来获得内核提供的服务,因此只需将运行的用户级线程连接到 LWP,便具有了内核支持线程的所有属性。
组合方式线程系统有三种模型
- 多对一:多用户级线程一般属于一个进程,运行在该进程的用户空间,对线程的调度和管理也是在该进程的用户空间中完成,因此若线程访问内核时发生阻塞,整个进程也将发生阻塞
- 一对一:每个用户级线程映射到一个内核支持线程
- 多对多:多个用户级线程映射到多个内核支持线程
3. ChangeLog
2018.08.21 初稿