线程和多线程模型
阴雨进程的目的是更好的使多道程序并发执行,而引入现成的目的是见效程序在并发执行的时候所付出的时空开销,提高操作系统并发性能
对线程的最简单理解为“轻量级的进程”。它是一个基本的CPU执行单元,也是程序执行流的最小单元。线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点必不可少的资源,但是可以和同属一个进程的其他线程共享进程拥有的资源。
线程的状态与转换
线程在运行时具有三种状态:执行状态、就绪状态、阻塞状态
线程的组织和控制
(1)线程控制块
系统为每个线程配置一个线程控制块(TCB),用于记录控制和管理线程的信息。TCB包括:1.线程标识符、2.一组寄存器、3.线程运行状态:保存程序运行状态 4.优先级 5.线程专有存储区 6.堆栈指针
(2)线程的创建
线程也是有生命期的。用户程序启动的时候,通常只有一个初始化线程在执行,其主要功能在于新建新线程。在创建新线程的时候,需要利用一个线程创建函数进行创建
(3)线程的终止
线程的实现方式
(1)用户级线程
用户级线程中,有关线程管理的所有工作都是在用户空间由应用程序完成的,内核是意识不到的。因为内核不清楚用户进程中有多少个线程,因此对于每个进程依然是分配一个时间片,一个只有一个用户级线程的进程的运行速度是一个有100个用户及线程的进程的100倍。
这样做的优点在于:1.线程切换不需要转换到内核空间,节省了开销 2.进程可以根据自身需求选择不同的线程调度算法,更灵活 3.用户级线程和平台无关,是程序的一部分,可移植性好
缺点在于:系统调用阻塞一个用户级线程的时候,会将同一进程下的所有用户级线程阻塞,而内核级线程可以单独阻塞一个线程。主要原因是内核无法意识到用户级线程,只能以进程为单位进行阻塞;同样地,内核意识不到用户级线程也导致不能将同一进程下的多个用户级线程分配给不同的处理机,因此无法发挥多处理机的效率优势
(2)内核级线程
内核级线程管理的所有工作也是在内核空间内实现的。内核空间也为每一个内核级线程设置了一个线程控制块,这也是内核可以意识到内核级线程的原因(用户级线程的控制块在用户空间)
优点如下:1.能发挥多处理机的优势 2.一个线程被阻塞,可以直接让同一进程的其他线程接管处理机,而不是进行开销较大的进程切换 3.内核支持线程具有很小的数据结构和堆栈,线程切换比较快
缺点如下:1.同一进程内的线程切换需要从用户态切换到核心态,系统开销大。
(3)组合方式
有些系统使用两者组合的方式。在组合方式中,内核支持多个内核级线程的建立,同时支持用户程序建立用户级线程。一些内核级线程对应一个或者多个用户级线程,这时用户级线程可以时分复用内核级线程,从而使得吸收了两者优点又克服了两者缺点。
在线程实现方式中,通过线程库建立和管理线程是常用方法,可以为程序员提供管理线程的API。
多线程模型
有些系统同时支持用户级线程和内核级线程,由于用户级线程和内核级线程的连接方式的不同,分为了以下三种多线程模型
- 多对一模型。将多个用户级线程映射到一个内核级线程,线程的调度和管理在用户空间完成,当用户线程需要访问内核的时候才映射到内核级线程中,但是每次只允许一个线程映射。优点在于线程管理是在用户空间进行的,效率较高。缺点在于如果一个线程访问内核时阻塞,会导致其他线程也无法访问内核
- 一对一模型。优点是一个进程被阻塞不会影响到其他进程,并发性能好。缺点是每创建一个用户级线程就要创建一个内核级线程,开销大。
- 多对多模型,将n个用户级线程映射到m个内核级线程上,克服了多对一的并发性问题,又避免了一对一模型的大开销