Transcript
Page 1: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

2.1 2.1 进程的基本概念进程的基本概念 2.2 2.2 进程管理进程管理 2.3 2.3 进程调度进程调度 2.4 2.4 进程间的同步与互斥进程间的同步与互斥 2.5 2.5 进程通讯进程通讯 2.6 2.6 死锁死锁

Page 2: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

2.1 2.1 进程的基本概念进程的基本概念

程序的顺序执行和并发执行程序的顺序执行和并发执行

顺序执行是顺序执行是单道批处理单道批处理系统的执行方式,系统的执行方式,也用于简单的单片机系统;也用于简单的单片机系统;

现在的操作系统多为现在的操作系统多为并发执行并发执行,具有许多,具有许多新的特征。引入并发执行的目的是为了提高新的特征。引入并发执行的目的是为了提高资源利用率。资源利用率。

Page 3: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

• 顺序执行的特征顺序执行的特征– 顺序性 – 封闭性 – 可再现性

• 例:程序段例:程序段 read(disk,&a,4); /* 从磁盘读 a*/ read(tape,&b,4); /* 从带读 b*/ c=a+b; printf(“c=%f\n”,c);

程序的顺序执行程序的顺序执行

Page 4: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

是一个有向无环图,图中每个结点表示一个语句、一段程序或一个进程

1.1. 前驱图前驱图

有向边有向边 << Vi Vi , , VjVj > > 表示 VjVj 仅在仅在 ViVi 执行完后才能开始执行执行完后才能开始执行 S1S1

S3S3

S7S7

S6S6S4S4

S2S2

S5S5

S2S2

S1S1

S3S3

前驱图 有回路的前驱图

程序并行性表示程序并行性表示

Page 5: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

类 Pascal 的并行语句。

COBEGIN

s1 ; s2 ;…; sn

COEND

COBEGIN / COEND 相当于一个括号,表示其中的所有语句 s1, s2,… sn 可并行执行。

2.2. 并行语言并行语言

Page 6: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

并发执行的条件(并发执行的条件( BernsteinBernstein 条件)条件)

• 程序 P(i) 针对变量的读集 R(i) 和写集 W(i)• 条件:任意两个程序 P(i) 和 P(j) ,同时满足:

– R(i)W(j)=;– W(i)R(j)=;– W(i)W(j)=;

1966 年,由 Bernstein 给出并发执行的条件。

前两条保证一个程序的两次读之间数据不变化;最后一条保证写的结果不丢掉。

例: s1: read(disk,&a,4); /* 从磁盘读 a*/ s2: read(tape,&b,4); /* 从带读 b*/ s3: c=a+b;

R(s1)= W(s1) ={a} s1 和 s2 可并发, s2 和 s3 不可并发

Page 7: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

多道程序系统:资源共享;程序的并发运行多道程序系统:资源共享;程序的并发运行

例: int N=0; /* 全局变量 */ cobegin progam A { while(1){ ….. N++; ….. } }

progam B { while(1){ ….. printf(“N=%d\n”,N); N=0; ….. } }coend

Page 8: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

•并发执行的特征并发执行的特征–间断 (异步 )性:“运行-暂停-运行”;并发程序之间依赖相互、相互制约–不可再现性–并发程序与它的执行过程并非一一对应

Page 9: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

进程进程 (PROCESS)(PROCESS) 的概念的概念 一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程。 是系统进行资源分配和调度的一个独立单位

进程的定义进程的定义

是并发程序的一次执行过程,它由一个动作序列组成,每个动作是在某数据集上执行一段程序,整个活动的结果是提供一种系统或用户功能。

Page 10: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

•动态性:产生、执行、暂停、消亡。有一个生存期

•独立性:是系统进行资源分配和调度的独立单位,是能独立运行的基本单位

•并发性:程序在建立进程后并发运行

进程的特进程的特征征

进程=程序+数据+ PCB ( 进程控制块, process control block)

Page 11: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

• 进程是动态的,程序是静态的• 进程是暂时的,程序的永久的• 进程与程序的组成不同

进程与程序的区进程与程序的区别别

进程与程序的联进程与程序的联系系•通过多次执行,一个程序可对应多个进程;通过调用关系,一个进程可包括多个程序。

Page 12: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

•运行状态:进程分配到必要的资源,在 CPU上执行时的状态

•就绪状态:进程分配到必要的资源,还没获得在 CPU 上执行的状态

•阻塞状态(等待状态):进程的执行由于本身不具备运行条件而受到阻塞,处于暂停状态

进程的状态进程的状态2.2 2.2 进程管理进程管理

三种基本调度状态三种基本调度状态

Page 13: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

Running

Ready Blocked

等待事件 ( 系统服务请求,如请求 I/O))

被调度或分派

时间片

用完

事件发生

Page 14: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

•挂起:强迫进程释放分配到的资源,将进程调出到外存

•活动:未被挂起的就绪和阻塞状态称为活动就绪和活动阻塞

•静止:被挂起的就绪和阻塞状态称为静止就绪和静止阻塞

进程的状态进程的状态 细分的进程调度状态细分的进程调度状态

Page 15: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

Readya

Running

Blockeda

BlockedsReadys

wakeup ( 唤醒 )

事件发生

挂起 suspend

时间片完

被调度

schoduler

解挂active

挂起suspend

解挂active挂起

suspend

等待事件

sleep

事件发生wakeup ( 唤醒 ) 图:具有挂起功能的进

程状态变化

Page 16: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

进程的状态转换:进程的状态转换:

三状态进程模型三状态进程模型

Admi t Runni ngNew Exi tReady

Bl ocked

Di spatch

Ti meout

Even

t

Wai tEv

ent

Occu

rs

Rel ease

Crea

te

Page 17: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

•程序:描述进程要完成的功能•数据集合:包含程序运行所需的数据和工作区•进程控制块( PCB):包含进程的描述信息和控制信息,是进程动态特性的反映

进程的物理结构进程的物理结构

程序和数据集合是进程的实体进程控制块是进程存在的唯一标志

进程控制块(进程控制块( PCB, process control block)PCB, process control block)

进程控制块是由 OS 维护的用来记录进程相关信息的一块内存。

Page 18: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

• 进程标识符:– 进程标识符 (process ID) (内部标识符):唯一,通常是一个整数;

– 进程名(外部标识符) :不唯一,由字母数字组成;• 位置信息:指出进程的程序和数据在内存和外存中的物理

位置• 现场信息:寄存器值(通用、程序计数器 PC 、状态 PSW ,地址包括栈指针)

• 状态信息:进程现行状态• 进程优先级:进程使用 CPU 的优先级别• 资源清单:已分配到的资源等• 同步与互斥机构• 进程通讯机制• 队列指针• 家族联系• 资源占用信息:虚拟地址空间的现状、打开文件列表

进程控制块的内容进程控制块的内容

Page 19: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

• 顺序表:将所有 PCB连续存放在内存。要经常扫描整个表

• 索引表:同一状态的 PCB 建立一个 index表(由index 指向 PCB ),多个状态对应多个不同的 index表– 各状态形成不同的索引表:就绪索引表、阻塞索引表

• 链表:同一状态的进程的 PCB 成一链表,多个状态对应多个不同的链表– 各状态的形成不同的链表:就绪链表、阻塞链表

PC B Table

Index Table

R eady

B locked

PCBPCB 的组织方式的组织方式

Page 20: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

进程控制进程控制 进程控制的功能进程控制的功能 完成进程状态的转换。

原语 (primitive) :由若干条指令构成的“原子操作 (atomic operation)”过程,作为一个整体而不可分割--要么全都完成,要么全都不做。许多系统调用就是原语。

Page 21: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

2.3 2.3 进程调度进程调度作业状态及其转换作业状态及其转换

• 提交状态• 后备状态:作业的全部信息已输入到磁盘的专用区(后备作业区)中,等待运行

• 执行状态:被作业调度程序选中,分配了必要资源,建立了 PCB ,进入进程的就绪状态,等待运行

• 完成状态:作业完成任务,释放资源

Page 22: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

调度的层次调度的层次

• 作业调度(高级调度):选择作业,调入内存,分配资源建立进程,将 PCB插入就绪进程队列

• 进程调度(低级调度):将 CPU 分配给进程,进行进程间切换,运行被调度进程

• 中级调度:进程映象在内存和盘交换区间的对换操作。防止死锁。

作业从提交到完成,要经历三级调度

Page 23: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

进程调度算法进程调度算法

• 非剥夺抢占方式:一旦进程占用 CPU 就一直运行,直到终止或阻塞

• 剥夺抢占方式:系统强行剥夺已分配给现运行进程的 CPU ,使其进入就绪进程队列

按占用处理器的方式,进程调度有两种方式:

进程调度方式进程调度方式

Page 24: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

• 设计目标:目标不同,系统的要求不同• CPU 利用率:• 吞吐量:系统在单位时间内完成的作业数目• 周转时间:从作业提交到完成的时间间隔• 等待时间:进程在就绪进程队列中的等待时间,通常用来衡量调度程序的性能

• 响应时间:从向系统发出请求到系统首次开始响应的时间间隔

• 资源利用率:最大限度地使各种资源并行操作• 合理的系统开销

调度算法性能标准调度算法性能标准

Page 25: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

•按先进先出组织就绪状态的进程队列•总是把 CPU 分配给就绪状态的进程队列的队首进程

•最简单的进程调度算法•属于非剥夺抢占方式

进程调度算法进程调度算法 先来先服务算法( FCFS )

Page 26: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

例:进程 P1,P2,P3 ,它们的 CPU 运行时间为 3 ,3 , 24 个单位时间

FCFS 特点:仅考虑作业提交时间,未考虑系统资源使用率

( 1 ) P3,P1,P2 顺序进入就绪进程队列,几乎同时到达 平均周转时间 =(24+27+30)/3=27

( 2 ) P1,P2,P3 顺序进入就绪进程队列,几乎同时到达 平均周转时间 =(3+6+30)/3=13

Page 27: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

•要求就绪状态的进程队列中每个进程有下一个 CPU 运行期的时间值

•把 CPU 分配给就绪状态的进程队列中下一个 CPU 运行期最短的进程

•短者优先的原则

进程调度算法进程调度算法 短 CPU 运行期优先算法( SCBF )

优点:等待时间最小,系统吞吐量高缺点:已知进程的 CPU 运行时间,很难实现

Page 28: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

例:进程 P1,P2,P3,P4 ,它们的 CPU 运行时间为 6 ,3 , 8 , 7 个单位时间, P3,P1,P2,P4 顺序进入就绪进程队列,几乎同时到达

FCFS 算法:平均周转时间 =(8+14+17+24)/4=15.75

SCBF 算法:平均周转时间 =(3+9+16+24)/4=13

Page 29: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

•系统自动按一定原则为每个进程规定一个调度优先权

•把 CPU 分配给就绪状态的进程队列具有最高优先权的进程

•常用的调度算法

进程调度算法进程调度算法 优先权调度算法

确定优先权的方法: 静态优先权法 动态优先权法

Page 30: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

进程创建时确定其优先权,运行期间不改变• 按进程类型确定• 按作业要求的资源类型和数量确定• 按作业提交的时间顺序确定• 按用户类型和要求确定

静态优先权法

优点:简单易实现,系统开销小缺点:未能反映进程的动态性

进程创建时赋一个优先权初值,运行期间动态调整其权值 动态优先权法

特点:防止一个进程垄断或长期等待 CPU

Page 31: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

时间片轮转算法 简单轮转法

• 就绪状态的所有进程按 FCFS 组成队列• 首先 CPU 分给队首的进程,规定一个时间片• 就绪队列中的所有进程轮流使用 CPU

T=NqN 就绪队列中进程数, T 为系统响应时间,时间片为q

多队列轮转法• 常用双就绪状态进程队列轮转法• 首先对前台就绪进程队列以时间片轮转法调度,

当前台就绪进程队列为空时,才对后台就绪进程队列按 FCFS 算法调度

Page 32: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

•按调度级别设置多个就绪进程队列•按级别划分时间片•各级就绪进程队列按 FIFO 组织, FCFS调度•最后一级按循环轮转方式组织调度

多级反馈队列调度算法

Page 33: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

2.4 2.4 进程间的同步与互进程间的同步与互斥斥

临界资源临界资源

• 进程间的制约关系– 间接制约:进行竞争--独占分配到的部分或全部共享资源,“互斥”

– 直接制约:进行协作--等待来自其他进程的信息,“同步”

系统中一次仅允许一个进程使用的一类资源。 打印机,卡片输入机,磁带机、共享变量等。

互斥:多个进程不能同时使用同一个资源;死锁:多个进程互不相让,都得不到足够的资源;饥饿:一个进程一直得不到资源(其他进程可能轮流占用 资源)

Page 34: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

共享变量的修改冲突

例:民航售票系统, n 个售票处 /*Process Pi ,i=1,2,...,n*/ ….. /* 按订票要求找到共享数据 x[k]*/ /*x[k] 存放某月某日某次航班的现有票数 */ R=x[k]; /* 现有票数 */ if(R>=1){

R--; x[k]=R; 输出一张机票;

} else 显示“票已售完”;

Page 35: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

entry section

exit section

critical section

remainder section

临界区

临界区的访问过程临界区的访问过程

临界区:临界区:访问临界资源的程序段。

同类临界区:同类临界区:对同一临界资源进行操作的程序段。

Page 36: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

•临界区 (critical section) :进程中访问临界资源的一段代码。

•进入区 (entry section) :在进入临界区之前,检查可否进入临界区的一段代码。

•退出区 (exit section) •剩余区 (remainder section) :代码中的其余部分。

Page 37: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

• 空闲则入:其他进程均不处于临界区;• 忙则等待:已有进程处于其临界区;• 有限等待:等待进入临界区的进程不能 " 死等 " ;• 让权等待:不能进入临界区的进程,应释放 CPU

(如转换到阻塞状态)

互斥应遵循的准则互斥应遵循的准则

Page 38: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

• 有两个进程Pi, Pj,其中的Pi

whi l e (turn != i );

cri t i cal secti on

turn = j ;

remai nder secti on

• 设立一个公用整型变量 turn :描述允许进入临界区的进程标识

进程互斥的软件方法进程互斥的软件方法 算法算法 11 :单标志:单标志

互斥算法互斥算法

Page 39: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

•缺点:强制轮流进入临界区,没有考虑进程的实际需要。容易造成资源利用不充分:在 Pi 出让临界区之后, Pj使用临界区之前, Pi 不可能再次使用临界区;

Page 40: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

• 设立一个标志数组 flag[]:描述进程是否要求进入临界区或已在临界区,初值均为 FALSE

• turn=j;描述可进入的进程(同时修改标志时)• 在进入区先修改、后检查、后修改者等待

算法算法 22 :双标志:双标志

int flag[2]={0,0}; int turn=0; /* 进程 pi 的结构 */ while(1){ flag[i]=1; while(flag[j]){ if(turn==j){

flag[i]=0; while(turn==j); flag[i]=1; }

/* 进入临界区 */ critical section /* 退出临界区 ]*/ turn=j; flag[i]=0; remainder section

}

Page 41: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

• 每一类临界资源设置一把锁 lock 。• lock 表示资源的两种状态: TRUE 表示正被占用(锁关状态); FALSE 表示空闲(锁开状态)

进程互斥的锁操作方法进程互斥的锁操作方法

加锁操作

开锁操作

执行临界区程序

Page 42: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

• 不能实现所有的同类临界区互斥;• 临界区太长时,降低了中断响应速度;• 扩大了互斥范围;• 加锁时 CPU 不断测试,处于忙等待。

优点:优点:简单、可靠简单、可靠

锁操作方法锁操作方法 用开、关中断实现锁操作用开、关中断实现锁操作

关中断

开中断

执行临界区程序

缺点:缺点:

Page 43: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

信号量表示临界资源的实体,是一个数据结构,其值仅能由 P、 V操作来改变。

信号量信号量 (semaphore)(semaphore)

阻塞等待信号量数据结构:typedef struct{ int value; /* 信号量的值 */ PCB *ptr_of_semque; } semaphore ;

PCB: 进程控制块的数据类型 ptr_of_semque :指向等待使用该信号量的进程队列的队首

Page 44: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

• Value: 指定一个非负整数值,表示空闲资源总数--若为非负值表示当前的空闲资源数,若为负值其绝对值表示当前等待临界区的进程数

• ptr_of_semque :初值为空

信号量初始化:

PP原语原语 wait(s)wait(s) extern PCB *curproc; void p(s)semaphore *s;{ s->value--; if(s->value<0){ Insert(curproc,s-> ptr_of_semque); Block(curproc); }}

Page 45: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

V 原语通常唤醒进程等待队列中的头一个进程 VV 原语原语 signal(s)signal(s)

void V(s)semaphore *s;{ PCB *pcb_ptr; s->value++; if(s->value<=0){ pcb_ptr=Remove(s-> prt_of_semque); Wakeup(pcb_ptr); /* 进程状态置为活动就绪 */ }}

Page 46: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

• 为临界资源设置一个互斥信号量 mutex(MUTual Exclusion) ,其初值为 1;在每个进程中将临界区代码置于 P(mutex) 和 V(mutex)原语之间

• 必须成对使用 P和 V 原语, P、 V 原语不能次序错误、重复或遗漏

V(mutex);

cri t i cal secti on

remai nder secti on

P(mutex);

利用信号量实现互斥利用信号量实现互斥

Page 47: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

信号量实现互斥模型:信号量实现互斥模型: semaphore mutex={1,NULL}; cobegin program pi { while(1){ P(&mutex) ; critical section for pi; /* 进程 pi 临界区 */ V(&mutex) ; remainder section for pi; } } coend

Page 48: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

解决共享变量的修改冲突

例:民航售票系统, n 个售票处 semaphore mutex={1,NULL}; cobegin program pi { ……… P(&mutex) ; R=x[k]; /* 现有票数 */ if(R>=1){

R--; x[k]=R; V(&mutex) ; 输出一张机票;

}

else{ V(&mutex) ; 显示“票已售完”; }}coend

Page 49: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

设置一个同步信号量 proceed1 ,其初值为 0 利用信号量实现同步利用信号量实现同步

semaphore proceed1={0,NULL}; cobegin 进程 p1 ……… P(& proceed1) ; ……… 进程 p2 ……… V(& proceed1) ; ………. coend

Page 50: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

例:一辆公共汽车上,司机和售票员进程的同步 semaphore drive_sem={0,NULL}; semaphore conductor_sem={0,NULL}; cobegin program drive { while(1){

driving; /*正常行车 */ stopping; V(&conductor_sem) ; /* 唤醒开门 */ P(&drive_sem) ; /* 等待关门 */ start a car;

} }

Page 51: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

program conductor { while(1){

sell tickets; /* 售票 */ P(&conductor_sem) ; /* 等待停车 */ open the door; close the door; V(&drive_sem) ; /*唤醒司机开车 */ }

}coend

Page 52: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

1. 生产者-消费者问题 (the producer-consumer problem)

问题描述:若干进程通过有限的共享缓冲区交换数据。其中, "生产者 "进程不断写入,而 "消费者 "进程不断读出;共享缓冲区共有 N个;任何时刻只能有一个进程可对共享缓冲区进行操作。

共享缓冲区

生产指针 消费指针Producer 1

Producer 2

...

Producer M

Consumer 1

Consumer 2

...

Consumer N

满 空 指针移动方向

经典应用示例经典应用示例

Page 53: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

•采用信号量机制:– full 是 "满 "数目,初值为 0, empty是 " 空 "数目,初值为 N。 full+empty=N

– mutex用于访问缓冲区时的互斥,初值是 1 • 每个进程中各个 P操作的次序是重要的:先检查资源数目,再检查是否互斥――否则可能死锁(为什么? )

Page 54: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

# defineN 100 # define MAXLEN 80 typedef struct{ int num; char array[MAXLEN]; }Message ; semaphore mutex={1,NULL}; semaphore empty={N,NULL}; semaphore full={0,NULL}; Message buffers[N]; int p_index=0,c_index=0; cobegin program produceri { Message p_puf; while(1){

produce a message in p_buf;

算法:

Page 55: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

P(&empty) ; P(&mutex) ; memcpy((char *)&buffers[p_index], (char *) &p_buf,sizeof(Message)); p_index=(p_index+1)%N; V(&mutex) ; V(&full) ; }}program consumerj { Message c_buf; while(1){

P(&full) ; P(&mutex) ; memcpy((char *) &c_buf,

(char *) &buffers[c_index],sizeof(Message)); c_index=(c_index+1)%N; V(&mutex) ; V(&empty) ; consume the message in c_buf; } }

coend

Page 56: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

2. 读者-写者问题 (the readers-writers problem)

•问题描述:对共享资源的读写操作,任一时刻“写者”最多只允许一个,而“读者”则允许多个–“读-写”互斥,–“写-写”互斥,– "读-读 " 允许

•采用信号量机制:– rwmutex表示 " 允许写 ",初值是 1。– 公共变量 Readcount 表示“正在读”的进程数,初值是 0;– rmutex表示读者对 Readcount 的互斥操作,初值是 1。

Page 57: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

semaphore rwmutex={1,NULL}, rmutex ={1,NULL}; int readcount=0; cobegin program readeri {

P(&rmutex) ; readcount++; if(readcount==1) P(&rwmutex) ; V(&rmutex) ; read data; P(&rmutex) ; readcount--; if(readcount==0) V(&rwmutex) ; V(&rmutex) ;}

算法:

Page 58: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

program writerj {

P(&rwmutex) ; write or update data; V(&rwmutex) ;}

coend

写者长期阻塞

Page 59: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

写者优先算法:

cobegin program readeri {

P(&rwmutex) ; P(&rsem) ; V(&rwmutex) ; read data; V(&rsem) ;}

program writerj { int i; P(&rwmutex) ; for(i=1;i<=10;i++) P(&rsem) ; write or update data;

for(i=1;i<=10;i++)V(&rsem) ;

V(&rmutex) ;}

coend

semaphore rwmutex={1,NULL}, rsem={10,NULL};

Page 60: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

• 低级通信:只能传递状态和整数值(控制信息),包括进程互斥和同步所采用的信号量和管程机制。优点是速度快。缺点是:– 传送信息量小、效率低– 编程复杂

• 高级通信:能够传送任意数量的数据,包括三类:消息缓冲、管道、共享存储区。

2.5 2.5 进程间通信进程间通信进程间通信的类型进程间通信的类型

Page 61: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

直接通信和间接通信

• 直接通信:信息直接传递给接收方,如管道。– 在发送时,指定接收方的地址或标识,也可以指

定多个接收方或广播式地址;– 在接收时,允许接收来自任意发送方的消息,并

在读出消息的同时获取发送方的地址。• 间接通信:借助于收发双方进程之外的共享

数据结构作为通信中转,如消息队列。

Page 62: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

管道:用于连接一个读进程和一个写进程,以实现它们之间通信的共享文件( pipe文件) 常用于命令行所指定的输入输出重定向和管道命令。 在使用管道前要建立相应的管道,然后才可使用。

管道管道 (pipe)(pipe) 通讯通讯

无名管道:用于父子进程或子进程间通信有名管道:用于父进程间通信(又称 FIFO通信)

例: MS DOS命令 DIR|MORE

进程间数据交换以消息为单位应用系统使用系统提供的一组通信原语来实现通信消息的发送不需要接收方准备好,随时可发送。

消息消息 (message)(message) 缓冲通讯缓冲通讯

Page 63: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

• 诸进程通过共享存储区中的数据的读或写来实现通信

• 应用程序实现对共享存储区访问的互斥与同步

• 是进程间通信最有效的机制

相当于内存,可以任意读写和使用任意数据结构,需要进程互斥和同步的辅助来确保数据一致性

共享存储区共享存储区 (shared memory)(shared memory)

Page 64: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

2.6 2.6 死锁死锁 (DEADLOC(DEADLOCK)K)死锁:当一个进程提出使用某资源的请求后,使系

统中的一些进程处于无休止的阻塞状态,若无外界干预,它们将永远不能退出阻塞状态。死锁发生原因:系统资源不足;

并发执行的顺序不当产生死锁的必要条件:产生死锁的必要条件:只有 4 个条件都满足时,才会出现死锁。

– 互斥控制:任一时刻只允许一个进程使用资源– 逐次请求:进程动态请求其余资源时,不主动释放已经

占用的资源– 非剥夺控制:进程已经占用的资源,不会被强制剥夺– 循环等待:进程间相互申请其它进程占有的临界资源,

资源分配有向图中产生环路。

Page 65: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

• 预防死锁的两种策略:– 资源静态分配法:(针对死锁的逐次请求条件)预先分配

作业所需全部资源,保证不等待资源;• 降低了对资源的利用率,产生严重资源浪费;• 有可能无法预先知道所需资源;

– 资源顺序分配法:(针对死锁的循环等待条件)对全部资源进行全局编号,进程必须按递增的顺序请求资源;

• 限制进程对资源的请求;• 资源的排序占用系统开销;

预防是采用某种策略,限制并发进程对资源的请求,破坏死锁产生的必要条件。

死锁的预防:死锁的预防:

Page 66: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

在分配资源时判断是否会出现死锁,如不会死锁,则分配资源。死锁的避免:死锁的避免:

• 与资源静态分配法比,可提高资源利用率;• 增加系统开销• 要求事先说明最大资源要求,在现实中很困难;

银行家算法银行家算法

银行家算法的特点银行家算法的特点

• 在分配资源前,系统执行一个检查序列,以判断该资源分配是否可能导致一个死锁;

• 若不可能,则分配该资源;• 否则,拒绝分配。

多项资源银行家算法多项资源银行家算法系统中有多种同类资源

Page 67: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

• 有向图 G 的顶点为资源(某类资源)或进程(大园),从资源 R 到进程 P 的边表示 R 已分配给 P ,从进程 P 到资源 R的边表示 P正因请求 R而处于等待状态。有向图的循环表示死锁的存在。

• 资源分配图的化简--常用的检测死锁的方法:– 进程 pj 能分配到所需的全部资源,则 pj 是可化简进程。– 从图中消去所有 pj 的边。

• 可完全化简:图中所有进程都是可化简进程• 不可完全化简:图中存在不可化简进程。

利用某种算法对这些信息加以检查,以判断是否存在死锁。死锁检测算法主要是检查是否有循环等待。

死锁的检测:死锁的检测:

资源分配图资源分配图 (resource allocation graph)(resource allocation graph)

Page 68: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

• 删除进程:通过撤消代价最小的处于死锁的进程,以回收其资源,解除死锁。

• 剥夺资源:挂起某些死锁进程,并剥夺它的资源,以解除死锁。

删除(撤消)进程的原则:•进程优先级;•系统的运行代价;

死锁定理死锁定理

死锁的解除:死锁的解除:

当且仅当系统某状态 s 所对应的资源分配图是不可完全化简的,则称状态 s 是死锁状态,而不可化简的那些进程即是被死锁的进程。反之,若状态 s 所对应的资源分配图是可完全化简的,则状态 s 是安全的。

Page 69: 2.1    进程的基本概念 2.2    进程管理 2.3    进程调度 2.4    进程间的同步与互斥 2.5    进程通讯 2.6    死锁

本章的重要概念及相关要求本章的重要概念及相关要求• 进程概念:理解进程的引入及进程的基本特征;进程概念:理解进程的引入及进程的基本特征;• 进程的同步与互斥:了解进程表示进程的同步与互斥:了解进程表示 PCBPCB 、进程的状态;理、进程的状态;理解并掌握进程调度的基本算法、并发进程间的互相制约关解并掌握进程调度的基本算法、并发进程间的互相制约关系、临界区的概念;理解并掌握利用锁操作法实现互斥,系、临界区的概念;理解并掌握利用锁操作法实现互斥,利用信号量及利用信号量及 PP 、、 VV操作实现同步与互斥的方法。操作实现同步与互斥的方法。

经典示例:生产者与消费者问题、读者与写者问题等经典示例:生产者与消费者问题、读者与写者问题等• 进程通信:了解进程通信的不同方式(信号、管道、消息进程通信:了解进程通信的不同方式(信号、管道、消息缓冲等);缓冲等);

• 死锁:掌握产生死锁的必要条件;对付死锁的策略:死锁死锁:掌握产生死锁的必要条件;对付死锁的策略:死锁的预防、死锁的避免(银行家算法);死锁的检测与解除的预防、死锁的避免(银行家算法);死锁的检测与解除(进程资源图及其化简)。(进程资源图及其化简)。