super皮波 发表于 2014-07-07 10:41

请教一个信号量的问题

有一个信号量的问题向大家请教一下
内核版本3.10.17
信号量的定义
struct semaphore {
        raw_spinlock_t                lock;/*自旋锁*/
        unsigned int                count;
        struct list_head        wait_list;
};
信号量down操作的实现,麻烦大家看一下我理解的是否正确
void down(struct semaphore *sem)
{
        unsigned long flags;

        raw_spin_lock_irqsave(&sem->lock, flags);/*这里采用自旋锁,第一是为了保护count这个临界资源,第二是为了可以排队获取信号量,因为__down操作每次都是将任务挂到信号量等待队列的队尾,在up**进程的时候,每次都是**挂在等待队列的第一个进程*/
        if (likely(sem->count > 0))
                sem->count--;
        else
                __down(sem);
        raw_spin_unlock_irqrestore(&sem->lock, flags);
}

所以这就有可能造成优先级低的会优先**,而优先级高的进程会继续睡眠,当然如果每次都**优先级最高的进程,有可能导致对优先级低的进程的不公平对待,我看内核一般在处理这种情况的时候都是采用折中的原则,但这里却没有用。
不知道我上述的理解是否正确,如果正确的话,up每次都**等待队列上的第一个进程的初衷是什么(不考虑进程的优先级)?

谢谢了!!!

super皮波 发表于 2014-07-07 11:33

自己顶一下,懂的朋友说说吧

humjb_1983 发表于 2014-07-07 12:31

FIFO吧,这里不是调度,先来的就应该先处理吧~
页: [1]
查看完整版本: 请教一个信号量的问题