Linux驱动-内核信号量semaphore的实现
2024年7月 · 预计阅读时间: 2 分钟
“一图胜千言”
#
信号量内核结构体include/linux/semaphore.h
初始化 semaphore 之后,就可以使用 down 函数或其他衍生版本来获取信号量,使用 up 函数释放信号量。
#
down 函数的实现- 如果 semaphore 中的 count 大于 0,那么 down 函数就可以获得信号量;否则就休眠。
- 在读取、修改 count 时,要使用 spinlock 来实现互斥。
- 休眠时,要把当前进程放在 semaphore 的 wait_list 链表中,别的进程释放信号量时去 wait_list 中把进程取出、唤醒。
调用过程:
kernel/locking/semaphore.c
#
up 函数的实现如果有其他进程在等待信号量,则 count 值无需调整,直接取出第 1 个等待信号量的进程,把信号量给它,把它唤醒。
如果没有其他进程在等待信号量,则调整 count。