zoukankan      html  css  js  c++  java
  • 一起talk C栗子吧(第一百回:C语言实例--使用信号量进行进程间同步与相互排斥一)


    各位看官们。大家好,上一回中咱们说的是进程间同步与相互排斥的样例,这一回咱们说的样例是:使用信号量进行进程间同步与相互排斥

    闲话休提,言归正转。让我们一起talk C栗子吧!

    看官们,信号量是由著名计算机科学家迪杰斯特拉(Dijkstra)提出的一种概念,专门用来解决进程间同步与相互排斥。在他提出的概念中信号量是一个非负整数值.

    信号量的操作仅仅能有两种原子操作

    • 等待信号;
    • 发送信号。

    “什么是原子操作呢?”台下有看官在提问。原子操作就是指某个动作在运行时不能被其他动作中断,它会一直进行,直到该动作运行完毕为止。比方,我们在写代码的时候,突然收到一封邮件,这时候系统会临时中断写代码的程序vim(我用的是vim),然后让邮箱client发一个收到邮件的通知。然后再恢复到vim写代码的动作中。样例中使用vim写代码的动作就不是一个原子操作,仅仅有它不能被其他动作中断时,它才是一个原子操作。

    接下来我们介绍对信号量的原子操作。

    等待信号

    等待信号也叫P操作。

    例P(sem)表示对信号量sem进行P操作。

    • 假设sem的值大于零,p操作会把sem的值减去1。
    • 假设sem的值等于零,那么挂起运行p操作的进程;

    发送信号

    发送信号也叫V操作。比如V(sem)表示对信号量sem进行V操作。

    • 假设有进程在由于等待sem而被挂起,那么唤醒等待的进程;
    • 假设没有进程由于等待sem而被挂起。那么把sem的值加上1.

    伪代码

    以下是使用信号量进行进程同步与相互排斥的伪代码

    nocritical code     //非临界区的代码
    P(sem);             //运行P操作,进入临界区。运行临界区中的代码
    {
        critical code;  //临界区代码
        do something
    }
    V(sem);            //运行V操作,离开临界区
    nocritical code    //非临界区的代码

    假设上面伪代码中的信号量sem值为1,进程A開始运行上面的伪代码。在进入临界区前先对信号量进行P操作,这时sem的值变为0,然后进程A运行临界区中的代码,这个时候进程B也開始运行上面的伪代码,在进入临界区前先对信号量进行P操作,这时进程A还没有离开临界区,信号量sem的值为零。进程B就会被挂起。直到进程A离开临界区运行V操作时,sem的值变为1,然后唤醒等待sem的进程B。接着进程B进入临界区而且运行临界区中的代码。

    大家能够看到。通过信号量的P/V操作。能够保证在同一个时间内。仅仅有一个进程在运行临界区中的代码,也就是说实现了进程的同步与相互排斥。

    看官们。本章回中就不写代码了。由于我们还没有介怎样使用信号量。在后面的章回中,我们会介绍信号量的操作。而且结合详细的样例,把伪代码转换成实际的代码。

    各位看官,关于使用信号量进行进程间同步与相互排斥的样例咱们就讲到这里。欲知后面还有什么样例,且听下回分解 。


  • 相关阅读:
    div居中和table居中,jQuery获取下拉列表值
    Android利用canvas画各种图形(点、直线、弧、圆、椭圆、文字、矩形、多边形、曲线、圆角矩形)
    Android监听应用程序安装和卸载
    android开发图片分辨率问题解决方案
    [整理]Selector、shape详解
    android string.xml %问题
    Android Service学习之本地服务
    android selector中使用shape
    android AsyncTask 详解
    android bluetooth UUID蓝牙查询表
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/7191398.html
Copyright © 2011-2022 走看看