10.信号量与PV操作

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

3.3.2 记录型信号量与PV操作
信号量:一种软资源 原语:内核中执行时不可被中断的过程 P操作原语和V操作原语
3.3.2 记录型信号量与PV操作
• 信号量和P、V操作 ,将交通管制中多 种颜色的信号灯管理交通的方法引入 操作系统,让两个或多个进程通过特 殊变量展开交互。 • 一个进程在某一特殊点上被迫停止执 行直到接收到一个对应的特殊变量值, 这种特殊变量就是信号量(Semaphore), 复杂的进程合作需求都可以通过适当 的信号结构得到满足。
3.3.2 记录型信号量与PV操作
• 操作系统中,信号量表示物理资源的实 体,它是一个与队列有关的整型变量。 • 实现时,信号量是一种记录型数据结构, 有两个分量:一个是信号量的值,另一 个是信号量队列的队列指针。3.2 记录型信号量与PV操作
信号量分类
信号量按其用途分为 •公用信号量: 初值常为1,实现互斥 •私有信号量: 初值常为0或正整数,实现同步 信号量按其取值分为 •二元信号量: 取值为0或1,实现互斥 •一般信号量: 允许取值为非负整数,实现同步
9 0
记 录 型 信 号 量 和 PV 操 作 解 决 机 票 问 题
var A : ARRAY[1..m] OF integer; s : ARRAY[1..m] OF semaphore; s[j] := 1; 0 1 2 3 4 5 6 7 8 cobegin 100 85 70 68 99 220 43 21 6 process Pi var Xi:integer; begin L1: 按旅客定票要求找到A[j]; P(s[j]) Xi := A[j]; if Xi>=1 then begin Xi:=Xi-1; A[j]:=Xi; V(s[j]); 输出一张票; end; else begin V(s[j]);输出票已售完;end; goto L1; end; coend;
生产者-消费者问题算法描述
• 生产者和消费者进程对counter的交 替执行会使其结果不唯一。 • 生产者和消费者进程的交替执行会 导致进程永远等待。
返回
3.3.2 记录型信号量与PV操作
前节种种方法解决临界区调度问题的缺点 1)对不能进入临界区的进程,采用忙式等 待测试法,浪费CPU时间。 2)将测试能否进入临界区的责任推给各个 竞争的进程会削弱系统的可靠性,加重了 用户编程负担。 • 1965年E.W.Dijkstra提出了新的同步工具-信号量和P、V操作。
0
1
… k-1
生产者-消费者问题算法描述
var k:integer; type item:any; buffer:array[0..k-1] of item; in,out:integer:=0; counter:integer:=0; process producer begin while (TRUE) produce an item in nextp; if (counter==k) sleep( ); buffer[in]:=nextp; in:=(in+1) mod k; counter:=counter+1; if (counter==1) wakeup( consumer); end process consumer begin while (TRUE) if (counter==0) sleep ( ); nextc:=buffer[out]; out:=(out+1) mod k; counter:=counter-1; if (counter==k-1) wakeup( producer); consume the item in nextc; end count当前值为8,生产者生产了 一件产品,拟做加1操作。消费 者消费一件产品,拟做减1操作。
3.3.6 记录型信号量解决理发师问题
3.3 信号量与PV操作
3.3.1 同步与同步机制
3.3.2 记录型信号量与PV操作
3.3.3 用记录型信号量实现互斥 3.3.4 记录型信号量解决生产者-消费者问题 3.3.5 记录型信号量解决读者-写者问题
3.3.6 记录型信号量解决理发师问题
3.3 信号量与PV操作
3.3.2 记录型信号量与PV操作 2.记录型信号量
type semaphore = record value:integer; queue: list of process; end procedure P(var s:semaphore); begin s := s – 1; if s < 0 then W(s); end; procedure V(var s:semaphore); begin s := s + 1; if s <= 0 then R(s); end;
3.3.2 记录型信号量与PV操作 2.记录型信号量
•推论3:通常,P操作意味着请求一个资源, V操作意味着释放一个资源。在一定条件下, P操作代表挂起进程操作,而V操作代表唤 醒被挂起进程的操作
3.3.2 记录型信号量与PV操作 3.二元信号量
设s为一个记录型数据结构,一个分量为 value,它仅能取值0和1,另一个分量为信号 量队列queue, 把二元信号量上的P、V操作 记为BP和BV,BP和BV操作原语的定义如下:
3.3.2 记录型信号量与PV操作 2.记录型信号量
•推论1:若信号量s为正值,则该值等于在 封锁进程之前对信号量s可施行的P操作数、 亦等于s所代表的实际还可以使用的物理资 源数 •推论2:若信号量s为负值,则其绝对值等 于登记排列在该信号量s队列之中等待的进 程个数、亦即恰好等于对信号量s实施P操 作而被封锁起来并进入信号量s队列的进程 数
3.3.2 记录型信号量与PV操作
3.3.3 用记录型信号量实现互斥 3.3.4 记录型信号量解决生产者-消费者问题 3.3.5 记录型信号量解决读者-写者问题
3.3.6 记录型信号量解决理发师问题
3.3 信号量与PV操作
3.3.1 同步与同步机制
3.3.2 记录型信号量与PV操作
3.3.3 用记录型信号量实现互斥 3.3.4 记录型信号量解决生产者-消费者问题 3.3.5 记录型信号量解决读者-写者问题
3.3.1 同步和同步机制
生产者--消费者问题表述
• 有n个生产者和m个消费者,连接在一个有k个单 位缓冲区的有界缓冲上。其中,pi和cj都是并发 进程,只要缓冲区未满,生产者pi生产的产品就 可投入缓冲区;只要缓冲区不空,消费者进程cj 就可从缓冲区取走并消耗产品。
0 1 2 … n-1 0 1 2 … m-1
3.3.2 记录型信号量与PV操作 3.二元信号量
type binary semaphore=record value(0,1); queue: list of process end; procedure BP(var s:semaphore); procedure BV(var s:semaphore); begin begin if s.value=1; if s.queue is empty; then s.value=0; then s.value=1; else begin else begin W(s.queue); R(s.queue); end; end; end end 返回
3.3 信号量与PV操作
3.3.1 同步与同步机制
3.3.2 记录型信号量与PV操作
3.3.3 用记录型信号量实现互斥 3.3.4 记录型信号量解决生产者-消费者问题 3.3.5 记录型信号量解决读者-写者问题
3.3.6 记录型信号量解决理发师问题
3.3 信号量与PV操作
3.3.1 同步与同步机制
3.3.2 记录型信号量与PV操作 1.整型信号量
设s为一个整形量,除初始化外,仅能通 过P、V操作访问,P和V操作原语定义:
P(s):while s≤0 do null operation s:=s-1; V(s):s:=s+1;
3.3.2 记录型信号量与PV操作 2.记录型信号量
设s为一个记录型数据结构,一个分量为 整形量value,另一个为信号量队列queue, P和V操作原语定义: • P(s);将信号量s减去l,若结果小于0, 则调用P(s)的进程被置成等待信号量s的 状态。 • V(s):将信号量s加1,若结果不大于0, 则释放一个等待信号量s的进程。
有若干种办法可避免这类死锁
上述解法可能出现永远等待,有若 干种办法可避免死锁: •至多允许四个哲学家同时吃; •奇数号先取左手边的叉子,偶数号先 取右手边的叉子; •每个哲学家取到手边的两把叉子才吃, 否则一把叉子也不取。
哲 学 家 吃 通 心 面 问 题 的 一 种 正 确 解
var forki :array[0..4] of semaphore; forki := 1; cobegin process Pi //* i=0,1,2,3 */ begin L1: 思考; P(fork[i]); P(fork[i+1] mod5) 吃通心面; V(fork[i]); V(fork([i+ 1] mod 5); goto L1; end; coend;
3.3.3 用记录型信号量实现互斥 3.3.4 记录型信号量解决生产者-消费者问题 3.3.5 记录型信号量解决读者-写者问题
3.3.6 记录型信号量解决理发师问题
3.3 本章作业
2.3; 2.4; 2.5; 2.7; 2.18;2.26;2.49
3.3.1 同步和同步机制
• 著名的生产者--消费者问题是计算机操作系统中 并发进程内在关系的一种抽象,是典型的进程同 步问题。 • 在操作系统中,生产者进程可以是计算进程、发 送进程;而消费者进程可以是打印进程、接收进 程等等。 • 解决好生产者--消费者问题就解决好了一类并发 进程的同步问题。
9 0
哲学家吃通心面问题
有五个哲学家围坐在一圆桌旁,桌中央有一盘 通心面,每人面前有一只空盘于,每两人之间 放一把叉子。每个哲学家思考、饥饿、然后吃 通心面。为了吃面,每个哲学家必须获得两把 叉子,且每人只能直接从自己左边或右边去取 叉子 。
哲学家吃通心面问题
哲学家吃通心面问题
var forki :array[0..4] of semaphore; forki := 1; cobegin process Pi // i=0,1,2,3,4, begin L1: 思考; P(fork[i]); P(fork[(i+1)mod 5]); 吃通心面; V(fork[i]); V(fork[(i+1)mod 5]); goto L1; end; coend;
3.3.3 记录型信号量实现互斥
s : semaphore; s := 1; cobegin …… process Pi begin …… P(s); 临界区; V(s); …… end; …… coend;
记 录 型 信 号 量 和 PV 操 作 解 决 机 票 问 题
var A : ARRAY[1..m] OF integer; mutex : semaphore; mutex:= 1; 0 1 2 3 4 5 6 7 8 cobegin 100 85 70 68 99 220 43 21 6 process Pi var Xi:integer; begin L1: 按旅客定票要求找到A[j]; P(mutex) Xi := A[j]; if Xi>=1 then begin Xi:=Xi-1; A[j]:=Xi; V(mutex);输出一张票; end; else begin V(mutex); 输出票已售完;end; goto L1; end; coend;
3.3.1 同步与同步机制
3.3.2 记录型信号量与PV操作
3.3.3 用记录型信号量实现互斥 3.3.4 记录型信号量解决生产者-消费者问题 3.3.5 记录型信号量解决读者-写者问题
3.3.6 记录型信号量解决理发师问题
3.3 信号量与PV操作
3.3.1 同步与同步机制
3.3.2 记录型信号量与PV操作
相关文档
最新文档