信号量机制例题集2
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
爸爸,妈妈,儿子,女儿
Var mutex,apple,banana:Semaphore:=1,0,0;son() Main() { while (true) { cobegin { p(banana);从盘子取香蕉; v(mutex); Father();mother();son();daugher(); 吃香蕉;} Coend } } Father() { while (true) {p(mutex); 将苹果放入盘子;v(apple);} daugher() { while (true) } { p(apple);从盘子取苹果; v(mutex); Mother() 吃苹果;} { while (true) } { p(mutex);将香蕉放入盘子;v(banana);} } 返回
Use() { while(true) { p (full) ;
p(count) ; P(mutex2) ;
从缸中取水;
v (mutex2) ; v(empty) ; v (count) ;
} } 返回
信号量机制例题:理发师
• 理发店里有一位理发师,一把理发椅,n把 侯等待理发的顾客坐的椅子。如果没有顾 客,理发师便在理发椅上睡觉,当一个顾 客到来时,他必须叫醒理发师。如果理发 师正在理发时又有顾客来到,那么,如果 又有空椅子可坐,顾客就坐下等待,否则 就离开理发店。
Else { p(sb); p(mutex); 将产品入库; v(mutex); v(sa);
返回
信号量机制例题:阅览室
有一个阅览室,共有100个座位,读者进入 时必须在一张登记表上登记,该表为每一座 位列一表目,包括做好和读者姓名等,读者 离开时要削掉登记的信息。
阅览室
Semaphore mutex=1;seats=100;readers=0 getin() { while(true) { p(seats); p(mutex); 填写登记表; 进入阅览室读书; v(mutex); v(readers); } }
生产者—消费者问题:
有一群生产者进程生产产品供给消费 者进程消费,为使两者并发执行,在两者 之间设置具有n个缓冲区的缓冲池,生产者 进程所生产的产品放入一个缓冲区中,消 费者进程可从一个缓冲区中取走产品去消 费。
生产者-消费者
Var mutex, empty, full: semaphore :=1, n, 0; consumer : begin buffer: array [ 0, …, n-1] of item; repeat in, out: integer :=0, 0; wait(full); begin wait(mutex); nextc:=buffer(out); parbegin out:=(out+1) mod n; producer : begin signal(mutex); repeat signal(empty); … consume the item in nexc; until false; produce an item in nexp; end parend … end wait(empty); wait(mutex); buffer(in):=nexp; in:=(in+1) mod n; signal(mutex); signal(full); until false; end
盘中可同时放两个水果?N个水果?
• 爸爸、妈妈、两个儿子、两个女儿: 桌上有一空盘,最多可以容纳两个水 果。爸爸可向盘中放苹果,妈妈向盘 中放桔子,两个儿子专等吃盘中的桔 子,两个女儿专等吃盘中的苹果。
Var empty,mutex,apple,banana:Semaphore :=2,1,0,0; Main() { cobegin Father();mother();son();daugher(); Coend } Father() { while (true) {p(empty); p(mutex); 将苹果放入盘子; v(mutex); v(apple);} } Mother() { while (true) { p(empty);p(mutex); 将香蕉放入盘子; v(mutex); v(banana);} }
信号量机制例题
• • • • • • A、B两种产品 阅览室 吸烟者 出租车 南开大学和天津大学 司机和售票员 • 爸爸,妈妈,儿子,女儿
• 理发师
• R,M,P,共享同一缓 冲区 • 信箱传递消息
• 分拣黑、白棋子
生产者-消费者
• 和尚吃水
读者-写者
• 过独木桥 • 读者——写者问题、 写者优先 • 桥上不允许两车交会, 但允许同方向多辆车 依次通过。 • 猴子过峡谷 • 单行车道
•
S = S + 1 S ≤ ≥ 0 是 否 否 是 返 回
•
V操作: (1)S加l; (2)若相加结果大于零,进程继续执行 (无等待该临界资源的阻塞进程); (3)若相加结果小于或等于零,则从该信 号的等待队列中唤醒一个等待进程,然后 再返回原进程继续执行或转进程调度。
唤醒等待队列中的一个进程 调用进程入等待队列 返回或转进程调度 转进程调度
信号量机制例题:出租车
某宾馆门前有一个出租车停车位,假设宾馆 每一位顾客出门都要乘坐出租车,并且对顾 客约定:如果有其他顾客在此等车位等车, 则在旁等待;否则在此等车;此停车位有车 则乘坐。对出租车做出约定:如果此停车位 已停有车,则等待此停车位空闲;否则停到 此停车位等待顾客;有顾客则搭载顾客离开。 试用P、V原语编写程序描述顾客与出租车的 行为。
吸烟者Semaphore: a[0..2]=0;agent=1;
r,s:integer;
agent() { while(true) { set I,j to value between 0 and 2 p(agent); v(a[i]); v(a[j]); } } smoker() { while(true) {p(a[r]); p(a[s]); smoking; v(agent); } } 返回
读者-写者 Var rmutex, wmutex :semaphore :=1, 1; Readcount :integer :=0; Begin parbegin Reader : begin repeat wait(rmutex); if Readcount=0 then wait(wmutex); Readcount :=Readcount +1; signal(rmutex); perform read operation; wait(rmutex); Readcount :=Readcount -1; if Readcount=0 then signal(wmutex); signal(rmutex); until false; end • Writer : begin repeat wait(wmutex); perform write operation;
信号量机制 信号量机制
wait和signa1又称为P、V操作,P、 V原语, P、V操作的一般描述如下: P操作: (1)S减l; (2)若s减1后仍大于或等于零,则进程 继续执行(可进入临界区); (3)若s减l后小于零,则该进程被阻塞在 与该信号相对应的队列中,然后转进程调 度。
P、V操作
入 口
信号量机制例题: A、B两种产品
有一个仓库,可以存放A、B两种产品,但 要求: (1)每次只能存入一个产品( A或B) (2)-N<A产品数量-B产品数量<M
A、B两种产品
Semaphore mutex=1;sa=m-1;sb=n-1 Main() { while(true) { 取一个产品; if(取得是A产品) { p(sa); p(mutex); 将产品入库; v(mutex); v(sb); }
Getout() { while(true) {p(readers); p(mutex); 消掉登记; 离开阅览室 v(mutex); v(seats); } }返回
信号量机制例题:吸烟者
有三个吸烟者和一个供应商,每个吸烟者制 造并吸掉香烟。制造和吸掉香烟需要三种原 料:烟草、纸和火柴。供货商有充足的原料, 而每个吸烟者手中只有一种不同于其他吸烟 者所拥有的原料。供货商放两种原料于桌面 上,于是正好有另一种原料的吸烟者就可以 制造并吸掉香烟,然后发一个完成信号给供 货商,于是供货商马上给出另两种原料,并 重复这个过程。
பைடு நூலகம்
son() { while (true) { p(banana); p(mutex);从 盘子取香蕉;v(mutex); v(empty) 吃香蕉;} }
daugher() { while (true) { p(apple); p(mutex);从 盘子取苹果;v(mutex); v(empty) 吃苹果;} }
理发师var
waiting:integer; CHAIRS:integer; customers,barbers,mutex:semaphore; customers:=0; barbers:=0; waiting:=0; mutex:=1;
procedure barber: procedure customer begin begin P(mutex); while(true); if waiting<CHAIRS P(customers); begin P(mutex); waiting:=waiting+1; waiting:=waiting-1; V(customers); V(barbers); V(mutex); P(barbers); V(mutex); get_haircut(); cut_hair; end; end;
信号量机制例题:和尚吃水
• 某寺庙,有小、老和尚若干,有一水 缸,有小和尚提水入缸供老和尚饮用。 水缸可容10 桶水,水取自同一井中。 水井径窄,每次只能容一个桶取水。 水桶总数为3个。每次入、取缸水仅为 1桶,且不可同时进行。给出取水、入 水的算法描述。
Semaphore mutex1=1;mutex2=1; empty=10;full=0;count=3; Main() {cobegin get(); use(); coend } Get() {while (true) { p(empty) ; p(count) ; P(mutex1) ; 从井中取水; v(mutex1) ; P(mutex2) ; 将水倒入缸中; v (mutex2) ; v (count) ; v (full) ; } }
Semaphore mutexn=1; countn互斥信号量 Semaphore mutexs=1; counts互斥信号量 Semaphore flag=1; Int countn=0; 北方正在过桥的车辆数 Int counts=0; 南方正在过桥的车辆数
else V(mutex); end.返回
读者——写者问题
一个数据文件或记录可被多个进程共享。 只要求读文件的进程称为“Reader进程”, 其它进程则称为“Write进程”。 允许多个进程同时读一个共享对象,但不允 许一个Write进程和其他Reader进程或 Write进程同时访问共享对象。 “读者——写者问题”是保证一个Write进程 必须与其他进程互斥地访问共享对象的同 步问题。
出租车
Semaphore:st=1,s=0, sc=1;
Customer () { p (sc); P (s); 乘坐离开; V (sc); V (st) }
taxi() { P (st); 停车; V (s); } 返回
信号量机制例题:爸爸,妈妈,儿子,女儿 • 桌上有一空盘,允许存放一只水果。 爸爸可向盘中放苹果,妈妈向盘中放 香蕉,儿子专等吃盘中的香蕉,女儿 专等吃盘中的苹果。
signal(wmutex); until false; end parend end
信号量机制例题:过独木桥
• 某条河上只有一座独木桥,以便行人过桥, 现在河的两边都有人要过桥,按照下面的 规则过桥,为了保证过桥安全,请用P,V 操作分别实现正确的管理。 过桥的规则:同一方向的可连续过桥,某方 向有人过桥时另一方向的人要等待。