Linux信号量源码如何进行深入剖析?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1129个文字,预计阅读时间需要5分钟。
如果任务获取信号量失败,该任务必须等待,直到其他任务释放信号量。在Linux中,当任务释放信号量后,如何唤醒等待该信号量的任务?信号量定义如下:
如果一个任务获取信号量失败,该任务就必须等待,直到其他任务释放信号量。本文的重点是,在Linux中,当有任务释放信号量之后,如何唤醒正在等待该信号量的任务。
信号量定义如下:
struct semaphore {
raw_spinlock_t lock;
unsigned int count;
struct list_head wait_list;
};
其中wait_list链表用于管理因没有成功获取信号量而处于睡眠状态的任务。
任务通过调用down()函数,尝试获取信号量,如果获取信号量失败,调用__down()函数。__down()函数内部调用了__down_common函数。(事实上down()函数有多个变种,如down_interruptible,在获取信号量失败时调用__down_interruptible,__down_interruptible也会调用__down_common函数。不同的down()函数最终调用__down_common时传入不同的参数,以处理不同的获取信号量的情况)。
同时,整个down()函数使用sem->lock保护起来。
本文共计1129个文字,预计阅读时间需要5分钟。
如果任务获取信号量失败,该任务必须等待,直到其他任务释放信号量。在Linux中,当任务释放信号量后,如何唤醒等待该信号量的任务?信号量定义如下:
如果一个任务获取信号量失败,该任务就必须等待,直到其他任务释放信号量。本文的重点是,在Linux中,当有任务释放信号量之后,如何唤醒正在等待该信号量的任务。
信号量定义如下:
struct semaphore {
raw_spinlock_t lock;
unsigned int count;
struct list_head wait_list;
};
其中wait_list链表用于管理因没有成功获取信号量而处于睡眠状态的任务。
任务通过调用down()函数,尝试获取信号量,如果获取信号量失败,调用__down()函数。__down()函数内部调用了__down_common函数。(事实上down()函数有多个变种,如down_interruptible,在获取信号量失败时调用__down_interruptible,__down_interruptible也会调用__down_common函数。不同的down()函数最终调用__down_common时传入不同的参数,以处理不同的获取信号量的情况)。
同时,整个down()函数使用sem->lock保护起来。

