进程与线程
1 进程
1.1 为什么引入进程
1.1.1 程序的顺序执行
(1)程序执行的顺序性
程序在处理机上执行时,其操作只能严格地按照所规定的顺序执行,即后继操作只有在前一操作执行完毕之后才能进行。
(2)程序环境的封闭性
程序执行时会独占系统的全部资源。
(3)程序执行结果的确定性
程序执行的结果,只由初始条件和程序本身来确定,不受外界因素的影响。即程序的执行结果与执行速度、事件无关。
(4)计算过程的可再现性
当机器在同一数据集上重复执行同一程序时,每次执行都会得到相同的结果。
顺序程序设计的顺序性、封闭性、确定性和再现性给程序的编制、调试带来很大方便,其缺点是计算机系统效率不高。1.1.2 程序的并发执行
程序并发执行具有如下特点:
- 去了程序的封闭性和可再现性;
- 程序和机器执行程序的活动不再一一对应;
- 并发执行的程序存在着相互制约的关系。
并发程序设计是:把一个程序设计成若干个可同时执行的程序模块的方法。
并发程序设计的优点:
- 对于单处理器系统,可让处理器和IO设备同时工作,发挥硬部件的并行能力。
- 对于多处理器系统,可让各程序在不同处理器上物理地并行,加快计算速度。
- 简化了程序设计任务。
1.2 进程的定义、组成和特征
1.2.1 进程的定义
进程是一个可并发执行的具有独立功能的程序在某个数据集合上的一次动态执行过程,也是操作系统进行资源分配和保护的基本单位。
1.2.2 进程的组成
进程是程序在一个数据集合上的运行过程,它包括程序段、数据集合和进程控制块(PCB)三部分组成。把程序段和数据集合这两部分统称为进程实体,把PCB称为进程灵魂。
(1)程序段
它主要用于描述进程所需要完成的功能。
(2)数据集合
它包括程序执行时所需要的数据和工作区,本部分只能为一个进程专用,是进程执行时可修改部分。
(3)进程控制块
为了对进程实施有效地控制和管理,当系统创建进程时,为每一个进程设置了一个进程控制块PCB(process control block)。它记录了进程的描述信息和控制信息,是进程动态特性的集中反映。当进程被撤销时,系统回收其PCB。所以说PCB是进程存在的唯一标志,系统通过检测PCB的存在,而感知进程的存在。
1.2.3 进程控制块PCB
进程控制块包含进程标识信息、现场信息和控制信息三类。
(1)标识信息
用于唯一地标识一个进程,包括由用户使用的外部标识符和被系统使用的内部标识号。常用的标识信息有进程标识符、父进程的标识符、用户进程名、用户组名等。
(2)现场信息
保留进程运行时存放在处理器现场中的各种信息,进程让出处理器时必须把处理器现场信息保存到PCB中,当该进程重新恢复运行时也应该恢复处理器现场。现场信息包括通用寄存器内容、控制寄存器内容、用户堆栈指针、系统堆栈指针等。
(3)控制信息
·进程调度相关信息,如进程状态、等待事件和等待原因、进程优先级、队列指针等
·进程组成信息,如正文段指针、数据段指针
·进程间通信相关信息,如消息队列指针、信号量等互斥和同步机制
·进程在二级存储器内的地址信息
·CPU资源的占用和使用信息,如时间片余量、进程已占用时间、进程已执行时间总和、记账信息
·进程特权信息,如在内存访问和处理器状态方面的特权
·资源清单,包括进程所需全部资源、已经分得资源,如主存资源、IO设备、打开文件表等
1.2.4 进程的特征
(1)动态性
动态性是进程的最重要的特性。它表现在进程是由“创建”而产生,由“调度”而运行,因得不到资源而暂停运行,即阻塞,最后由“撤销”而消亡,可见进程有一定的生命周期。
(2)并发性
进程的多个实体同存于内存中,能在一段时间内同时执行。这样就保证了一个进程的程序能和其他进程的程序并发执行。
(3)独立性
进程实体是能独立运行的单位,它是系统中独立获得资源和独立调度的基本单位。
(4)异步性
进程间是以各自独立的、不可预知的速度向前推进,即按异步方式运行。这一特性导致程序执行的不可再现性。
(5)结构性
进程实体是有结构的,它由程序段、数据段和PCB三部分组成。
(6)共享性
多个进程可以共享系统中的资源。
(7)制约性
并发执行的进程之间可能存在相互制约关系。
1.2.5 进程与程序的区别
(1)程序是一组有序的指令集合,是一种静态的概念;进程是程序的一次执行,属于一种动态的概念。即进程是程序执行的动态过程,而程序是进程运行的静态文本。
(2)进程与程序并非是一一对应的,一个相同的程序运行在不同的数据集合上就构成不同的进程。即一个进程可以执行一个或几个程序;反之,同一个程序可能由几个进程同时执行。
(3)程序可以作为一种软件资料长期保存,但进程是有生命周期的。
(4)进程具有并发性,它能与其他进程并发执行;而一般的程序不具有这种明显的特性。
(5)并发进程之间可能存在相互制约关系。
1.3 进程的状态转换
1.3.1 进程的基本调度状态
(1)就绪状态(ready)
进程已经具备了运行条件,只等系统分配CPU就可以运行的状态。系统中处于就绪状态的进程可有多个。
(2)运行状态(running)
进程占用CPU正在运行其程序的状态。系统中处于运行状态的进程数目不能多于CPU的个数。在单CPU环境下,系统中处于运行状态的进程最多只有一个。
(3)阻塞状态(blocked)
进程在运行过程中,由于等待某个事件(例如IO操作、其他进程发来消息等)的完成而暂时让出CPU,从而进入等待的状态。由于造成等待的原因是各种各样的,所以处于阻塞状态的进程也按不同的条件处于不同的阻塞队列中,系统中处于阻塞状态的进程可有多个。
1.3.2 进程状态的转换及状态转换的具体原因
(1)就绪态---->运行态
CPU空闲时,系统按一种策略选择一个就绪进程,让它占用CPU,这个被选中的进程就从就绪态变成运行态。
(2)运行态---->阻塞态
进程在运行过程中因IO或等待使用资源或某事件的发生会从运行态变成阻塞态。
(3)阻塞态---->就绪态
阻塞进程的IO完成或资源得到满足或事件发生时会从阻塞态变成就绪态。
(4)运行态---->就绪态
正在CPU上运行的进程因时间片用完了或系统出现了更高优先级的就绪进程而不得不放弃CPU从运行态变成就绪态。
1.3.3 具有挂起状态的进程状态转换
- 引入“挂起”状态的原因
由于进程的不断创建,系统资源已不能满足进程运行的要求,就必须把某些进程挂起(susend),对换到磁盘镜像区中,暂时不参与进程调度,起到平滑系统操作负荷的目的。
进程挂起的具体情况有:
(1)系统中的进程均处于等待状态,需要把一些阻塞进程对换出去,腾出足够内存装入就绪进程运行。
(2)进程竞争资源,导致系统资源不足,负荷过重,需要挂起部分进程以调整系统负荷,保证系统的实时性或让系统正常运行。
(3)定期执行的进程(如审计、监控、记账程序)兑换出去,以减轻系统负荷。
(4)用户要求挂起自己的进程,以便进行某些调试、检查和改正。
(5)父进程要求挂起子孙进程,以进行某些检查和改正。
(6)操作系统需要挂起某些进程,检查运行中资源使用情况,以改善系统性能;或当系统出现故障或某些功能受到破坏时,需要挂起某些进程以排除故障。
2.具有挂起功能的进程状态转换
静止就绪状态(ready suspend):表明进程具备运行条件但目前在二级存储器中,当它被兑换到主存才能被调度执行。
静止阻塞状态(blocked suspend):表明进程正在等待某一个事件且在二级存储器中。
3.挂起进程的特征
(1)该进程不能被立即执行;
(2)挂起进程可能会等待事件,但所等待事件是独立于挂起条件的,事件结束并不能导致进程具备执行条件;
(3)进程进入挂起状态是由于操作系统、父进程或进程本身阻止它的运行。
(4)结束进程挂起状态的命令只能通过操作系统或父进程发出。
2 线程
2.1 线程概念
2.1.1 为什么要引入线程的概念
操作系统中引入进程的目的是为了使多个程序并发执行,改善资源的利用率以及提高系统的吞吐量。
在操作系统中引入线程,主要是为了减少程序并发执行时所付出的时间和空间开销,使系统具有更好的并发性。
在引入线程的操作系统中,进程是作为独立分配资源的单位,线程是进程的一个实体,是被独立调度和分派处理机的基本单位。由于同一个进程内的多个线程都可以访问进程的所有资源,因此线程之间的通信要比进程之间的通信方便的多;同一进程内的线程切换也因为线程的轻装而简单得多。
2.1.2 多线程编程的优点
(1)响应度高
如果对一个交互式应用程序采用多线程,即使部分阻塞或执行较冗长的操作,那么该程序仍能继续执行,从而增加了对用户的响应程度。例如:多线程网页浏览器在用一个线程装入图像时,能通过另一个线程与用户交互。
(2)资源共享
多个线程共享它们所属进程的内存和资源。
(3)经济
建立和撤销一个线程比建立和撤销一个进程所需要的时间要少,线程之间的切换比进程之间的切换花费的时间也要少,而且,由于同一个进程中的线程共享存储空间和文件,它们无需内核的支持就可以相互通信,提高了不同的执行程序之间的通信效率。
(4)多处理器体系结构的利用
多线程的最主要优点是能充分使用多处理器体系结构,使多个线程能并行运行在不同的处理器上。因此,在多处理器和多线程环境下,如果有一个由多个过程或函数组成的程序,则用一组线程来实现比用一个独立的进程实现更加有效。
2.2 线程与进程的比较
2.2.1 单线程进程结构和多线程进程结构
(1)单线程进程结构
在单线程的进程模型中(即没有线程概念的进程),进程由PCB,用户地址空间(包括程序段和数据段)以及在进程执行中管理调用、返回行为的用户堆栈和系统堆栈组成的。
(2)多线程进程结构
线程是操作系统进程中能够独立执行的实体(控制流),是处理器调度和分派的基本单位。线程是进程的组成部分,每个进程内允许包含多个并发执行的实体(控制流),这就是多线程。
在多线程环境下,进程是操作系统中进行保护和资源分配的基本单位。它具有:
·一个虚拟地址空间,用来容纳进程的映像;
·对处理器、其他(通信的)进程、文件和IO资源等的存取保护机制。
在多线程环境中,进程仍然有一个进程控制块和用户地址空间。但每个线程都有自己独立的堆栈和线程控制块。进程中的所有线程共享该进程的资源,它们驻留在同一块地址空间中,并且可以访问到相同的数据。当一个线程改变了内存中某个单元的数据时,其他线程在访问该数据单元时会看到变化后的结果。因此线程之间的通信变得更加简单、容易。
2.2.2 线程与进程的比较
从调度、并发性、拥有资源和系统开销四个方面来比较线程和进程。
(1)调度
线程作为调度和分派CPU的基本单位,进程作为资源分配的基本单位,使线程可以轻装运行,从而可以显著提高系统的并发程度。在同一个进程中,线程的切换不会引起进程的切换,只有当从一个进程中的线程切换到另一个进程中的线程时,才会引起进程的切换。由于系统调度的基本单位是线程而不是进程,所以,每当创建一个进程时,至少要同时为该进程创建一个线程,否则该进程无法被调度执行。
(2)并发性
进程之间可以并发执行,在一个进程中的多个线程之间也可以并发执行,因而系统具有更好的并发性,从而更有效地使用系统中的资源,提高系统的吞吐量。
(3)拥有资源
进程是拥有资源的独立单位。一般的,线程自己不拥有系统资源(只有少量的必不可少的资源),但它可以访问其隶属进程的资源。也就是说,一个进程的代码段、数据段及系统资源,如打开的文件、IO设备等,可供同一进程中的所有线程共享。
(4)系统开销
由于创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、IO设备等,因此操作系统所付出的时间和空间开销将显著地大于建立或撤销线程的开销。在进程切换时,涉及到当前进程CPU环境的保存及新被调度运行的进程CPU环境的设置,包括程序地址和数据地址等。而线程的切换只需保存和设置少量寄存器的内容,并不涉及到存储器管理方面的操作。可见,进程切换的开销远远大于线程切换的开销。此外,由于同一进程中的多个线程具有相同的地址空间,致使它们之间的同步和通信的实现,变得非常容易。
2.2.3 进程与线程的选择取决以下几点
1、需要频繁创建销毁的优先使用线程;因为对进程来说创建和销毁一个进程代价是很大的。
2、线程的切换速度快,所以在需要大量计算,切换频繁时用线程,还有耗时的操作使用线程可提高应用程序的响应
3、因为对CPU系统的效率使用上线程更占优,所以可能要发展到多机分布的用进程,多核分布用线程;
4、并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的请求;
5、需要更稳定安全时,适合选择进程;需要速度时,选择线程更好。