请教一个信号量的问题
有一个信号量的问题向大家请教一下内核版本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每次都**等待队列上的第一个进程的初衷是什么(不考虑进程的优先级)?
谢谢了!!! 自己顶一下,懂的朋友说说吧 FIFO吧,这里不是调度,先来的就应该先处理吧~
页:
[1]