(一)前驱图和程序执行
前驱图(Precedence Graph):有向无循环图,可记为DAG(Directed Acyclic Graph),用于描述进程之间执行的先后顺序,不允许有循环。
每个结点可用来表示一个进程或出现段,乃至一条语句
结点间的有向边表示两个结点之间存在的偏序(Partial Order)或前驱关系(Precedence Relation)
进程P1和P2存在前驱关系可表示为P1->P2,P1是P2的直接前驱,P2是P1的直接后继
没有前驱的结点称为初始结点(Initial Node)
没有后继的结点称为终止结点(Final Node)
每个节点还具有一个重量(weight):用于表示该结点所含有的程序量或程序的执行时间
程序顺序执行时的特征:
- 顺序性
- 封闭性
- 可再现性
程序并发执行时的特征:
- 间断性
- 失去封闭性
- 不可再现性
(二)进程的描述
进程的定义:
- 进程是程序的一次执行
- 进程是一个程序及其数据在处理机上顺序执行时所发生的活动
- 进程是具有独立功能的程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位
进程实体(又称进程映像):简称为进程,由三部分构成:
- 程序段
- 相关的数据段
- 进程控制块(Proces Control Block,PCB):使参与并发执行的每个程序(含数据)都能独立地运行的数据结构
进程的特征:
- 动态性:进程最基本的特征,进程的实质是进程实体的执行过程
- 并发性:程序(没有建立PCB)是不能参加并发执行的
- 独立性:未建立PCB的程序都不能作为一个独立的单位参与运行
- 异步性:进程是按异步方式运行的
进程的三种基本状态:
- 就绪(Ready)状态
- 执行(Running)状态
- 阻塞(Block)状态
创建状态和终止状态
挂起操作引入的原因是基于系统和用户的需要:
- 终端用户的需要
- 父进程请求
- 负荷调节的需要
- 操作系统的需要
引入挂起原语操作后三个进程状态的转换:
- 活动就绪–>静止就绪
- 活动阻塞–>静止阻塞
- 静止就绪–>活动就绪
- 静止阻塞–>活动阻塞
引入挂起操作后五个进程状态的转换:
- NULL–>创建
- 创建–>活动就绪
- 创建–>静止就绪
- 执行–>终止
进程管理中的数据结构:
- 内存表
- 设备表
- 文件表
- 进程表:又称进程控制块PCB
PCB的作用: 是使一个在多道程序环境下不能独立运行的程序(含数据)成为一个能独立运行的基本单位,一个能与其他进程并发执行的进程
- 作为独立运行基本单位的标志
- 能实现间断性运行方式
- 提供进程管理所需要的信息
- 提供进程调度所需要的信息
- 实现与其他进程的同步与通信
进程控制块中的信息:
- 进程标识符:用于唯一地标识一个进程
外部标识符:通常由字母、数字组成,设置父进程标识及子进程标识,还可设置用户标识
内部标识符:通常是一个进程的序号,赋予每个进程一个唯一的数字标识符 - 处理机状态:处理机状态信息也称为处理机的上下文,重要是由处理机的各种寄存器中的内容组成。
通用寄存器:又称用户可视寄存器
指令计数器:存放要访问的下一条指令的地址
程序状态字PSW:含状态信息,如条件码、执行方式、中断屏蔽标志等
用户栈指针:用于存放过程和系统调用参数及调用地址 - 进程调度信息
- 进程控制信息
进程控制块的组织方式:
- 线性方式
- 链接方式
- 索引方式
操作系统内核的两大功能: - 支撑功能
中断处理
时钟管理
原语操作:一个操作中的所有动作要么全做,要么全部做 - 资源管理功能
进程管理
存储器管理
设备管理
引进创建进程的事件:
- 用户登录
- 作业调度
- 提供服务
- 应用请求
进程创建的步骤:
- 申请空白PCB
- 为新进程分配其运行所需的资源
- 初始化进程控制块(PCB)
初始化标识信息,将系统分配的标识符和父进程标识符填入新PCB中
初始化处理机状态信息,使程序计数器指向程序的入口地址,是栈指针指向栈顶
初始化处理机控制信息 - 若进程就绪队列能够接纳新进程,便将新进程插入就绪队列
引入进程终止(Termination of Process)的事件:
- 正常结束
- 异常结束
越界错
保护错
非法指令
特权指令错
运行超时
等待超时
算术运算错
I/O故障 - 外界干预
引入进程阻塞和唤醒的事件:
- 向系统请求共享资源失败
- 等待某种操作的完成
- 新数据尚未到达
- 等待新任务的到达
进程的挂起与激活
(三)进程同步
概念: 使进程对系统资源的无序争夺能有条不紊地运行。
作用: 改善资源利用率,显著提高系统的吞吐量
进程之间存在的两种形式的制约关系:
- 间接相互制约关系:由系统实施统一分配
- 直接相互制约关系:官程机制
临界资源:
多道程序系统中存在许多进程,它们共享各种资源,然而有很多资源一次只能供一个进程使用。
一次仅允许一个进程使用的资源称为临界资源。许多物理设备都属于临界资源,如输入机、打印机、磁带机等。
临界区:
每个进程中访问临界资源的那段代码
在临界区前面增加一段用于进行检查的代码,把这段代码称为进入区(enter section)。
相应地,在临界区后面也要加上一段称为退出区(exit section)的代码,用于将临界区正被访问的标志恢复为未被访问的标志。
进程区除上述的进入区、临界区及退出区之外的其他部分的代码都称为剩余区。
为实现进程互斥地进入自己的临界区,可采用软件方法,更多的是在系统中设置专门的同步机制来协调各进程间的运行。所有同步机制都应遵循下述四条准则:
- 空闲让进:当无进程处于自己的临界区时,表明临界资源处于空闲状态,应允许一个请求进入临界区的进程立即进入自己的临界区,以有效地利用临界资源。
- 忙则等待:当已有进程进入临界区,表明临界资源正在被访问,因而其它试图进入临界区的进程必须等待,以保证对临界资源的互斥访问。
- 有限等待:对要求访问临界资源的进程,应保证在有限时间内能进入自己的临界区,以免陷入“死等”状态。
- 让权等待:当进程不能进入自己的临界区时,应立即释放处理机,以免进程陷入“忙等”状态。
硬件同步机制:
1.关中断:实现互斥的最简单方法之一
2.利用Test-and-Set指令实现互斥
3.利用Swap指令实现进程互斥
信号量机制:
1.整形信号量
2.记录型信号量
3.AND型信号量
4.信号量集
信号量的应用:
利用信号量实现进程互斥
利用信号量实现前驱关系
管程机制
管程的定义:
一个管程定义了一个数据结构能为并发进程所执行(在该数据结构上)的一组操作,这组操作能同步进程和改变管程中de数据
管程由四部分组成:
- 管程的名称
- 局部于管程的共享数据结构说明
- 对该数据结构进行操作的一组过程
- 对局部于管程的共享数据设置初始值的语句
管程主要有以下特性:
- 模块化:即管程是一个基本程序单元,可以单独编译
- 抽象数据类型:指管程中不仅有数据,而且有对数据的操作
- 信息隐蔽
管程和进程的不同:
- 两者都定义了数据结构,但进程定义的是私有数据结构PCB,管程定义的是公共数据结构,如消息队列等
- 两者都存在对各自数据结构上的操作,但进程是由顺序程序执行有关操作,而管程主要是进行同步操作和初始化操作
- 设置进程的目的在于实现系统的并发性,而管程的设置则是解决共享资源互斥使用问题
- 进程通过调用管程中的过程对共享数据结构实行操作,该过程就如通常的子程序一样被调用,因而管程为被动工作方式,进程则为主动工作方式
- 进程之间能并发执行,而管程则不能与其调用者并发
- 进程具有动态性,由“创建”而诞生,由“撤销”而消亡,而管程则是操作系统中的一个资源管理模块,供进程调用
进程通信
进程通信机制的四大类:
- 1.共享存储器系统(Shared-Memory System)
基于共享数据结构的通信方式
基于共享存储区的通信方式 - 2.管道(pipe)通信系统
- 3.消息传递系统(Message passing system)
直接通信方式
间接通信方式 - 4.客户机-服务器系统(Client-Server system)
套接字: 网络通信程序接口,主要是解决多进程同时通信时端口和物理线路的多路复用问题。包括两类:
- 基于文件型
- 基于网络型
远程过程调用和远程方法调用