
回复
这里事先推荐给大家一个Linux源码的阅读网站,真的很方便!![preempt.h - tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/preempt.h - Linux source code (v6.2.8) - Bootlin]
进程通过睡眠机制释放处理器,使其能够处理其它进程。处理器睡眠的原因可能在于感知数据的可用性,或等待资源释放。
内核调度器管理要运行的任务列表,这被称作运行队列。睡眠进程不再被调度,因为已将它们从运行列表中移除。除非其状态改变(唤醒),负责睡眠进程将永远不会被执行。进程一旦进入等待状态,就可以释放处理器,一定要确保有条件或其它进程会唤醒它。Linux内核通过提供一组函数和数据结构来简化睡眠机制的实现。
等待队列实际上用于处理被阻塞的I/O,以等待特定条件成立,并感知数据或资源可用性。为了理解其工作方式,来看一看它在include/linux/wait.h中的结构
入睡的每一个进程都在list_head中排队并进入睡眠状态。
处理等待队列将会用到如下常用函数:
静态声明:
动态声明:
阻塞:
解除阻塞:
如果想唤醒队列中等待的所有进程,应该使用wake_up_interruptible_all.