linux Posix 信号量 三 (经典例子)
本文将阐述一下信号量的作用及经典例子,当中包括“《越狱》寄信”,“家庭吃水果”,“五子棋”,“接力赛跑”,“读者写者”,“四方恋爱”等
首先,讲 semWait操作(P操作)和semSignal操作(V操作)的一些基本原则。(接下来同意称为P,V操作)
1. P操作,s - -,if(s<0)阻塞自己
2. V操作,s++,if(s<=0)唤醒一个其他进程
3. P,V操作时原语(通俗讲,就是执行PV操作时时不能被打打断的)
4. P,V操作总是成对出现的。P:资源申请/分配;V操作:资源的释放
一般每个进程的PV操作代码:
s = ? //根据资源数进行初始化
P(s)
临界区
V(s)
一.《越狱》寄信
题目描述:
T-boy给brad送信,Mike给Lincon送信,但他们送信收信都通过同一个树洞。
解答:
信号量:
Lincon: 是否有Mike的信,s1 = 0
Brad: 是否有T-boy的信,s2 = 0
Mike和T-boy: 树洞是否为空,s3 = 1
Mike: T-boy: Lincon: Brad:
write() write() P(s1) P(s2)
P(s3) P(s3) getit() getit()
putit() putit() V(s3) V(s3)
V(s1) V(s2) readit() readit()
二. 家庭吃水果(对第一题的扩充,不同的只是现在资源比之前多了,变成了3个)

解答:
信号量:
儿子: 是否有苹果,s1 = 0
女儿: 是否有桔子,s2 = 0
爸妈: 是否可以放水果,s3 = 3
爸: 妈: 儿子: 女儿:
makeit() makeit() P(s1) P(s2)
P(s3) P(s3) getit() getit()
putit() putit() V(s3) V(s3)
V(s1) V(s2) eatit() eatit()
三. 五子棋
题目描述:白子和黑子各有32个,黑子先行,怎样设置信号量,才能黑子先行,且是交替下子
解答:
信号量:
白子可下吗? s1 = 0
黑子可下吗? s2 = 1
白 黑
for(i=0;i<32;i++){ for(i=0;i<32;i++){
取子 取子
P(s1) P(s2)
放白子 放黑子
V(s2) V(s1)
} }
四.接力赛跑
题目描述:四个人进行接力赛跑,要求使用信号量的方法使得跑的顺序是P1->P2->P3->P4
解答:
信号量:
s2:2号接棒 0
s3:3号接棒 0
s4:4号接棒 0
P1 P2 P3 P4
P(s2) P(s3) P(s4)
run run run run
V(s2) V(s3) V(s4)
接上篇的信号量经典例题,其中包括“读者写者”,“过独木桥”,“公交车”,“四方恋爱”等
一. 读者写着问题(这里有很多种情况):
(1)读者优先
题目描述:有一本书,有多个读者和写者,读写互斥,写写互斥。当多个读者可以同时读,即当有读者在读这本书时,其他的读者也可以进来读,但写者就不能进来写。
解答:
信号量:
w:可写否:1
nReader:读者数 :0
mutex:读者之间的“互斥”,进出的先后顺序而已:1
写者: 读者
P(w) P(mutex)
写 nReader ++
V(w) if(nReader == 1)//第一个读者
P(w) //堵塞写者
V(mutex)
读
P(mutex)
nReader - -
if(nReader==0)//最后一个读者
V(w) //唤醒写者
V(mutex)
(2)写者优先
题目描述:有一本书,有多个读者和写者,读写互斥,写写互斥,不同的是只要有写者等,后续读者必须等待在写者后面
w:可写否:1
nReader:读者数 :0
mutex:读者之间的“互斥”,进出的先后顺序而已:1
s:用于封锁后续读者 :1
写者: 读者
P(s)
P(s) P(mutex)
P(w) nReader ++
写 if(nReader == 1)//第一个读者
V(w) P(w) //堵塞写者
V(s) V(mutex)
V(s)
读
P(mutex)
nReader - -
if(nReader==0)//最后一个读者
V(w) //唤醒写者
V(mutex)
二.过独木桥

题目描述:
桥单向通行,分别从西到东和从东到西
解答:
信号量:
s : 表示桥可用? :1
nw : 东向西人数 :0
ne : 西向东人数 : 0
m1: 互斥对nw的修改 :1
m2: 互斥对ne的修改 :1
ToWest ToEast
P(m1) P(m2)
nw++ ne ++
if(1==nw) if(1==ne)
P(s) P(s)
V(m1) V(m2)
cross the bridge to west cross the bridge to east
P(m1) P(m2)
nw-- ne - -
if(0==nw) if(0==ne)
V(s) V(s)
V(m1) V(m2)
三.四方恋爱
题目描述:有两男两女,男士送女士玫瑰,女士送男士手表。一一对应,每个只能连接一个
解答:
(1)老师答案
信号量:
m1:互斥女士之间的收花送表行为:1
m2:互斥男士之间的收表送花行为:1
s1:有花? 0
s2:有表? 0
女士 男士
P(s1) P(m2)
P(m1) 送花
收花 V(s1)
送表 P(s2)
V(s2) 手表
V(m1) V(m2)
恋爱 恋爱
(2)自己的答案
四个分别是李四(男),张三(男),嘻嘻(女),哈哈(女)
信号量:
g1:是否有表收 :0
g2:是否有玫瑰收:0
s1:是否可以送表:1
s2:是否可以送玫瑰:1
note:这里只运行一次的,不能够循环
李四 张三 嘻嘻 哈哈
P(s2) P(s2) P(s1) P(s1)
sendRose() sendRose sendWatch sendWath
V(g2) V(g2) V(g1) V(g1)
P(g1) P(g1) P(g2) P(g2)
getWatch getWatch getRose getRose
V(s1) V(s1) V(s2) V(s2)
ps:这个解答我逻辑上想了一下,没有错误,但我一个同学说实际上载机器上跑时好像有问题,自己就没想明白,请高手指教了
linux Posix 信号量 三 (经典例子)的更多相关文章
- linux POSIX 信号量介绍
信号量一.什么是信号量信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)使用.多线程可以同时运行多个线程函数完成功能,但是对于共享数据如果不加以锁定,随意改变共享数据的值会发生 ...
- linux Posix 信号量 一
信号量是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语. linux提供两种信号量,“内核信号量”和“用户态进程信号量”,“用户态信号量”又分为“Posix”,“System V”信号 ...
- linux Posix 信号量 二
一.Posix信号量 1.Posix信号量分为两种: 1. 有名信号量:使用Posix IPC名字标识(有名信号量总是既可用于线程间的同步,又可以用于进程间的同步) 2. 内存信号量:存放在共 ...
- linux POSIX信号量
POSIX信号量机制是3种IPC机制之一,3种IPC机制源于POSIX.1的实时扩展. 创建一个新的命名信号量或者使用一个现有信号量 #include <fcntl.h> #include ...
- Linux进程同步之POSIX信号量
POSIX信号量是属于POSIX标准系统接口定义的实时扩展部分.在SUS(Single UNIX Specification)单一规范中,定义的XSI IPC中也同样定义了人们通常称为System V ...
- Linux进程间通信IPC学习笔记之同步二(Posix 信号量)
Linux进程间通信IPC学习笔记之同步二(Posix 信号量)
- Linux多线程实践(5) --Posix信号量与互斥量解决生产者消费者问题
Posix信号量 Posix 信号量 有名信号量 无名信号量 sem_open sem_init sem_close sem_destroy sem_unlink sem_wait sem_post ...
- linux c编程:Posix信号量
POSIX信号量接口,意在解决XSI信号量接口的几个不足之处: POSIX信号量接口相比于XSI信号量接口,允许更高性能的实现. POSIX信号量接口简单易用:没有信号量集,其中一些接口模仿了我们熟悉 ...
- 第三十九章 POSIX信号量与互斥锁
POSIX信号量相关函数 sem_open 功能: initialize and open a named semaphore 原型: sem_t *sem_open(const char *name ...
随机推荐
- 20145211《网络对抗》注入Shellcode并执行&&Return-to-libc攻击
Shellcode注入 基础知识 Shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中,并将堆栈的返回地址利用缓冲区溢出,覆盖成为指向 shellcode的地址. ...
- log4j2配置按照日志级别将日志输出到不同的文件
背景 在项目中,可能会产生非常多的日志记录,为了方便日志分析,可以将日志按级别输出到指定文件. log4j2.xml配置文件 <!--将info级别的日志单独输出到info.log中--> ...
- Linux下停止没有关闭的远程登陆终端
脚本如下: #!/bin/shTTY_LOG=tty_logTTY_LOG1=tty_log1USER_NAME=`whoami`#echo ${USER_NAME}who|grep ${USER_N ...
- [微信开发] - 从最新的appid,appsecret读取配置信息
设置好form表单,填写参数传入Java后端做为实例bean,接着存储倒数据库. 当微信端接口配置提交时,Java接口从数据库获取最新的配置信息,可以根据increaseID,也可以设置时间段, 这里 ...
- spring boot2 基于百度云apiface实现人脸检测与认证2
接上一篇,上篇只实现了人脸的认证,接下来实现人脸的检测. 原理介绍: 把摄像头抓拍的图像上传到服务器,服务器把图像上传到百度云,百度云返回识别出的人脸的数量和位置,前端根据服务端的返回,在图像中画出人 ...
- Solidity 官方文档中文版 1_简介
简介 Solidity是一种语法类似JavaScript的高级语言.它被设计成以编译的方式生成以太坊虚拟机代码.在后续内容中你将会发现,使用它很容易创建用于投票.众筹.封闭拍卖.多重签名钱包等等的合约 ...
- 理解if __name__ == '__main__':
一开始没怎么注意这个语句,这两天在模拟知乎登陆时准备刨根问底了,先看两行代码片段 第一个例子:这是在login.py文件的一部分,其他我们忽略,只关注print()函数的内容 import time ...
- 2018-2019-2 网络对抗技术 20165332 Exp2 后门原理与实践
2018-2019-2 网络对抗技术 20165332 Exp2 后门原理与实践 - 实验内容 任务一:使用netcat获取主机操作Shell,cron启动 任务二:使用socat获取主机操作Shel ...
- 使用AspNetPager进行分页,查询条件丢失问题
在Asp.Net中使用AspNetPager进行分页时,发现一个问题: 当通过查询条件进行查询后,对查询结果进行翻页操作时,查询条件会丢失. 当修改UrlPaging属性后(设置UrlPaging=“ ...
- HDU-4511-ac自动机+dp
小明系列故事——女友的考验 Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total ...