[linux kernel]semaphore信号量的用法

struct semaphore {
    raw_spinlock_t        lock; --->锁
    unsigned int        count;--->信号量计数
    struct list_head    wait_list;--->信号量等待链表
};

struct semaphore_waiter {
    struct list_head list;
    struct task_struct *task;
    bool up;
};

两个关键函数:

/**
 * up - release the semaphore
 * @sem: the semaphore to release
 *
 * Release the semaphore.  Unlike mutexes, up() may be called from any
 * context and even by tasks which have never called down().
 */
void up(struct semaphore *sem)
{
    unsigned long flags;

    raw_spin_lock_irqsave(&sem->lock, flags);
    if (likely(list_empty(&sem->wait_list)))///< 如果链表为空,表示没有人等待信号量,直接++
        sem->count++;///< 信号量增加
    else///< 否则
        __up(sem);
    raw_spin_unlock_irqrestore(&sem->lock, flags);
}
EXPORT_SYMBOL(up);

/**
 * down - acquire the semaphore
 * @sem: the semaphore to be acquired
 *
 * Acquires the semaphore.  If no more tasks are allowed to acquire the
 * semaphore, calling this function will put the task to sleep until the
 * semaphore is released.
 *
 * Use of this function is deprecated, please use down_interruptible() or
 * down_killable() instead.
 */
void down(struct semaphore *sem)
{
    unsigned long flags;

    raw_spin_lock_irqsave(&sem->lock, flags);
    if (likely(sem->count > 0))
        sem->count--;
    else///< 小于等于0
        __down(sem);
    raw_spin_unlock_irqrestore(&sem->lock, flags);
}
EXPORT_SYMBOL(down);

你可能感兴趣的:(linux,运维,服务器)