第二章、进程的描述与控制
2.1 前趋图和程序执行
2.1.1 前趋图
概念:
所谓前趋图:指一个有向无循环图(DAG),它用于描述进程之间执行的先后顺序。
2.1.2 程序顺序执行
特征:
- 顺序性
- 封闭性:指程序在封闭的环境中运行,程序运行时独占全机资源,资源的状态只有本程序才能改变,程序一旦开始执行,其执行结果不受外界因素影响
- 可再现性:只要条件相同还会得到相同的执行结果。
2.1.3 程序并发执行
特征:
- 间断性
- 失去封闭性
- 不可在现性
2.2进程的描述
2.2.1 进程的定义和特征
定义
为了使程序并发执行,并且可以对并发执行的程序加以描述和控制,人们引入了进程的概念。
为了使参与并发执行的每个程序都能独立运行,在操作系统中必须为之分配一个专门的数据结构,称为进程控制块(PCB)。系统利用PCB来描述进程的基本情况和活动过程,进而控制和管理进程。
因此进程的定义为:由程序段、相关的数据段和PCB三部分构成的进程实体。
比较典型的定义有:
- 进程是程序的一次执行
- 进程是一个程序及其数据在处理机上顺序执行时所发生的活动
- 进程是具有独立功能的程序在一个数据结合上运行的过程,它是系统进行资源分配和调度的一个独立单位。
进程的特征
- 动态性
- 并发性
- 独立性
- 异步性
2.2.2 进程的基本状态以及转换
进程三种基本状态
由于多个进程在并发执行时共享系统资源,致使他们在运行过程中呈现间断性的运行规律,所以进程在生命周期内可能具有不同状态。一般而言,每个进程至少应处于以下三种基本状态:
- 就绪(Ready)状态
指进程已处于准备好运行的状态,即进程已分配到除CPU以外的所有必要资源后,只要再获得CPU就可以立即执行。如果有多个就绪状态的进程。
通常按照一定的策略排成一个队列,称该队列为就绪队列 - 执行(Running)状态
指进程已经获得CPU,其程序正在执行的状态。在单处理机系统中,只有一个进程处于执行状态,而多处理机系统则有多个进程处于执行状态。 -
阻塞(Block)状态
指正在执行的进程由于发生某事件(如I/O请求、申请缓冲区失败等)暂时无法继续执行时的状态,即进程的执行受到了阻塞。此时引起进程调度,OS把处理机分配给另一个就绪的进程,而让受阻进程处于暂停状态,一般将这种暂停状态称为阻塞状态,有时也称为等待状态或*状态。
通常系统将处于阻塞状态的进程也排成一个队列,称为阻塞队列。三种基本状态的转换
- 就绪--->执行 处于就绪状态的进程,在调度程序为之分配了处理机之后便可执行 。
- 执行--->就绪 正在执行的进程如果因为分配给他的时间片用完而被剥夺处理机暂停执行,其状态就会变成就绪。
-
执行--->阻塞 如果因发生某事件,致使当前进程行为受阻(例如进程访问临界资源,而该资源正被其他进程访问时),则变成了阻塞。
创建状态和终止状态
创建状态
申请PCB,填写用于控制和管理进程的信息--->分配必须资源--->把进程转入就绪状态并插入就绪队列。
引入创建状态是为了保证进程调度必须在创建工作完成后进行,以确保对进程控制块操作的完整性。终止状态
两个步骤: 首先,是等待操作系统进行善后处理,最后将其PCB清零,并将PCB空间返还系统。
2.2.3 挂起操作和进程状态的转换
当挂起操作作用与某个进程时,该进程被挂起,意味着此时该进程处于静止状态。如果进程在执行,那么将暂停执行。
引入挂起的原因
- 终端用户的需要
- 父进程的请求
- 负荷调节的需要
- 操作系统的需要
引入挂起原语操作后三个进程的状态转换
引入挂起原语Suspend和激活原语Active后,进程可能发生以下几种状态转换:
- 活动就绪--->静止就绪
当进程处于未被挂起的就绪状态时,被称为活动就绪状态,标示为Readya,此时进程接受调度。当用Suspend将进程挂起时,此进程变为静止就绪状态,表示为Readys,此时进程不再被调度执行。 - 活动阻塞--->静止阻塞
当进程未被挂起时的阻塞状态称为活动阻塞状态,表示为Blockda,当用SUspend挂起时,便成为了静止阻塞,表示为Blockeds.处于该状态的进程中在其所期待的事件出现后,它将从静止阻塞变为静止就绪状态Readys状态。 - 静止就绪--->活动就绪
处于Readys状态的进程若用Active激活后,就变成了活动就绪Readya状态。 - 静止阻塞--->活动阻塞
处于Blockeds状态的用Active激活后,变成Blockeda状态。
2.2.4 进程管理中的数据结构
进程控制块的作用
进程控制块的作用是使一个在多道程序环境下不能独立运行的程序成为一个能独立运行的基本单位,一个能与其他进程并发执行的进程。
- 作为独立运行基本单位的标志。
- 能实现间断性运行方式。
- 提供进程管理所需要的信息。
- 提供进程调度所需要的信息。
- 实现与其他进程的同步与通信。
2.3 进程控制
2.3.1 引起创建进程的事件
- 用户登录
- 作业调度
- 提供服务
- 应用请求
2.3.2 进程创建步骤:
- 申请空白PCB,为新进程申请获得唯一的数字标识符,并从PCB集合中索取一个空白PCB。
- 为新进程分配其运行所需要的资源,包括物理和逻辑资源,如内存、文件、I/O设备和CPU时间等。
- 初始化进程控制块
- 如果进程就绪队列能够接纳新的进程,便将新进程插入就绪队列。
2.3.3 进程的终止
引起进程终止的事件:
- 正常结束,表示进程的任务已经完成,准备推出运行。
- 异常结束,指进程在运行时发生了某种异常事件,使程序无法继续运行。
- 越界错:程序访问存储区超出该进程区域
- 保护措:进程访问一个不允许访问的资源,或者以不当的方式访问。
- 非法指令:程序试图去执行不存在的指令
- 特权指令错:用户进程试图去执行一条只允许OS执行的指令
- 运行超时:进程执行事件超过了制定的最大值
- 等待超时:进程等待的时间超过了规定最大值
- 算术运算错:进程试图执行一个被禁止的运算。例如被0除。
- I/O故障:I/O过程中发生错误。
- 外界干预
- 操作员或者操作系统干预
- 父进程请求
- 父进程终止
进程终止的过程
- 根据被终止进程的标识符,从PCB集合中检索出该进程的PCB,从中读取该进程的状态
- 若被终止进程正在处于执行状态,则立即终止执行,并置调度标志为真,用于指示该进程被终止后应重新进行调度。
- 如有该进程有子进程,则所有子进程也终止
- 将被终止进程PCB从队列移除,等待其他程序来搜集信息。
2.3.4 进程的阻塞与唤醒
引起进程阻塞和唤醒的事件:
- 向系统请求共享资源失败
请求共享资源,但是没有足够资源分配,所以进程变为阻塞状态。 - 等待某种操作的完成
例如一个进程的完成必须要有另一个进程的支持,即另个进程完成后这个进程才能执行,这时候进程变为阻塞状态。 - 新数据尚未到达
- 等待新任务到达
进程阻塞过程
如果进程执行,则立刻停止,把PCB插入阻塞队列。
进程唤醒过程
当阻塞进程所期待的事件发生,则调用唤醒原语wakeup,从阻塞队列移出,将PCB状态由阻塞变为就绪,然后把PCB插入就绪队列中。
2.3.5 进程的挂起与激活
进程的挂起
检查进程状态,如果活动就绪改为静止就绪;如果活动阻塞改为静止阻塞。为了方便用户或父进程考察该进程的运行情况,把进程PCB复制到制定内存区域;最后若被挂起的进程正在执行,则扎ungxiangdiaodu程序重新调度。
进程的激活状态
利用激活原语Active,把进程从外存调入内存,检查其状态,若静止就绪改为活动就绪;若静止阻塞改为活动阻塞。
2.4 进程同步
2.4.1 进程同步的基本概念
进程同步机制的主要任务,是对多个相关进程在执行次序上进行协调,使并发执行的进程之间能够按照一定的规则共享系统资源,并且很好地相互合作,从而使程序的执行具有可再现性。
两种形式的制约关系
由于共享资源或者为完成某一任务相互合作,而产生制约关系
- 间接相互制约关系
多个程序在并发执行时,由于共享系统资源导致这些并发执行程序之间形成的相互制约关系。例如打印机这些临界资源 - 直接相互制约关系
通过合作而产生的制约关系。例如只有a执行过后,b才能执行。而两者都是为了完成某一个功能。
临界资源
只能一个进程访问的资源。进程之间采取互斥方式,实现对这种资源的共享。通过生产者---消费者问题(进程同步问题)可说明这一过程。 (具体不再说明该问题) 。
临界区
每个进程中访问临界资源的那段代码称为临界区。可把一个访问临界资源的循环进程描述如下:
while(TRUE)
{
进入区
临界区
退出区
剩余区
}
同步机制应遵循的规则
- 空闲让进
- 忙则等待
- 有限等待
- 让权等待:当进程不能进入自己的临界区时,应立即释放处理机,以免进程陷入忙等状态。
2.4.2 硬件同步机制
再次不再介绍
2.4.3 信号量机制
整型信号量
记录型信号量
AND型信号量
信号量集
2.5 进程通信
进程通信是指进程之间的信息交换。
- 低级通信和高级通信
- 低级通信:效率低:生产者只能向缓冲池投一个产品,消费者只能取一个;通信对用户不透明
- 高级通信:使用方便;高效传送大量数据。
2.5.1 进程通信的类型
高级通信机制可归为以下四大类:
- 共享存储器系统。
存在一块共享某些数据结构或者共享存储区,通过这些空间进行通信。又分为: - 基于共享数据结构的通信方式(低级通信)
- 基于共享存储区的通信方式(高级通信)
- 管道通信系统
- 消费传递系统
- 客户机-服务器系统
2.5.2 消息传递通信的实现方式
- 直接消息传递系统
- 信箱通信
2.5.3 进程通信的几种方式(管两信,报共套)
- 管道(pipe)以及有名管道(named pipe)
管道可用于具有亲缘关系的进程之间的通信,有名管道克服了管道没有名字的限制。因此,除具有管道所有具有的功能外,它还允许无亲缘关系的进程通信 - 信号(Signal)
信号是比较负载的通信方式,用于通知接收进程有某种事件发生,除了用于进程通信外,进程还可以发送信号给进程本身。 - 报文(Message)队列(消息队列)
消息队列是消息的链接表。有足够权限的进程可以想队列添加消息,被赋予读权限的进程可以读走队列中的消息。 - 共享内存
是多个进程可以访问同一块内存,是最快的IPC形式。 - 信号量(samaphore)
主要作为进程之间以及统一进程不同线程之间的同步手段。 -
套接口(Socket)
更为一般的进程间通信机制,可以用于不同机器之间进程间的通信2.6 线程(Threads)的基本概念
线程的引入
如果说在OS中引入进程的目的是为了使多个程序能够并发执行,以提高资源利用率和系统吞吐量,那么,在操作系统中再引入线程,则是为了减少程序在并发执行时所付出的时空开销,使OS具有更好的并发性。
进程的两个基本属性
- 进程是一个可拥有资源的独立单位,一个基础南横要能独立运行它必须拥有一定的资源。
进程同时又是一个可独立调度和分派的基本单位。
程序并发执行所需付出的时空开销
由于进程是一个资源拥有者,因而在创建、撤销和切换中,系统必须为之付出较大的时空开销。
线程是调度和分派的基本单位。
线程与进程的比较
线程具有许多传统进程所具有的特征,所以又称为轻型进程或进程元。相应地把传统进程称为重型进程。它相当于有一个线程的任务。
- 调度的基本单位
传统的OS中,进程是作为独立调度和分派的基本单位,在每次调用时,都需要上下文切换,开销较大。
而引入线程的OS中,已把线程作为调度和分派的基本单位。当线程切换时,只需保存和设置少量寄存器的内容,切换代价低于进程。在同一个进程中,线程的切换不会引起进程的切换,但从一个进程中的线程切换到另一个进程中的线程时,必然会引起进程的切换。 - 并发性
线程的并发性比较好。一个进程中的多个线程之间亦可并发执行;一个进程中的所有线程都可以并发执行;不同进程中的线程也能并发执行。如果采用传统的进程,则每次只能执行一个任务,并发性不太好。 - 拥有资源
进程可以拥有资源,而线程本身不拥有系统资源,而是仅有一点必不可少的、能保证独立运行的资源。而且线程还允许多个线程共享该进程所拥有的资源。 - 独立性
同一进程中不同线程之间独立性比不同进程之间独立性低得多。 - 系统开销
创建或者撤销进程是系统开销比线程要大。 - 支持多处理机系统
对于传统进程,即单线程进程,不管有多少个处理机,该进程只能运行在一个处理机上。但是对于多线程进程,可以将一个进程中的多个线程分配到多个处理机,提高进程完成速度。
总的来说:可以用占有资源的多少,并发性,独立性和支持多处理机系统方面来概述。
线程的状态和线程控制块
线程状态
执行、就绪、阻塞。和进程一样
线程控制块(TCB)
- 线程标识符
- 一组寄存器
- 线程运行状态
- 优先级
- 线程专有存储区
- 信号屏蔽
- 堆栈指针
2.7 线程的实现
线程的实现方式
- 内核支持线程KST (Kernel Supported Thread)
执行、创建、撤销和切换都是在内核空间中实现的。调度以线程为单位进行。有以下优点:- 在多处理器系统中,内核能够同时调用同一进程中的多个线程并执行
- 如果进程中的一个线程阻塞,那么内核可以调度其他线程占有处理器运行。
- 内核支持的线程具有很小的数据结构和堆栈,线程切换比较快,切换开销小。
- 内核本身也可以采用多线程技术,可以提高系统的执行速度和效率。
其缺点是: 对于用户线程切换而言,其模式切换的开销较大,在同一个进程中,从一个线程切换到另一个线程时,需要从用户态转到核心态进行,这是因为用户进程的线程在用户态运行,而线程调度和管理在内核实现,系统开销较大。
- 用户级线程ULT(User Level Threads)
用户级线程是在用户空间中实现的。对线程的创建、撤销、同步与通信等功能,都无需内核支持,即用户级线程与内核无关。调度仍是以进程为单位进行。用户级线程的优点: - 线程切换不需要转换到内核空间
- 调度算法可以是进程专用的
用户线程的实现与OS平台无关。