这里所介绍的信号量是一种计数信号量集,它是一个计数器,用于多进程对共享数据对象的访问。共享资源通常分为两类:一类是互斥共享资源,即任一时刻只允许一个进程访问该资源;另一类是同步共享资源,即同一时刻允许多个进程访问该资源;信号量是解决互斥共享资源的同步问题而引入的机制。
当有进程要求使用共享资源时,需要执行以下操作:
- 系统首先要检测该资源的信号量;
- 若该资源的信号量值大于0,则进程可以使用该资源,此时,进程将该资源的信号量值减1;
- 若该资源的信号量值为0,则进程进入休眠状态,直到信号量值大于0时进程被唤醒,访问该资源;
当进程不再使用由一个信号量控制的共享资源时,该信号量值增加1,如果此时有进程处于休眠状态等待此信号量,则该进程会被唤醒。
每个信号量集都有一个与其相对应的结构,该结构定义如下:
/* Data structure describing a set of semaphores. */
struct semid_ds
{
struct ipc_perm sem_perm; /* operation permission struct */
struct sem *sem_base; /* ptr to array of semaphores in set */
unsigned short sem_nsems; /* # of semaphores in set */
time_t sem_otime; /* last-semop() time */
time_t sem_ctime; /* last-change time */
};
/* Data structure describing each of semaphores. */
struct sem
{
unsigned short semval; /* semaphore value, always >= 0 */
pid_t sempid; /* pid for last successful semop(), SETVAL, SETALL */
unsigned short semncnt; /* # processes awaiting semval > curval */
unsigned short semzcnt; /* # processes awaiting semval == 0 */
};
信号量集的结构图如下所示: