12 system-V IPC 信号量
12.1 进程信号量基本概念
信号量本质是计数器,用于协调多进程间对共享数据对象的读取,不以传送数据为目的, 主要用来保护共享资源(信号量也属于临界资源),使该临界资源在一个时刻只有一个进程独享。
12.2 信号量的工作原理
信号量只能进行两种操作:等待(P操作)和发送信号(V操作),锁就是P操作,解锁就是V操作。 PV操作是计算机操作系统需要提供的基本功能之一,它们的行为是这样的:
-
P 操作:若有可用的资源(信号量值大于0),则占用一个资源(信号量值减一,进入临界区); 若无可用的资源(信号量值为0),则阻塞,直到系统将资源分配给该进程(进入等待队列,一直等到资源轮到该进程)。
-
V 操作:如果在该信号量的等待队列中有进程在等待资源,则唤醒一个阻塞的进程。如果没有进程等待它, 则释放一个资源(给信号量值加一)。
在信号量进行PV操作时都为原子操作(因为它需要保护临界资源)。
注:原子操作:单指令的操作称为原子的,单条指令的执行是不会被打断的
内核可对信号量(计数器)做加减操作,并且操作时遵守一些基本操作原则, 即:对计数器做加操作立即返回,做减操作要检查计数器当前值是否可减?(这个计数器的值要大于1), 如果是则进行减操作;否则将进程将阻塞等待,直到系统中有进程对该信号量进行P操作。
12.2.1 创建或获取一个信号量
12.2.2 semget创建/获取函数
semget函数的功能是创建或者获取一个已经创建的信号量,如果成功则返回对应的信号量标识符, 失败则返回-1。函数原型如下:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int