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

时间:2023-03-09 15:00:50
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);
}