一、概述
信号量一般可以用来标记可用资源的个数,因为其count成员为0时,才会调度当前无法获取信号量的进程去睡眠,而在初始化时可以设置为任何值。
在linux中获取互斥锁使用的是排队机制,先睡眠的进程先获取锁。
二、相关文件
<include/linux/semaphore.h>
三、数据结构
/* 内核中信号量结构 */
struct semaphore {
/* 自旋锁 */
spinlock_t lock;
/* 计数,初始化时可设置为任何值;为0时,当前进程不可获取信号量,会调度当前进程去睡眠。非0时,当前进程可以获取信号量,并将其减1操作。在持有者释放时,对其加1操作。 */
unsigned int count;
/* 链表头,管理睡眠的进程。先睡眠的进程,会先唤醒。 */
struct list_head wait_list;
};
四、重要函数
/* 定义信号量 */
struct semaphore ***_sema;
/* 初始化信号量 */
voud sema_init(struct semaphore *, int);
/* 上锁 */
void down(struct semaphore *)
/* 解锁 */
void up(struct semaphore *);
五、其它