一个信号量S是一个整型量,除对其初始化外,它只能由两个原子操作P和V来访问。P和V的名称来源于荷兰文proberen(测试)和verhogen(增量),后面亦将P/V操作分别称作wait(), signal()。

Wait()/Signal()的伪码表示:

 Wait(){                 Signal(){
while(S <= ); S ++;
S--; }
}

但这并不是信号量的最终实现,最终的信号量实现最好是能解决2个问题:
(1)不能忙等。
(2)有某种方式记录处于等待状态的进程数量。

信号量可以被用来解决n个进程的临界区问题,进程之间共享一个信号量mutex,mutex初始化为1。

下面是使用信号量的互斥实现(这里,初值为1的信号量代替了互斥锁的功能):

 do
{
wait(mutex);
//临界区;
signal(mutex);
//退出区;
}
while();

上述的信号量的概念描述中,P操作中的等待是用while循环形式的忙等来实现的-----忙等,浪费CPU时钟
使用忙等形式实现的信号量也被成为自旋锁(Spinlock)
Spinlock在多处理器系统中是有用的,在进程等待一个锁的时候无需进行上下文切换,上下文切换可能需要花费很长的时间,在锁只需要保留较短时间时,自旋锁比较有用。

为了避免进程忙等,wait和signal的定义需要进行修改:
Wait:
当一个进程执行wait操作但发现信号量S<=0时,它必须等待,这里的等待不是忙等,而是阻塞自己。
阻塞操作将一个进程放入与信号量相关的等待队列中,且该进程的状态被切换成等待状态,接着控制被转到CPU调度程序,以选择另一个进程来执行。
Signal:
一个进程阻塞且等待信号量S,可以在其他进程执行signal操作之后被重新执行。

信号量的物理意义:
S>0表示有S个资源可用
S=0表示无资源可用
S<0,|S|表示S等待队列中的进程个数

为了定义基于阻塞(block)/唤醒(wakeup)的信号量,可以将信号量定义为如下一个"C"结构:

 typedef  struct
{
int value;
struct process *L;//在该信号量上阻塞的进程队列
} semaphore;

Wait操作定义:

 void  wait(semaphore S)
{
S.value--;
if(S.value<)
{
add this process to S.L;
block();
}
}

Signal操作定义:

void  signal(semaphore S)
{
S.value++;
if(S.value<=)
{
remove a process P from S.L;
wakeup(P);
}
}

下图是Wait()和Signal()操作执行的流程图:

    Wait()            Signal()

[OS] 信号量(Semaphore)的更多相关文章

  1. C# 多线程之一:信号量Semaphore

    通过使用一个计数器对共享资源进行访问控制,Semaphore构造器需要提供初始化的计数器(信号量)大小以及最大的计数器大小 访问共享资源时,程序首先申请一个向Semaphore申请一个许可证,Sema ...

  2. 经典线程同步 信号量Semaphore

    阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event& ...

  3. 互斥锁Mutex与信号量Semaphore的区别

    转自互斥锁Mutex与信号量Semaphore的区别 多线程编程中,常常会遇到这两个概念:Mutex和Semaphore,两者之间区别如下: 有人做过如下类比: Mutex是一把钥匙,一个人拿了就可进 ...

  4. 信号量 Semaphore

    一.简介         信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用,负责协调各个线程, 以保证它们能够正确.合理的使用公共资源. Semaphore可以控制某个资源可被同时 ...

  5. windows核心编程-信号量(semaphore)

    线程同步的方式主要有:临界区.互斥区.事件.信号量四种方式. 前边讲过了互斥器线程同步-----windows核心编程-互斥器(Mutexes),这章我来介绍一下信号量(semaphore)线程同步. ...

  6. 秒杀多线程第八篇 经典线程同步 信号量Semaphore

    阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <且不超过最大资源数量. 第三个參数能够用来传出先前的资源计数,设为NULL表示不须要传出. 注意:当 ...

  7. 转:【Java并发编程】之二十三:并发新特性—信号量Semaphore(含代码)

    载请注明出处:http://blog.csdn.net/ns_code/article/details/17524153 在操作系统中,信号量是个很重要的概念,它在控制进程间的协作方面有着非常重要的作 ...

  8. 多线程面试题系列(8):经典线程同步 信号量Semaphore

    前面介绍了关键段CS.事件Event.互斥量Mutex在经典线程同步问题中的使用.本篇介绍用信号量Semaphore来解决这个问题. 首先也来看看如何使用信号量,信号量Semaphore常用有三个函数 ...

  9. java笔记--对信号量Semaphore的理解与运用

    java Semaphore 信号量的使用: 在java中,提供了信号量Semaphore的支持. Semaphore类是一个计数信号量,必须由获取它的线程释放, 通常用于限制可以访问某些资源(物理或 ...

  10. 对信号量Semaphore的理解与运用

    转: java笔记--对信号量Semaphore的理解与运用 java Semaphore 信号量的使用: 在java中,提供了信号量Semaphore的支持. Semaphore类是一个计数信号量, ...

随机推荐

  1. Qt udp 主机和虚拟机无法互相广播

    描述: 主机和虚拟机可以ping通,port没被占用,虚拟机可以向主机广播,但是主机不能向虚拟机广播 原因: 虚拟机只配置了一个适配器,而主机有多个适配器,当虚拟机广播时,只能使用和主机连接的适配器, ...

  2. javascript之input字符串不为空

    今天我们来讲如何判断这个java中字符串输入是否为空 ------------------------当只有一个input的时候,我们来进行个判断这个值是否为空-------------------- ...

  3. 20145234黄斐《Java程序设计》第五周学习总结

    教材学习内容总结 第八章 异常处理 语法与继承架构 try.catch:try.catch代表错误的对象后做一些处理. 异常继承架构:错误会被包装为对象,这些对象均可抛出,因此设计错误对象都继承自ja ...

  4. 深圳Uber司机本周(7.13-7.19凌晨4:00)的奖励政策

    本周(7.13-7.19凌晨4:00)的奖励政策为: 佣金返还: 车费的20%适用于所有产品(不包括Tesla)无获取条件 翻倍补贴: 每周一到周四07:00-10:00/17:00-22:00:车费 ...

  5. MyBatis-参数处理

    1.单个参数 mybatis不会做特殊处理. #{参数名/任意名}:取出参数值. 2.多个参数 mybatis会做特殊处理. 多个参数会被封装成 一个map. key:param1...paramN, ...

  6. elasticsearch增删改查操作

    目录 1. 插入数据 2. 更改数据 3. 删除数据 4. 检索文档 1. 插入数据 关于下面的代码如何使用,可以借助于kibana的console,浏览器打开地址: http://xxx.xxx.x ...

  7. 一个小白的测试环境docker化之路

    本文来自网易云社区 作者:叶子 学习docker搭建测试环境断断续续也有三个多月了,希望记录一下这个过程.常言道,总结过去,展望未来嘛~文章浅显,还望各位大神路过轻拍. 按照国际惯例,先说一下背景: ...

  8. RSA加密通信小结(一)

    一.背景描述 帮朋友完成相关方案的改进. 二.计划与方案 1.加密方式采用RSA 1024加密. 2.发送与接收都采用RSA加密,采用两套不同的密钥. 3.统一的加解码函数.(此处除了对于传输数据进行 ...

  9. hdu5698瞬间移动(杨辉三角+快速幂+逆元)

    瞬间移动 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submis ...

  10. (python)leetcode刷题笔记04 Median of Two Sorted Arrays

    4. Median of Two Sorted Arrays There are two sorted arrays nums1 and nums2 of size m and n respectiv ...