操作系统——进程与线程
目录
一、进程
1.进程的概念
2.进程的特征
3.进程的组成
4.进程的状态与转换
5.进程的通信
二、线程
1.线程的基本概念
2.进程和线程的比较
3.线程的状态
4.线程的组织
5.线程的实现方式
一、进程
1.进程的概念
引入进程(Process)的概念,能更好地描述和控制程序的并发执行,实现操作系统的并发性和共享性。
为了使参与并发执行的每个程序(含数据)都能独立地运行,必须为之配置一个专门的数据结构,称为进程控制块(Process Control Block,PCB)。系统利用PCB来描述进程的基本情况和运行状态,进而控制和管理进程。相应地,由程序段、相关数据段和PCB三部分构成了进程实体(又称进程映像)。所谓创建进程,就是创建进程的PCB;而撤销进程,就是撤销进程的PCB。
从不同的角度,进程可以有不同的定义,比较典型的定义有:
1)进程是一个正在执行程序的实例。
2)进程是一个程序及其数据从磁盘加载到内存后,在CPU上的执行过程。
3)进程是一个具有独立功能的程序在一个数据集合上运行的过程。
引入进程实体的概念后,我们可将传统操作系统中的进程定义为:进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。
2.进程的特征
动态性、并发性、独立性、异步性。
1)动态性。进程是程序的一次执行,它有着创建、活动、暂停、终止等过程,具有一定的
生命周期,是动态地产生、变化和消亡的。动态性是进程最基本的特征。
2)并发性。指多个进程同存于内存中,能在一段时间内同时运行。引入进程的目的就是使进程能和其他进程并发执行。并发性是进程的重要特征,也是操作系统的重要特征。
3)独立性。指进程是一个能独立运行、独立获得资源和独立接受调度的基本单位。凡未建
立PCB 的程序,都不能作为一个独立的单位参与运行。
4)异步性。由于进程的相互制约,使得进程按各自独立的、不可预知的速度向前推进。异步性会导致执行结果的不可再现性,为此在操作系统中必须配置相应的进程同步机制。
3.进程的组成
进程控制块(PCB)、程序段、数据段。
PCB主要包括进程描述信息、进程控制和管理信息、资源分配清单和CPU相关信息等。
4.进程的状态与转换
1)运行态。进程正在CPU上运行。在单CPU中,每个时刻只有一个进程处于运行态。
2)就绪态。进程获得了除 CPU 外的一切所需资源,一旦得到 CPU,便可立即运行。系统中处于就绪态的进程可能有多个,通常将它们排成一个队列,称为就绪队列。
3)阻塞态。又称等待态。进程正在等待某一事件而暂停运行,如等待某个资源可用(不包括CPU)或等待I/O 完成。即使CPU空闲,该进程也不能运行。系统通常将处于阻塞态的进程也排成一个队列,甚至根据阻塞原因的不同,设置多个阻塞队列。
4)创建态。进程正在被创建,尚未转到就绪态。创建进程需要多个步骤:首先申请一个空白PCB,并向PCB 中填写用于控制和管理进程的信息;然后为该进程分配运行时所必须的资源;最后将该进程转入就绪态并插入就绪队列。但是,如果进程所需的资源尚不能得到满足,如内存不足,则创建工作尚未完成,进程此时所处的状态称为创建态。
5)终止态。进程正从系统中消失,可能是进程正常结束或其他原因退出运行。进程需要结束运行时,系统首先将该进程置为终止态,然后进一步处理资源释放和回收等工作。
5.进程的通信
共享存储、消息传递、管道通信。
二、线程
1.线程的基本概念
引入进程的目的是更好地使多道程序并发执行,提高资源利用率和系统吞吐量;而引入线程(Threads)的目的则是减小程序在并发执行时所付出的时空开销,提高作系统的并发性能。
线程最直接的理解就是轻量级进程,它是一个基本的CPU执行单元,也是程序执行流的最小单元,由线程ID、程序计数器、寄存器集合和堆栈组成。线程是进程中的一个实体,是被系续独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其他线程共享进程所拥有的全部资源。一个线程可以创建和撒销另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。
2.进程和线程的比较
1)调度。在传统的操作系统中,拥有资源和独立调度的基本单位都是进程,每次调度都要进行上下文切换,开销较大。在引入线程的操作系统中,线程是独立调度的基本单位而线程切换的代价远低于进程。在同一进程中,线程的切换不会引起进程切换。但从个进程中的线程切换到另一个进程中的线程时,会引起进程切换。
2)并发性。在引入线程的操作系统中,不仅进程之间可以并发执行,而且一个进程中的多个线程之间亦可并发执行,甚至不同进程中的线程也能并发执行,从而使操作系统具有更好的并发性,提高了系统资源的利用率和系统的吞吐量。
3)拥有资源。进程是系统中拥有资源的基本单位,而线程不拥有系统资源(仅有一点必不可少、能保证独立运行的资源),但线程可以访问其隶属进程的系统资源,这主要表现在属于同一进程的所有线程都具有相同的地址空间。要知道,若线程也是拥有资源的单位,则切换线程就需要较大的时空开销,线程这个概念的提出就没有意义。
4)独立性。每个进程都拥有独立的地址空间和资源,除了共享全局变量,不允许其他进程访问。某个进程中的线程对其他进程不可见。同一进程中的不同线程是为了提高并发性及进行相互之间的合作而创建的,它们共享进程的地址空间和资源。
5)系统开销。在创建或撤销进程时,系统都要为之分配或回收进程控制块PCB及其他资源如内存空间、IO 设备等。操作系统为此所付出的开销,明显大于创建或撤销线程时的开销。类似地,在进程切换时涉及进程上下文的切换,而线程切换时只需保存和设置少量寄存器内容,开销很小。此外,由于同一进程内的多个线程共享进程的地址空间,因此这些线程之间的同步与通信非常容易实现,甚至无须操作系统的干预。
6)支持多处理器系统。对于传统单线程进程,不管有多少个CPU,进程只能运行在一个CPU上。对于多线程进程,可将进程中的多个线程分配到多个CPU上执行。
3.线程的状态
执行态:线程已获得 CPU而正在运行。
就绪态:线程已具备各种执行条件,只需再获得CPU便可立即执行。
阻塞态:线程在执行中因某事件受阻而处于暂停状态。
线程这三种基本状态之间的转换和进程基本状态之间的转换是一样的。
4.线程的组织
与进程类似,系统也为每个线程配置一个线程控制块TCB,用于记录控制和管理线程的信息
线程控制块通常包括:①线程标识符;②一组寄存器,包括程序计数器、状态寄存器和通用寄存器;③线程运行状态,用于描述线程正处于何种状态;④优先级;⑤线程专有存储区,线程切换时用于保存现场等;⑥堆栈指针,用于过程调用时保存局部变量及返回地址等。
同一进程中的所有线程都完全共享进程的地址空间和全局变量。各个线程都可以访问进程地址空间的每个单元,所以一个线程可以读、写或甚至清除另一个线程的堆栈。
5.线程的实现方式
用户级线程(User-Level Thread,ULT)、内核级线程(Kernel-Level Thread,KLT)。