zoukankan      html  css  js  c++  java
  • 进程间通信(6):信号量

    信号量

    信号量(Semaphore)也称为信号灯,典故来源于荷兰:火车根据旗标来决定是否通行。其实就是红绿灯的作用。如图。

    通过红绿灯理解信号和信号量,感觉它们似乎是一样的。但是,信号量机制是根据红绿灯的事件让人等待(进程阻塞)或不等待(进程继续运行),只有这两种行为;而信号机制是根据红绿灯事件做出任何可能的处理,并不一定是等待(阻塞)或前行(不阻塞)。

    在计算机领域,信号量是一个整数值,如果是正数,表示有多少个信号量,也表示可使用的信号灯数量,信号量的值也可以是0或负数。信号量要结合PV操作(两个原语)才能真正起作用,P是减一个信号灯操作,V加一个信号灯操作。

    信号量有很多种变体,下面简单描述其中一种信号量的规则:

    • 1.如果一个进程请求P操作(减1操作,即请求一个信号灯),如果减去之后信号量的数值为负数,则该进程被阻塞,如果减去之后为0或正数,则放行该进程
    • 2.如果一个进程请求V操作(加1操作,即释放或增加一个信号灯),进程直接放行
    • 3.如果请求V操作,如果加1之后仍为0或负数,则放行该进程的同时还唤醒另一个被阻塞的进程。如果加1后为正数,则直接添加一个信号灯资源

    总结起来很简单:如果当前没有信号灯资源(小于或等于0),那么消费信号灯(P原语)的进程就会被阻塞;如果有信号灯资源(大于0),就直接放行。如果一个进程是来生产信号灯资源的(V原语),那么这个进程当然要放行;因为添加了一个信号灯,那么还可以拥有唤醒一个被阻塞进程的能力(如果有被阻塞进程的话)。

    最简单的信号量当然是初始时只使用1个信号灯,从而实现互斥锁(也称为互斥量)机制:P是申请锁操作,只有在有值为1的时候才能申请锁,否则被阻塞;V是释放锁,一直被放行。

  • 相关阅读:
    237.Delete Node in a Linked List
    235.Lowest Common Ancestor of a Binary Search Tree
    234.Palindrome Linked List
    232.Implement Queue using Stacks
    231.Power of Two
    226.Invert Binary Tree
    225.Implement Stack using Queues
    Vue概述
    Git分布式版本控制工具
    分布式RPC框架Apache Dubbo
  • 原文地址:https://www.cnblogs.com/liujunjun/p/12411712.html
Copyright © 2011-2022 走看看