itop-4412开发板学习-内核信号量

1. 翻翻书看下,linux提供两种信号量,内核信号量,由内核控制路径使用,System V IPC信号量,由用户态进程使用。下面的就是内核部分的信号量。内核信号量类似于自旋锁,当锁关闭着时,不允许内核控制路径继续进行,当某个进程试图获取已经被占用的资源时,这个进程被挂起,进入睡眠,因此只有可以睡眠的函数才能在函数内部获取信号量。

2. 看下内核信号量的结构体

struct semaphore {
    spinlock_t        lock;
    unsigned int        count;
    struct list_head    wait_list;
};

3. 函数的实现

void up(struct semaphore *sem)
{
    unsigned long flags;
    spin_lock_irqsave(&sem->lock, flags);
    if (likely(list_empty(&sem->wait_list)))
        sem->count++;
    else
        __up(sem);
    spin_unlock_irqrestore(&sem->lock, flags);
}

 

posted @ 2018-03-08 11:40  429512065  阅读(182)  评论(0)    收藏  举报