信号量
信号量(Semaphore)是一种用于实现计算机资源共享的IPC机制之一,其本质是一个计数器。信号量是在多进程环境下实现资源互斥访问或共享资源访问的方法,可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,进程/线程必须获取一个信号量;一旦该关键代码段完成了,那么该进程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个进程释放信号量。
信号量有两种应用形式:一种用于临界资源的互斥访问,临界资源在同一时刻只允许一个进程使用,此时的信号量是一个二元信号量,它只控制一个资源;另一种应用于处理多个共享资源(例如多台打印机的分配),信号量在其中起到记录空闲资源数目的作用。
Linux信号量定义
Linux多进程访问共享资源时,需要按下列步骤进行操作:
(1)检测控制这个资源的信号量的值。
(2)如果信号量是正数,就可以使用这个资源。进程将信号量的值减一,表示当前进程占用了一份资源。
(3)如果信号量是0,那么进程进入睡眠状态,直到信号量的值重新大于0时被唤醒,转入第一步操作。
上述过程也被称为PV操作。为了正确实现信号量机制,检测和增减信号量的值都应该是原语操作,因此信号量一般是在内核中实现的。
在信号量的实际应用中,是不能单独定义一个信号量的,只能定义一个信号量集,其中包含一组信号量。同一信号量集中的信号量使用同一个引用ID,这样的设置是为了多个资源或同步操作的需要。每个信号量集都有一个与之对应的结构,其中记录了信号量集的各种信息,该结构的定义如下:
#include <sys/sem.h>
struct semid_ds
{
struct ipc_perm sem_perm; //指向与信号量集相对应的ipc_perm结构的指针
struct sem *sem_base; //指向这个集合中第一个信号量的指针
ushort sem_nsems; //集合中信号量的数量
time_t sem_otime; //最近一次调用semop函数的时间
time_t sem_ctime; //最近一次改变的时间
};