当前位置:
文档之家› 操作系统教程第3章-3 进程的同步与互斥
操作系统教程第3章-3 进程的同步与互斥
第16/51页
记录型信号量
抽象成 S(信号量) (信号量) value≥0 ≥ L=nil
一类资源
记录型信号量
信号量S 记录型数据结构,一个分量为整型量value, value,另 信号量S:记录型数据结构,一个分量为整型量value,另 一个分量为信号量队列 L;
第17/51页
信号量的物理含义
输入 进程PI 进程
第4/51页
缓冲区
计算 进程PC 进程
缓冲区
打印 进程争关系(间接制约关系)的手段。 是解决进程间竞争关系(间接制约关系)的手段。 间接相互制约关系(互斥) 间接相互制约关系(互斥) 是指若干个进程同时竞争一个需要互斥使用 是指若干个进程同时竞争一个需要互斥使用 一个 的资源时,任何时刻最多允许一个进程去使用,其 的资源时,任何时刻最多允许一个进程去使用, 他要使用该资源的进程必须等待, 他要使用该资源的进程必须等待,直到该资源被释 进程间要通过某种中介发生联系, 无意识安 放。进程间要通过某种中介发生联系,是无意识安 排的。 排的。 产生的原因 资源共享 互斥是一种特殊的同步 逐次使用互斥资源, 逐次使用互斥资源,也是对进程使用资源次序 上的一种协调。 上的一种协调。
P、V操作既可以实现互斥,也可以实现同步 、 操作既可以实现互斥 操作既可以实现互斥,
Swap(int lock, int key) { int temp; temp=lock; lock=key; key=temp }
交换指令的应用
int lock=0; 每个进程定义一个局部变量 int key; 进入临界区前执行: 进入临界区前执行: key=1; do swap(lock, key) while key=0; 离开临界区后执行: 离开临界区后执行: lock=0;
第19/51页
P、V操作讨论 、 操作讨论
P(S):表示申请一个资源 : V(S):表示释放一个资源。 :表示释放一个资源。 P、V操作必须成对出现,有一个 操作就一定 操作必须成对出现, 、 操作必须成对出现 有一个P操作就一定 有一个V操作 有一个 操作 P、V操作的优点 、 操作的优点 简单,而且表达能力强,可解决任何互斥问题 简单,而且表达能力强, P、V操作的缺点 、 操作的缺点 不够安全,P、V操作使用不当会出现死锁,遇 不够安全, 、 操作使用不当会出现死锁, 操作使用不当会出现死锁 到复杂互斥问题时,实现复杂。 到复杂互斥问题时,实现复杂。
对于n个并发进程,互斥信号量的取值范围是? 对于 个并发进程,互斥信号量的取值范围是? 个并发进程 (n-(n-1) ~1
第21/51页
利用记录型信号量实现进程互斥
P1
P2
P(mutex) P(mutex) V(mutex) V(mutex) 互斥区
第22/51页
利用P、 操作实现两个进程互斥的模板如下 操作实现两个进程互斥的模板如下: 利用 、V操作实现两个进程互斥的模板如下:
产生的原因
进程合作
第3/51页
进程的同步( ) 进程的同步(2)
一般同步问题有两类
保证一组合作进程按逻辑需要的执行次序执行 P1 【例】司机 REPEAT 启动 正常运行 到站停 UNTIL FALSE 售票员 P2 REPEAT 关门 售票 开门 UNTIL FALSE
保证共享缓冲区(共享数据) 保证共享缓冲区(共享数据)的合作进程的同步 【例】
struct semaphore mutex; mutex.value=1; mutex.L=nil; { cobegin Process P1:{ M P(mutex); 临界区1 临界区 V(mutex); M } Process P2:{ M P(mutex); 临界区2 临界区 V(mutex); M } coend }
第23/51页
使用PV操作实现互斥应注意 使用PV操作实现互斥应注意 PV
识别临界资源
是否被共享; 是否被共享 是否有排它性使用要求。 是否有排它性使用要求。
临界区代码应尽量短小,不能有死循环。 临界区代码应尽量短小,不能有死循环。 P和V原语应分别紧靠临界区的头尾。 原语应分别紧靠临界区的头尾。 和 原语应分别紧靠临界区的头尾 P、V操作在同一进程中必须成对出现。 操作在同一进程中必须成对出现。 、 操作在同一进程中必须成对出现
remainder section; /*剩余区 剩余区*/ 剩余区
……
第9/51页
访问临界区应遵循的原则
空闲让进 当无进程在临界区时, 当无进程在临界区时,任何有权使用临界区 的进程可进入。 的进程可进入。 忙则等待 不允许两个以上的进程同时进入临界区。 不允许两个以上的进程同时进入临界区。 有限等待 任何进入临界区的要求应在有限的时间内得 到满足。 到满足。 让权等待 不能进入临界区的进程应放弃占用CPU CPU。 不能进入临界区的进程应放弃占用CPU。
第20/51页
用P、V操作实现互斥 、 操作实现互斥
信号量初值为1 信号量初值为 对于两个并发进程,互斥信号量的值仅取1、 和 对于两个并发进程,互斥信号量的值仅取 、0和1三个值 : 三个值
若mutex.value=1表示没有进程进入临界区 = 表示没有进程进入临界区 若mutex.value=0表示有一个进程进入临界区 = 表示有一个进程进入临界区 表示一个进程进入临界区, 若mutex.value =-1表示一个进程进入临界区,另一个 表示一个进程进入临界区 进程等待进入。 进程等待进入。
第5/51页
临界资源 临界资源
系统中某些资源一次只允许一个进程 系统中某些资源一次只允许一个进程 使用, 使用,称这样的资源为临界资源或互斥 资源或共享变量。 资源或共享变量。
硬件临界资源:打印机、磁带机 硬件临界资源:打印机、 软件临界资源:只能排它使用的变量、表格、 软件临界资源:只能排它使用的变量、表格、 队列
第13/51页
硬件解法(3) 硬件解法( )
进入临界区前执行: 进入临界区前执行: 执行“关中断” 执行“关中断”指令 离开临界区后执行: 离开临界区后执行: 执行“开中断” 执行“开中断”指令
第14/51页
信号量机制
一类资源
抽象成
S(信号量) (信号量)
信号量 只能由P 操作对其进行操作的变量。 只能由P、V操作对其进行操作的变量。 信号量的使用应注意 必须置一次且只能置一次初值 初值只能为非负整数 只能执行P 只能执行P、V操作
S .value >0: 表示有 .value个资源可用 表示有S S .value =0: 表示无资源可用 S .value <0: 则| S .value|表示等待队列中的进程 表示等待队列中的进程 个数
信号量的值( 信号量的值(-2) 信号量队列指针
信号量的初值应该大于等于0 信号量的初值应该大于等于
在进程中访问临界资源的那段代码区。 在进程中访问临界资源的那段代码区。 例子
第8/51页
具有临界资源的进程结构
…… entry section critical section; exit section /*进入区 进入区*/ 进入区 /*临界区 临界区*/ 临界区 /*退出区 退出区*/ 退出区
第15/51页
整型信号量
一类资源
抽象成
S(信号量) (信号量)
整型量
整型信号量 信号量S:整型量,除初始化外仅能通过P 信号量 :整型量,除初始化外仅能通过P、V 操作访问 操作原语定义: P和V操作原语定义: S=1 int S; S=1; P(S): while S ≤0 do no-op : S = S -1; ; V(S ):S = S +1; : ;
第6/51页
临界资源实例
二人合作存款
count=100; PA S1:N=count; S2:N=N+100; S3:count=N; 执行情况: 执行情况:
(1) PA—> PB ,PB—> PA ) (2) S1 ) S1—> PB—>S2—>S3 (3) S4 ) S4—> PA—>S5—>S6
测试与设置指令的使用 int lock=0; M /*进入临界区前执行 进入临界区前执行*/ 进入临界区前执行 while TS(lock) do skip; 临界区 /*离开临界区后执行 离开临界区后执行*/ 离开临界区后执行 lock:=0; M
第12/51页
硬件解法(2) 硬件解法( )
交换指令
第7/51页
PB S4:M=count; S5:M=M+200; S6:count=M;
count=400 √ count=200 × count=300 ×
是一个互斥性使用的变量, 因count是一个互斥性使用的变量,是一个临界资源 是一个互斥性使用的变量
临界区
临界区(临界段) 临界区(临界段)
第3章 进程管理
3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 进程的引入 进程的结构 进程控制 进程的同步与互斥 进程间通信 进程调度 死锁 线程
第1/51页
两种制约关系
直接相互制约关系(同步) 直接相互制约关系(同步) 间接相互制约关系(互斥) 间接相互制约关系(互斥) 产生的原因
第18/51页
记录型信号量描述
struct semaphore { int value; int *L; } void P(struct semaphore S); { S.value = S.value – 1; /* 把信号量减去 */ 把信号量减去1 if S.value < 0 then block(S.L); /* 若信号量小于 ,则调用 若信号量小于0,则调用P(S)的进 程被置成等待信号量 的状态 */ 的进 程被置成等待信号量S的状态 } 物理意义:申请一个资源,如果申请成功,则返回;如果申请不成功, 物理意义 : 申请一个资源 , 如果申请成功 , 则返回 ; 如果申请不成功 , 则挂在 该资源的等待队列上。 该资源的等待队列上。 void V(struct semaphore S); { S.value = S.value + 1; /* 把信号量加 */ 把信号量加1 if S.value <= 0 then wakeup(S.L); /* 若信号量小于等于 ,则释放一个等待信号量 的进程 */ 若信号量小于等于0,则释放一个等待信号量s的进程 } 物理意义:归还一个资源,如果没有进程等待该资源,则返回; 物理意义 : 归还一个资源 , 如果没有进程等待该资源 , 则返回 ; 如果有进程在 等待,把等待的进程从L上移到就绪队列 上移到就绪队列。 等待,把等待的进程从 上移到就绪队列。