|
信号量是一个计数器,常用于处理进程或线程的同步问题,特别是对临界资源访问的同步。临界资源可以简单的理解为在某一时刻只能由一个进程或线程进行操作的资源,这里的资源可以是一段代码、一个变量或某种硬件资源。信号量的值大于或等于0 时表示可供并发进程使用的资源实体数;小于 0时代表正在等待使用临界资源的进程数。
与消息队列类似,Linux 内核也为每个信号集维护了一个 semid_ds 数据结构实例,该结构定义在头文件 linux/sem.h 中:
/* Obsolete, used only for backwards compatibility and libc5 compiles */
struct semid_ds {
struct ipc_perm sem_perm; /* permissions .. see ipc.h */
__kernel_time_t sem_otime; /* last semop time */
__kernel_time_t sem_ctime; /* last change time */
struct sem *sem_base; /* ptr to first semaphore in array */
struct sem_queue *sem_pending; /* pending operations to be processed */
struct sem_queue **sem_pending_last; /* last pending operation */
struct sem_undo *undo; /* undo requests on this array */
unsigned short sem_nsems; /* no. of semaphores in array */
}; sem_pending_last : 最后一个正在挂起的操作 其中,sem_base 成员对用户空间进程没多大作用,因为它指向内核的虚拟内存空间中的一个地址。此内存保存着一个 struct sem 结构的数组,信号量集中的每个信号量都有一个 sem 结构。 |
|