在操作系统中, 当多个进程都企图对共享数据进行某种处理, 而最后的结果又取决于进程运行的顺序时, 就会发生竞争条件, 这是操作系统中一个典型的问题, 无效唤醒恰恰就是由于竞争条件导致的...., 也就是必须消除竞争条件产生的根源, 这样在这之后出现的wake_up_process就可以起到唤醒状态是睡眠状态的进程的作用了....在Linux操作系统中, 内核的稳定性至关重要, 为了避免在Linux操作系统内核中出现无效唤醒问题, Linux内核在需要进程睡眠的时候应该使用类似如下的操作:
/* ‘q’是我们希望睡眠的等待队列...然后循环检查条件是否为真: 如果是的话就没有必要睡眠, 如果条件不为真, 就调用schedule
当进程检查的条件满足后, 进程又将自己设置为TASK_RUNNING并调用remove_wait_queue...从上面可以看到, Linux的内核代码维护者也是在进程检查条件之前就设置进程的状态为睡眠状态,
然后才循环检查条件.