【线程】
进程是一个资源的拥有者,因而在创建、撤销、切换过程中,系统要付出较大的时空开销,这就限制了系统中所设置进程的数目,且进程切换也不能太过频繁,这就限制了程序的并发程度
为解决上述问题,在进程的基础上引入了线程,由于进程的不仅拥有资源,其还是调度与分派的基本单位,因此将进程的两个属性分开,使得不把作为调度与分派的基本单位也同时作为拥有资源的单位
由此,线程就成为了调度与分派的基本单位
线程具有许多传统进程的特征,因此称为轻量级进程,其是一个基本的 CPU 执行单元,也是程序执行流的最小单元,相应的,传统进程被称为重量级进程
【线程控制块】
系统为每个线程配置了一个线程控制块(Thread Control Block,TCB),所有用于控制、管理线程的信息均记录其中,其包括以下几项内容:
- 线程标识符:每个线程具有一个唯一的线程标识符
- 寄存器:包括程序计数器 PC、状态寄存器、通用寄存器等
- 线程运行状态:描述线程处于何种运行状态
- 优先级:线程执行的优先程度
- 线程专有存储区:用于线程切换时暂存线程保护信息
- 信号屏蔽:对某些信号加以屏蔽
- 堆栈指针:保存局部变量与返回地址
【线程状态】
基础状态
与传统进程一样,各线程间也存在着共享资源与相互合作的制约关系,使得线程在运行时具有间断性,相应地,线程在运行时也具有下述的三种基本状态,其状态转换与进程间的状态转换相同:
- 执行态:线程已获得处理机而正在运行
- 就绪态:线程已具备各种执行条件,只需获得 CPU 资源即可执行
- 阻塞态:线程在执行过程中因某事件受阻而处于暂停状态
线程的创建
应用程序启动时,通常只有一个线程(初始化线程) 在执行,其主要功能是创建新线程
在创建新线程时,利用一个线程创建函数(或系统调用) ,并提供相应参数,在创建完成后,将返回一个线程标识符供以后使用
线程的终止
当一个线程被终止后,不会立即释放资源,只有当进程中的其它线程执行分离函数后,资源才分离出来能被其它线程利用
被终止而未释放资源的线程仍可被需要它的线程调用,使其重新恢复运行
【进程与线程的对比】
在多线程的操作系统中,进程包含多个线程,并为它们提供资源,操作系统支持在一个进程中的多个线程能并发执行,但此时的进程不再作为一个执行的实体
多线程下的进程具有以下属性:
- 进程是一个拥有资源的基本单位,其仍为系统资源分配的基本单位
- 多个线程可并发执行,但至少有一个线程为其他线程提供资源与运行环境
- 进程已不再是可执行的实体,线程作为独立运行的基本单位
因此,进程与线程可进行以下对比:
- 调度:线程作为CPU调度的基本单位,而进程只作为其它资源分配单位
- 并发性:进程之间可以并发,实质上是不同进程中的两个线程并发,而一个进程的多个线程之间也可并发
- 拥有资源:进程间资源相互独立,同一进程的各线程间共享,但某进程内的线程在其它进程不可见
- 系统开销:由于同进程内线程间共享内存地址和打开的文件资源,因此线程上下文切换在同进程环境下上下文切换要快得多