信号量(进程通信)

来源:互联网 发布:道路工程软件 编辑:程序博客网 时间:2024/06/03 22:46

这里写图片描述

关于进程通信方式,我之前整理如上图。今天,我们主要通过实例(代码编写)来深入了解信号量。

关于信号的概念,基础知识等我在信号量(生产者和消费者模型)以及进程通信概念和进程通信方式这两篇文章都有总结,不再赘述。

我们通过了解Linux下关于信号量函数接口,以及代码编写复习,熟悉信号量。PS:代码均在Ubuntu16.04下测试。


什么是信号量

在前面,我们提过,信号量主要用于互斥或者同步机制。信号量本质上是一个计数器,只不过这个计数器的加减操作都是原子操作。我们可以把它理解成一个锁(Lock),对于系统的临界资源(每次只能有一个进程访问的资源如打印机,缓冲区等等)进行保护,说白了,就是当一个进程访问一个临界资源进行加锁,这样子别人即访问不了了,当进程访问完该资源释放该锁这样子别人才能访问从而实现了互斥机制。

关于信号量,下图有一个比较详细的说明:

这里写图片描述

在这里,信号量的值加减就是我们之前所说的P,V操作。关于PV操作,我在信号量(生产者和消费者模型)整理过基础知识,现在简单回顾如下:

P操作:信号量值减一,如果值小于0,则挂起该进程,否则直接使用资源
V操作:信号量值加一,如果值依旧小于等于0,说明之前有进程在等待使用这个资源,因此需要唤醒一个等待进程

这里写图片描述

Linux下信号量相关函数

主要有:

semget创建或者获得一个信号集

semop对信号集进行P,V操作

semctl对信号集控制,比如删除等等

它们可以通过man手册去查询具体的用法。

关于函数介绍,也可以参见这篇博客信号量函数(semget、semop、semctl)

实例

由于信号量本身并不具备传输数据的能力,它多用于完成互斥,同步等特性,因此,这个实例将结合共享内存信号量

共享内存也是SystemV标准下IPC通信机制的一种,它比我们前面所讲的都要快,但是它的缺点则是不提供同步,互斥机制,因此,我们可以结合自己实现的信号量来提供此机制。

代码可见我的另一篇博客共享内存的实例。

原创粉丝点击