唤醒抢占
当在try_to_wake_up/wake_up_process和wake_up_new_task中唤醒进程时, 内核使用全局check_preempt_curr看看是否进程可以抢占当前进程可以抢占当前运行的进程...schedule, 由于它现在的状态是TASK_RUNNING, 所以仍然不会被从运行队列中移出, 因而不会错误的进入睡眠,当然也就避免了无效唤醒问题.
5 Linux内核的例子
5.1 一个最基本的例子...如果在进程开始睡眠之前条件就已经达成了, 那么循环会退出并用set_current_state将自己的状态设置为就绪, 这样同样保证了进程不会存在错误的进入睡眠的倾向, 当然也就不会导致出现无效唤醒问题...2号进程的例子-避免无效抢占
下面让我们用linux内核中的实例来看看Linux 内核是如何避免无效睡眠的, 我还记得2号进程吧, 它的主要工作就是接手内核线程kthread的创建, 其工作流程函数是...这样无论进程等待的条件是否满足, 进程都不会因为被移出就绪队列而错误地进入睡眠状态, 从而避免了无效唤醒问题.
set_current_state(TASK_INTERRUPTIBLE);
spin_lock