本文将阐述一下信号量的作用及经典例子,当中包括“《越狱》寄信”,“家庭吃水果”,“五子棋”,“接力赛跑”,“读者写者”,“四方恋爱”等

首先,讲 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 信号量 三 (经典例子)的更多相关文章

  1. linux POSIX 信号量介绍

    信号量一.什么是信号量信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)使用.多线程可以同时运行多个线程函数完成功能,但是对于共享数据如果不加以锁定,随意改变共享数据的值会发生 ...

  2. linux Posix 信号量 一

    信号量是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语. linux提供两种信号量,“内核信号量”和“用户态进程信号量”,“用户态信号量”又分为“Posix”,“System V”信号 ...

  3. linux Posix 信号量 二

    一.Posix信号量 1.Posix信号量分为两种: 1.   有名信号量:使用Posix IPC名字标识(有名信号量总是既可用于线程间的同步,又可以用于进程间的同步) 2.   内存信号量:存放在共 ...

  4. linux POSIX信号量

    POSIX信号量机制是3种IPC机制之一,3种IPC机制源于POSIX.1的实时扩展. 创建一个新的命名信号量或者使用一个现有信号量 #include <fcntl.h> #include ...

  5. Linux进程同步之POSIX信号量

    POSIX信号量是属于POSIX标准系统接口定义的实时扩展部分.在SUS(Single UNIX Specification)单一规范中,定义的XSI IPC中也同样定义了人们通常称为System V ...

  6. Linux进程间通信IPC学习笔记之同步二(Posix 信号量)

    Linux进程间通信IPC学习笔记之同步二(Posix 信号量)

  7. Linux多线程实践(5) --Posix信号量与互斥量解决生产者消费者问题

    Posix信号量 Posix 信号量 有名信号量 无名信号量 sem_open sem_init sem_close sem_destroy sem_unlink sem_wait sem_post ...

  8. linux c编程:Posix信号量

    POSIX信号量接口,意在解决XSI信号量接口的几个不足之处: POSIX信号量接口相比于XSI信号量接口,允许更高性能的实现. POSIX信号量接口简单易用:没有信号量集,其中一些接口模仿了我们熟悉 ...

  9. 第三十九章 POSIX信号量与互斥锁

    POSIX信号量相关函数 sem_open 功能: initialize and open a named semaphore 原型: sem_t *sem_open(const char *name ...

随机推荐

  1. 初探动态规划(DP)

    学习qzz的命名,来写一篇关于动态规划(dp)的入门博客. 动态规划应该算是一个入门oier的坑,动态规划的抽象即神奇之处,让很多萌新 萌比. 写这篇博客的目标,就是想要用一些容易理解的方式,讲解入门 ...

  2. 将日期转换为指定的格式:比如转换成 年月日时分秒 这种格式:yyyy-MM-dd hh:mm:ss 或者 yyyy-MM-dd。总结下。

    可以为Date原型添加如下的方法: Date.prototype.format = function(fmt) { var o = { "M+" : this.getMonth() ...

  3. C#SendMessage用法

    C#SendMessage用法 分类: C#操作内存相关 2011-11-26 23:52 1255人阅读 评论(0) 收藏 举报 函数功能:该函数将指定的消息发送到一个或多个窗口.此函数为指定的窗口 ...

  4. Java中的基本数据类型及其封装类

    Java中的数据类型有两种,基本数据类型和引用数据类型,引用数据类型的创建是 需要去new一个对象,该对象的内存分配在堆区,同时栈区会保存一个指向该对象的引用, 但是对于一些简单数据的创建,用new的 ...

  5. poj-2096-期望/dp

    http://poj.org/problem?id=2096 有n种病毒,s个服务器,每天等概率的在某个服务器上发现某一种病毒,问发现所有种类病毒且覆盖所有的服务器的期望天数. 利用全期望公式可以将期 ...

  6. 在am中定义消息集束,并在CO中验证之后抛出异常。

    需求:在页面上点某个按钮的时候,需要收集所有异常并抛出. -------------------------------------------方式1:参考 EBS OAF开发中的错误/异常处理(Er ...

  7. Javascript设计模式笔记

    Javascript是越来越厉害了,一统前后端开发.于是最近把设计模式又看了一遍,顺便做了个笔记,以方便自己和他人共同学习. 笔记连载详见:http://www.meteorcn.net/wordpr ...

  8. gradle ssh 插件

    org.hidetake.ssh Gradle SSH Plugin is a Gradle plugin which provides remote command execution and fi ...

  9. [转载]CentOS 6.3安装Subversion服务器

    转载自http://www.cnblogs.com/zhoulf/archive/2013/02/02/2889949.html 安装说明 系统环境:CentOS-6.3 安装方式:yum insta ...

  10. Artix-7 50T FPGA试用笔记之Create a simple MicroBlaze System

    前言:之前笔者的试用博文提到安富利这块板子非常适合MicroBlaze开发,同时网上关于MicroBlaze的资料非常少(或含糊不清),没有一篇能完整介绍VIVADO SDK的设计流程,所以笔者带来这 ...