进程和线程
进程
- 进程实体(进程映像)由PCB、程序段和数据段组成,其中PCB是进程存在的唯一标志。
线程
- 线程最直接的理解就是“轻量级进程”,它是一个基本的CPU执行单元,包含CPU现场(状态),也是程序执行流的最小单元,由线程ID、程序计数器、寄存器集合和堆栈组成。一个线程可以创建和撤销另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。
- 引入线程后,进程只作为除CPU外的系统资源的分配单元,而线程则作为处理机的分配单元。一个进程内部有多个线程。
线程与进程的比较/属性/特点
0)多线程操作系统中的进程已不再是一个基本的执行实体,但它仍具有与执行相关的状态。所谓进程处于“执行”状态,实际上是指该进程中的某线程正在执行。
1) 调度。在传统的操作系统中(引入线程之前),拥有资源和独立调度的基本单位都是进程,每次调度都要进行上下文切换,开销较大。
在引入线程的操作系统中,线程是独立调度的基本单位, 而线程切换的代价远低于进程。在同一进程中,线程的切换不会引起进程切换。但从一个进程中的线程切换到另一个进程中的线程时,会引起进程切换。
什么是上下文切换?
在传统的操作系统中,进程是拥有资源和独立调度的基本单位。当一个进程在执行时,它拥有系统的全部资源,并且可以独立地执行任务。然而,当操作系统需要进行任务调度时,它需要将当前正在执行的进程的上下文(即该进程的程序计数器、寄存器状态、内存数据等)保存下来,然后加载下一个进程的上下文到系统中,这个过程就叫做上下文切换。
2) 并发性。在引入线程的操作系统中,不仅进程之间可以并发执行,而且一个进程中的多
个线程之间亦可并发执行,甚至不同进程中的线程也能并发执行,从而使操作系统具有
更好的并发性,提高了系统资源的利用率和系统的吞吐量。
无论是进程还是线程,并发性的目的是为了提高系统资源的利用率和系统的吞吐量
3) 拥有资源。线程是进程中的一个实体,是被系统独立调度和分派的基本单位。进程是系统中拥有资源的基本单位,而线程不拥有系统资源(仅有一点必不可少、能保证独立运行的资源,比如:每个线程都有一个唯一的标识符和一个线程控制块,线程控制块记录了线程执行的寄存器和栈等在那个时刻的状态),但线程可以访问其隶属进程的系统资源,这主要表现在属于同一进程的所有线程都具有相同的地址空间。要知道,若线程也是拥有资源的单位,则切换线程就需要较大的时空开销,线程这个概念的提出就没有意义。
时空开销是指在进行进程或线程切换时,系统需要保存和恢复上下文信息以及分配和释放资源所需要的时间和空间。
如果线程也是拥有资源的单位,切换线程需要较大的时空开销,主要是因为线程的切换涉及到资源的分配和释放。而这些资源的分配和释放的进行需要时间以及系统的空间,所以加大了时空开销。
4) 独立性。每个进程都拥有独立的地址空间和资源,除了共享全局变量,不允许其他进程访问。某进程中的线程对其他进程不可见。同一进程中的不同线程是为了提高并发性及进行相互之间的合作而创建的,它们共享进程的地址空间和资源。
5) 系统开销。在创建或撤销进程时,系统都要为之分配或回收进程控制块PCB及其他资源,如内存空间、I/O设备等。操作系统为此所付出的开销,明显大于创建或撤销线程时的开销。类似地,在进程切换时涉及进程上下文的切换,而线程切换时只需保存和设置少量寄存器内容,开销很小。此外,由于同一进程内的多个线程共享进程的地址空间,因此这些线程之间的同步与通信非常容易实现,甚至无须操作系统的干预。
6) 支持多处理机系统。对于传统单线程进程,不管有多少处理机,进程只能运行在一个处理机上。对于多线程进程,可以将进程中的多个线程分配到多个处理机上执行。所以,一个多线程进程可以使用多个处理机,这些处理机分别是进程中的多个线程使用的。
7)不同的线程可以执行相同的程序。当某一个功能,被不同的用户或在不同的事件调用时,执行这个功能的线程可能是不同的。
8)线程是处理机的独立调度单位,多个线程是可以并发执行的。在单CPU的计算机系统中,
各线程可交替地占用CPU;在多CPU的计算机系统中,各线程可同时占用不同的CPU,
若各个CPU同时为一个进程内的各线程服务,则可缩短进程的处理时间。
9) 一个线程被创建后,便开始了它的生命周期,直至终止。线程在生命周期内会经历阻塞
态、就绪态和运行态等各种状态变化。
10)为什么线程的提出有利于提高系统并发性?
可以这样来理解:由于有了线程,线程切换时, 有可能会发生进程切换,也有可能不发生进程切换,平均而言每次切换所需的开销就变小了,因此能够让更多的线程参与并发,而不会影响到响应时间等问题。
线程的状态和转换
与进程一样,各线程之间也存在共享资源和相互合作的制约关系,致使线程在运行时也具有间断性。相应地,线程在运行时也具有下面三种基本状态。
- 执行状态:线程己获得处理机而正在运行。
- 就绪状态:线程已具备各种执行条件,只需再获得CPU便可立即执行。
- 阻寒状态:线程在执行中因某事件受阻而处于暂停状态。
线程这三种基本状态之间的转换和进程基本状态之间的转换是一样的。
线程的组织与控制
- 线程控制块
与进程类似,系统也为每个线程配置一个线程控制块TCB,用于记录控制和管理线程的信息。
线程控制块通常包括:①线程标识符;②一组寄存器,包括程序计数器、状态寄存器和通用寄存器;③线程运行状态,用于描述线程正处于何种状态;④优先级;⑤线程专有存储区,线程切换时用于保存现场等;⑥堆栈指针,用于过程调用时保存局部变量及返回地址等。
同一进程中的所有线程都完全共享进程的地址空间和全局变量。各个线程都可以访问进程地
址空间的每个单元,所以一个线程可以读、写或甚至清除另一个线程的堆栈。
2. 线程的创建
线程也是具有生命期的,它由创建而产生,由调度而执行,由终止而消亡。相应地,在操作系统中就有用于创建线程和终止线程的函数(或系统调用)。 用户程序启动时,通常仅有一个称为“初始化线程”的线程正在执行,其主要功能是用于创建新线程。在创建新线程时,需要利用一个线程创建函数,并提供相应的参数,如指向线程主程序的入口指针、堆栈的大小、线程优先级等。线程创建函数执行完后,将返回一个线程标识符。
3. 线程的终止
当一个线程完成自己的任务后,或线程在运行中出现异常而要被强制终止时,由终止线程调用相应的函数执行终止操作。但是有些线程(主要是系统线程)一旦被建立,便一直运行而不会被终止。通常,线程被终止后并不立即释放它所占有的资源,只有当进程中的其他线程执行了分离函数后,被终止线程才与资源分离,此时的资源才能被其他线程利用。
被终止但尚未释放资源的线程仍可被其他线程调用,以使被终止线程重新恢复运行。
线程的实现方式
- 用户级线程ULT
2. 内核级线程KLT