2.3.2 线程的描述及状态
1.线程的描述及特点
关于线程至今尚无统一的定义,以下各种说法都描述了线程的特点:
·线程是进程内的一个执行单元;
·线程是进程内的一个可调度实体;
·线程是程序中相对独立的一个控制流序列。
本书将线程描述为:线程是进程中可独立执行的子任务,是系统独立调度和分派CPU的基本单位。
线程有以下几个特点。
①轻型实体:线程的实体中拥有尽量少的系统资源,以保证线程独立运行。因此说线程是“轻”型实体。
②独立调度和分派CPU的基本单位:因为线程是独立运行的基本单位,所以它是独立调度和分派CPU的基本单位。
③可并发执行:一个进程中的多个线程可以并发执行,不同进程中的线程也可以并发执行。
④共享进程资源:在同一个进程中的所有线程都可以共享该进程的所有资源,包括虚拟地址空间、打开的文件、信号量机制等,并且同属一个进程的所有线程具有相同的地址空间。
操作系统中引入线程后,进程仍作为拥有系统资源的独立单位。通常一个进程包含多个线程并为它们提供资源,但是进程不再是执行实体。
从拥有资源的角度看,线程几乎不占资源,同族的线程共享进程的资源;从处理机调度角度看,进程不再是处理机调度的基本单位,通常一个进程都含有多个相对独立的线程,其数目可多可少,但至少要有一个线程,由进程为这些线程提供资源及运行环境,使这些线程可以并发执行。在操作系统中的所有线程都只能属于某一个特定进程。进程和线程都有并发性,进程之间可以并发执行,线程之间也可以并发执行;而对于系统开销来说,线程的创建、撤销与切换的系统开销比进程小得多,这也正是引入线程的初衷。
2.线程控制块及线程映像
与进程一样,线程也是动态概念,它的动态特性由线程控制块(TCB,Thread Control Block)描述,主要包括下列信息:
·线程状态;
·当线程不运行时,被保存的现场,线程的现场相对简单,主要包括程序计数器、寄存器集合;
·一个执行堆栈;
·存放每个线程的局部变量主存区。
线程的实体称为线程映像,由程序、数据和TCB组成,如图2-29所示。
3.线程状态及控制
和进程一样,线程也是有生命期的,从产生到消亡有状态变化。线程的状态包括运行、就绪和阻塞。运行状态即线程占有处理机正在运行;就绪状态即线程具备运行的所有条件,逻辑上可以运行,在等待处理机;阻塞状态即线程在等待一个事件(如某个信号量),逻辑上不可执行。与线程状态变化有关的4个基本操作如下。
(1)创建线程
一般来说,当创建一个新的进程时,也创建一个新的线程,之后,进程中的线程可以在同一进程中创建新的线程。创建新线程要为其分配TCB,提供指令指针和参数,同时还提供新线程的寄存器和栈空间,之后将其置为就绪态,挂到线程就绪队列。线程之间是并列的,并不存在层级关系,每一个进程初始创建时只有一个线程。
(2)阻塞线程
当线程等待某个事件无法运行时,停止其运行,保护线程的用户寄存器、程序计数器和栈指针,将线程置为阻塞状态,调度处理机调度程序。
(3)唤醒线程
当阻塞线程的事件发生时,将被阻塞的线程状态置为就绪态,将其挂到就绪队列。
(4)终止线程
一个线程在完成了自己的工作后,可以正常终止自己,也可能某个线程执行错误,由其他线程强行终止。终止线程操作主要负责释放线程占有的寄存器和栈。
尽管在多线程操作系统中,进程不再是执行实体,但是进程仍然具有与执行相关的状态。例如,所谓进程处于“执行”状态,实际上是指该进程中的某线程正在执行。对进程施加的与进程状态有关的操作,也对其线程起作用。
图2-29 线程映像
例如,把某个进程挂起时,该进程中的所有线程也都被挂起,激活也是同样。
线程阻塞不等于进程阻塞。一个线程的阻塞会导致进程阻塞吗?或者,一个线程被阻塞,会阻止该进程中的其他线程运行吗?前者答案是否定的,后者情况比较复杂,具体可见William Stallings所著的《操作系统——内核与设计原理(第四版)》。