第3章进程同步与通信-同步
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
① sem减1 ② 若sem减1后仍大于1或等于零, 则P返回,进程继续; ③ 若 sem 减 1 后小于零,则该进程 阻塞转等待队列中。
5
信号灯的PV操作
void wait(semaphore s) { s.value = s.value - 1; if (s.value < 0) block(s.queue);
信号量(semaphore)
管理相应临界区的公有资源,它代
表可用资源实体。
3
信号量是一个整型变量。 ≥0:可供并发进程使用的资源实体数
<0:正在等待使用临界区的进程数
用于互斥的信号量初值应该大于零
4
8. P,V原语
信号量的初值只能由P,V原语操作。
P:passeren V:verhoog
P操作:申请资源操作
互斥问题举例3
某车站售票厅有20个窗口,任何时刻最多可容 纳20名购票者进入,当售票厅中少于20名购票 者时,则厅外的购票者可立即进入,否则需在 厅外等待。若把一个购票者看作一个进程,请 用P、V操作管理这些并发进程,要求如下: ⑴.在主函数中给出信号量的定义和初值。 ⑵.给出一个购票者进程的算法。 ⑶.给出当购票者最多不超过n (设n>20)个时, 信号量可能的变化范围。
12
思考: n个并发进程,共享m个共享资源:
mutex的取值范围为?
13
互斥问题举例2 [ 例] 假设某飞机定票系统在 t0时刻有 A、 B 、 C、 D四个终端程 序同时都要对机票库中的某航班当前剩余票数 X 进行操作。 如果每个终端程序的当前定票需求为 N,并对共享变量X进行 如下操作:
在机票数据库中取出当前剩余票数X; 判断X>0(有票吗)? 如果有, X≥N(票够吗)? 如果够,则出票(打印票据); X=X-N(修改剩余票数); 将X回写到数据库中;
18
分析
共享临界资源:20个同类的售票窗口 先来者先进入
算法描述
⑴.主函数算法: main() { int mutex=20; cobegin P1(); … Pi();… Pn(); coend }
⑵.购票者i的算法: Pi() { P(mutex); 购票; V(mutex); }
⑶.信号量mutex的取值范围:
P2: while (1){ P(mutex); 临界区 V(mutex); 剩余区; };
互斥进程举例1-两个进程共享一台打印机 设信号量print代表打印机,初值为1. pa() int main(void) { { P(print); int print=1; 使用打印机 V(print); cobegin } pa(); pb(); pb() coend { } P(print); print=1 表示没有进程使用打印机 使用打印机 print=0 表示一个进程在用,没有进程等待 V(print); print=-1 表示一个进程在用,另一个在等待 }
/* 将进程阻塞,并将其投入等待队列s.queue */
}
P操作
V操作:释放资源操作
① sem加1
② 若 sem 加 1 后结果大于 1 ,则 V 停止操作,该进程返回调用处 ,继续执行;
③ 若sem加1后小于或等于零,则 该进程转就绪队列,同时进程 调度选取一个等待队列中的进 程转运行或就绪。
P,V操作必须用原语实现。
16
x代表某航班的可用座位数,p1和p2两个售票进程, 售票工作是对变量x减1。试用信号量的P、V操作 实现这两个进程的互斥。 设:mutex为互斥信号量,
p1( ) { …… p(mutex); …… x:=x-1 ; v(mutex); …… } } p2( ) { …… p(mutex); …… x:=x-1 ; v(mutex); ……
14
针对临界资源机票数设置一个信号量mutex,初值 为1。每个终端进程中的程序描述如下:
P(mutex);
在机票数据库中取出当前剩余票数X;
判断X>0(有票吗)?
如果有, X≥N(票够吗)? 如果够,则出票(打印票据); X=X-N(修改剩余票数); 将X回写到数据库中;
10
信号量可能的取值范围 假设有 N 个并发进程共用一台打印机,设 互斥信号量mutex的初值为1,则:
Βιβλιοθήκη Baidu
信号量mutex代表什么?
mutex的取值范围为多少? mutex的值分别代表什么含义?
11
N个并发进程,互斥信号量mutex的初值为1: mutex的取值范围为:1~-(N-1) 1 :表示没有进程进入临界区。有一个资源,无 进程等待; 0:表示有1个进程进入临界区。无资源,无进程 等待; -i :表示 1 个进程进入 临界区 。无资源,且有 i (i<=N-1)个进程等待进入。
V(mutex);
15
如果有n个终端,则mutex信号量的取值范围为:
-(n-1)≤mutex≤1 其物理含义为: 当机票数空闲时,mutex=1。 当有一个终端进入,对机票进行处理,其它终端进 程还没有到来时,mutex=0。 当所有终端进程都到来,且有一个正在对机票进行 处理时, mutex= -( n - 1 )。它表示有 n - 1 个 进程在等待队列上等待。
7
信号灯的PV操作
void signal(semaphore s) { s.value = s.value + 1; if (s.value <= 0) wackup(s.queue);
/* 唤醒阻塞进程,将其从等待队列s.queue 取出,投入就绪队列*/
}
V操作
用信号灯解决互斥问题
semaphore mutex=1; P1: while (1){ P(mutex); 临界区; V(mutex); 剩余区; };
第3 章
进程同步与通信
●进程同步与互斥
本章要点
●经典进程同步问题
●AND信号量 ●管程
●进程通信
进程同步的基本概念
●同步:指多个进程中发生的事件存在着某种时
序关系,它们必须按规定时序执行,以共同完成 一项任务 。 ●互斥:多个进程不能同时使用同一资源。 ●临界资源:某段时间内仅允许一个进程使用的 资源。 ●临界区:每个进程中访问临界资源的那段代码。