锁-关于操作系统信号量的问题:Implementing S as a Binary

问题描述

关于操作系统信号量的问题:Implementing S as a Binary

1 //Implementing S as a Binary
2 //Data structures:
3 binary-semaphore S1, S2;
4 int C:
5 //Initialization:
6 S1 = 1
7 S2 = 0
8 C = initial value of counting semaphore S
9
10 //wait operation
11 S1=1, S2=0 and C=S initially
12 wait(S1);
13 C--;
14 if (C < 0) {
15 signal(S1);
16 wait(S2);
17 }
18 signal(S1);
19
20 //signal operation
21 wait(S1);
22 C ++;
23 if (C <= 0)
24 signal (S2);
25 else
26 signal (S1);

可以理解这个是对原始信号量的一种改进,重新封装PV操作,C表示资源数。现在不太明白S1和S2到底表示什么?
S1和S2都是bool值,S1可以理解为互斥信号量。从代码来看,S1使得P和V操作不能同时进行,互斥(这么理解对吗?
或者S1表示什么呢?)
程序的大概描述是:
          ---P操作:首先获得“锁”S1,然后“消费”资源(C--),如果资源数为0(C==0,先执行C--后变为C<0)
释放锁,使得V操作执行,同时获得锁S2(暂时不能理解S2)
---V操作:同样先得到S1的锁,“生产”资源,若初始C==0,则释放S1,否则若初始C<=-1
通知S2
整个流程似乎是:初始C==0, V先执行,C=1(或2,3,4,...),执行P,C变为0(或-1,使得V操作继续进行)

问题是不知道我这么想对不对?或者S1,S2到底代表的是什么?能否举个例子说明,这种信号量和传统信号量的区别在哪里
谢谢各位大神

时间: 2024-08-23 01:37:30

锁-关于操作系统信号量的问题:Implementing S as a Binary的相关文章

大话Linux内核中锁机制之信号量、读写信号量

大话Linux内核中锁机制之信号量.读写信号量 在上一篇博文中笔者分析了关于内存屏障.读写自旋锁以及顺序锁的相关内容,本篇博文将着重讨论有关信号量.读写信号量的内容.  六.信号量 关于信号量的内容,实际上它是与自旋锁类似的概念,只有得到信号量的进程才能执行临界区的代码:不同的是获取不到信号量时,进程不会原地打转而是进入休眠等待状态.它的定义是include\linux\semaphore.h文件中,结构体如图6.1所示.其中的count变量是计数作用,通过使用lock变量实现对count变量的

关于操作系统信号量的作业题

问题描述 关于操作系统信号量的作业题 The Sleeping-Barber Problem: -A barbershop consists of a waiting room with n chairs and the barber room containing the barber chair. -If there are no customers to be served, the barber goes to sleep. -If a customer enters the barbe

Linux 内核同步之自旋锁与信号量的异同【转】

转自:http://blog.csdn.net/liuxd3000/article/details/8567070 Linux 设备驱动中必须解决的一个问题是多个进程对共享资源的并发访问,并发访问会导致竞态,linux 提供了多种解决竞态问题的方式,这些方式适合不同的应用场景.   Linux 内核是多进程.多线程的操作系统,它提供了相当完整的内核同步方法.内核同步方法列表如下: 中断屏蔽 原子操作 自旋锁 读写自旋锁 顺序锁 信号量 读写信号量 BKL (大内核锁) Seq 锁 一.并发与竞态

PgSQL · 源码分析 · PG中的无锁算法和原子操作应用一则

原子操作概述 近年来随着服务器上CPU核数的不断增加,无锁算法(Lock Free)越来越广泛的被应用于高并发的系统中.PostgreSQL 做为世界上最高级开源数据库也在9.5时引入了无锁算法.本文先介绍了无锁算法和原子操作在PostgreSQL中的具体实现, 再通过一个Patch来看一下在PostgreSQL中是如何利用它来解决实际的高并发问题的. 无锁算法是利用CPU的原子操作实现的数据结构和算法来解决原来只能用锁才能解决的并发控制问题. 众所周知,在一个并发系统中特别是高并发的场景下,锁

jvm(13)-线程安全与锁优化(转)

0.1)本文部分文字转自"深入理解jvm", 旨在学习 线程安全与锁优化 的基础知识: 0.2)本文知识对于理解 java并发编程非常有用,个人觉得,所以我总结的很详细: [1]概述 [2]线程安全 1)线程安全定义:当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象是线程安全的:(干货--线程安全定义) [2.1]java 语言中的线程安全(干货-

【锁】Latch、lock、 pin的区别

[锁]Latch.lock. pin的区别  我之前写过的几篇锁的文章: [锁]Oracle锁系列:http://blog.itpub.net/26736162/viewspace-2128896/[锁]Oracle死锁(DeadLock)的分类及其模拟:http://blog.itpub.net/26736162/viewspace-2127247/[故障处理]队列等待之TX - allocate ITL entry引起的死锁处理:http://blog.itpub.net/26736162/

大话Linux内核中锁机制之RCU、大内核锁

大话Linux内核中锁机制之RCU.大内核锁 在上篇博文中笔者分析了关于完成量和互斥量的使用以及一些经典的问题,下面笔者将在本篇博文中重点分析有关RCU机制的相关内容以及介绍目前已被淘汰出内核的大内核锁(BKL).文章的最后对<大话Linux内核中锁机制>系列博文进行了总结,并提出关于目前Linux内核中提供的锁机制的一些基本使用观点. 十.RCU机制 本节将讨论另一种重要锁机制:RCU锁机制.首先我们从概念上理解下什么叫RCU,其中读(Read):读者不需要获得任何锁就可访问RCU保护的临界

大话Linux内核中锁机制之内存屏障、读写自旋锁及顺序锁

大话Linux内核中锁机制之内存屏障.读写自旋锁及顺序锁     在上一篇博文中笔者讨论了关于原子操作和自旋锁的相关内容,本篇博文将继续锁机制的讨论,包括内存屏障.读写自旋锁以及顺序锁的相关内容.下面首先讨论内存屏障的相关内容. 三.内存屏障 不知读者是是否记得在笔者讨论自旋锁的禁止或使能的时候,提到过一个内存屏障函数.OK,接下来,笔者将讨论内存屏障的具体细节内容.我们首先来看下它的概念,Memory Barrier是指编译器和处理器对代码进行优化(对读写指令进行重新排序)后,导致对内存的写入

JVM中锁优化,偏向锁、自旋锁、锁消除、锁膨胀

本文将简单介绍HotSpot虚拟机中用到的锁优化技术. 自旋锁 互斥同步对性能最大的影响是阻塞的实现,挂起线程和恢复线程的操作都需要转入内核态中完成,这些操作给系统的并发性能带来了很大的压力.而在很多应用上,共享数据的锁定状态只会持续很短的一段时间.若实体机上有多个处理器,能让两个以上的线程同时并行执行,我们就可以让后面请求锁的那个线程原地自旋(不放弃CPU时间),看看持有锁的线程是否很快就会释放锁.为了让线程等待,我们只须让线程执行一个忙循环(自旋),这项技术就是自旋锁. 如果锁长时间被占用,