进程管理四经典进程同步问题
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
11
同步/互斥信号量的使用方法
• 互斥信号量
– 必定成对出现:进入临界区——临界区——退出 临界区
• 同步信号量
– 未必成对出现,依赖于同步关系的性质
• 同步信号量和互斥信号量的操作顺序
– 基本原则:互斥信号量永远紧邻临界区:同步在前, 互斥在后。
12
2.4.2 信号量集
信号量集用于同时需要多个资源时的信号量操作;
end parend end
9
4 用信号量实现进程的同步--生产者-消费者问题总结
思考1:mutex和empty两个信号量之间有什么区别吗?
思考2:多信号量的操作顺序有要求吗?
互斥信号量 mutex:防止多个进程同时进入临界区 同步信号量 empty和full:保证事件发生的顺序 缓冲区满时,Producer停止运行 缓冲区空时,Consumer停止运行 概念差别——互斥与同步(并发的两个要素) 互斥:保护临界区,防止多个进程同时进入 同步:保证进程运行的顺序合理
7
在生产者进程中使用一局部变量nextp,用 于暂时存放每次刚生产出来的产品;而
在消费者进程中,则使用一个局部变量
nextc,用于存放每次要消费的产品。
8
Var mutex,empty,full: semaphore:=1,n,0; buffer:array[0,…,n-1] of item; in,out: integer:=0,0; begin parbegin proceducer: begin repeat producer an item nextp; wait(empty); wait(mutex); buffer(in):=nextp; in:=(in+1) mod n; signal(mutex); signal(full); until false; end
4 用信号量实现进程的同步--生产者-消费者问题
5
4 用信号量实现进程的同步--生产者-消费者问题
6
• 我们可利用一个数组来表示上述的具有n个(0, 1,…,n-1)缓冲区的缓冲池。用输入指针in来 指示下一个可投放产品的缓冲区,每当生产者 进程生产并投放一个产品后,输入指针加1; 用一个输出指针out来指示下一个可从中获取 产品的缓冲区,每当消费者进程取走一个产品 后,输出指针加1。由于这里的缓冲池是组织 成循环缓冲的,故应把输入指针加1表示成 in:= (in+1)mod n; 输出指针加1表示成out:= (out+1) mod n。
10
思考
• 生产者进程中,两个wait操作的顺序能否互 换? 如果某种原因使得生产者进程执行了多次,而消费者 进程一次也没执行,从而全部缓冲区都存满新数据时, • 生产者进程先执行 wait(mutex),再执行 再执行一次生产者进程就会死锁。 wait(empty), 何时会出错? 如果某种原因使得消费者进程执行了多次,而生产者 • 消费者进程中,先 wait(mutex),再wait(full) 进程一次也没执行,从而全部缓冲区都为空时,再执 何时会出错? 行一次消费者进程就会死锁。
• 当S>=1时,允许多个进程进入临界区; • 当S=0时,禁止任何进程进入临界区;
• 一般"信号量集"未必成对使用Swait和Ssignal: 如:一起申请,但不一起释放;
21
2. 读者-写者问题(the readers-writers problem)
• 问题描述
– 写者向数据区放 数据,读者从数 据区获取数据 – 多个读者可同时 读取数据 – 多个写者不能同 时写数据 – 读者和写者的控 制策略变化多端
13
Swait(S1, S2, …, Sn) {
//同时的P原语;
if (S1 >=1 && S2 >= 1 && … && Sn >= 1) { //满足资源要求时的处理; for (i = 1; i <= n; ++i) --Si; //注:与wait的处理不同,这里是在确信可满足 //资源要求时,才进行减1操作; } else { //某些资源不够时的处理; 调用进程进入第一个小于1信号量的等待队列Sj.queue; 阻塞调用进程; 将调用进程的PC置为swait操作开头 } }
Swait(S1, S2, …, Sn) //P原语; { while (TRUE) { if (S1 >=1 && S2 >= 1 && … && Sn >= 1) { //满足资源要求时的处理; for (i = 1; i <= n; ++i) --Si; //注:与wait的处理不同,这里是在确信可满足 //资源要求时,才进行减1操作; break; } else { //某些资源不够时的处理; 调用进程进入第一个小于1信号量的等待队列Sj.L; 阻塞调用进程; 将调用进程的PC置为swait操作开头 } } }
3
4 用信号量实现进程的同步--生产者-消费者问题
• 互斥关系分析
– 任何时刻,只能有一个进程在缓冲区中操作 – 引入互斥信号量(mutex) – 信号量初值为1. 如果变为0,表明已有进程进入临界区;
• 同步关系分析
– 对于“生产者”而言,缓冲区满则应等待 – 引入同步信号量“empty”,初值为n。为0表示缓冲区全 满 – 对于“消费者”而言,缓冲区空则应等待 – 引入同步信号量“full”,初值为0表示缓冲区全空 4
16
producer: begin repeat produce an item in nextp; Swait(empty,mutex); buffer(in):=nextp; in:=(in+1)mod n; Ssignal(mutex,full); until false; end
consumer: begin repeat Swait(full,mutex); Nextc:=buffer(out); Out:=(out+1) mod n; Ssignal(mutex,empty); consumer the item in nextc; until false; end
consumer: begin repeat wait(full); wait(mutex); nextc:=buffer(out); out:=(out+1) mod n;
signal(mutex);
signal(empty); consumer the item in nextc;
until false;
怎样判断有没有读者在读?
增加一个公共变量Readcount,表示当前有 几个读者进程在读。
新来一个读者进程,Readcount加1; 撤销一个读者进程,Readcount减1; 第一个读者:阻塞所有写者进程;允许其他读者进程执行。 最后一个读者:唤醒可能的写者进程。 Readcount成为临界资源,必须互斥访问: 增加互斥信号量Rmutex
14
Ssignal(S1, S2, …, Sn) { for (i = 1; i <= n; ++i) { ++Si; //释放占用的资源; for (each process P waiting in Si.queue) //检查每种资源的等待队列的所有进程; { 从等待队列Si.queue中取出进程P; 进程P进入就绪队列; } } }
复习
•记录型信号量及其wait、Signal操作意义; •生产者--消费者问题:信号量意义、初值 •生产者进程中,两个wait操作顺序能否颠倒, 为什么? •什么情况下会产生死锁现象? •And型信号量机制及其Swait、Ssignal操作 意义
1
进程通信
经典进程同步问题
• 生产者-消费者问题
– 有界缓冲区问题的建模
• 哲学家进餐问题
– 多进程同步问题的建模
• 读者-写者问题
– 数据库互斥访问问题的建模
ቤተ መጻሕፍቲ ባይዱ
• 理发师睡觉问题
– CS模式进程同步问题的建模
2
4 用信号量实现进程的同步--生产者-消费者问题
• 我们把前面面的例子 扩充,假定缓冲区 buffer 是一个有界缓冲 区,可存放 n 个数据, 同时假定有n个CP进程 不 断 地 产 生 数 据, 并 送 buffer ; 有 m 个 IOP 进程从缓冲区中取数 据打印。 • 在我们生活中有很多 这样的例子。
17
2. 一般“信号量集”
一般信号量集用于同时需要多种资源、每种占用的数目不同、 且可分配的资源还存在一个临界值时的处理;
• 问题:一次需要N个某类临界资源时,就要进行N次 wait操作--低效又可能死锁 • 方法:在AND型信号量集的基础上进行扩充:进程 对信号量Si的测试值为ti(用于信号量的判断,即当 Si>= ti时,表示可用资源数量大于ti,才分配资源, 否则便不予分配),占用值为di(用于信号量的增减, 即 • 分配资源时Si = Si – di 释放资源时Si = Si + di) • Swait(S1, t1, d1; ...; Sn, tn, dn); 18 • Ssignal(S1, d1; ...; Sn, dn);
22
读者-写者问题的信号量解法
• 互斥关系分析
– 读者和写者不能同时进入共享数据区 – 多个写者不能同时进入共享数据区 写--写互斥 – 多个读者可以同时进入共享数据区
读--写互斥
• 同步关系分析
– 读者进入缓冲区,写者必须等待 – 写者进入缓冲区,读者必须等待 – 三种类型:
• 读者优先:一旦有读者进入,则后续读者均可进入 • 合理顺序:读者在先来的写者之后 • 写者优先:只要有写者等待,则后续读者必须等待
需要注意: 原先处于阻塞状态的进程,被唤醒后,从何处开始执行? 与 记录型信号量机制有何不同?
15
生产者-消费者问题 - AND型信号量机制
• 若不愿意考虑wait操作的先后顺序,也可用AND型信号 量来实现。 • 生产者进程中: – 用Swait(empty,mutex)代替wait(empty)和wait(mutex), – 用Ssignal(mutex,full)代替signal(mutex)和signal(full) • 消费者进程中 – 用Swait(full,mutex)代替wait(full)和wait(mutex), – 用Ssignal(mutex,empty)代替signal(mutex)和 signal(empty)
1. AND型信号量集
AND型信号量集用于同时需要多种资源且每种占用一个时的信 号量操作; • 问题:一段处理代码需要同时获取两个或多个临界资源―― 可能死锁:各进程分别获得部分临界资源,然后等待其余的 临界资源,"各不相让" • 解决方法:在一个wait原语中,将一段代码同时需要的多个 临界资源,要么全部分配给它,要么一个都不分配。称为 Swait(Simultaneous Wait)。 • 在Swait时,各个信号量的次序并不重要,虽然会影响进程归 入哪个阻塞队列。由于是对资源全部分配或不分配,所以总 有进程获得全部资源并在推进之后释放资源,因此不会死锁。
19
Ssignal(S1, S2, …, Sn) { for (i = 1; i <= n; ++i) { ++Si; //释放占用的资源; for (each process P waiting in Si.L) //检查每种资源的等待队列的所有进程; { 从等待队列Si.L中取出进程P; 进程P进入就绪队列; } } } }
23
• 当读者进程到来时,三种情况:
– 1)无读者、写者:新读者可以读 读--写互斥 – 2)有写者等待,但有其它读者正在读:新读者也 可以读 – 3)有写者写:新读者等 读--写互斥 读--写互斥 写—写互斥: • 当写者进程到来时,三种情况: 互斥信号量 – 1)无读者、其他写者:新写者可以写 Wmutex – 2)有读者:新写者等待 读--写互斥 – 3)有其它写者:新写者等待 写--写互斥 24
需要注意: 原先处于阻塞状态的进程,被唤醒后,从何处开始执行? 与 记录型信号量机制有何不同?
20
• 一般"信号量集"的几种特定情况:
– Swait(S, d, d)表示每次申请d个资源,当少于d个 时,便不分配; – Swait(S, 1, 1)表示互斥信号量; – Swait(S, 1, 0)作为一个可控开关