【发布时间】:2012-12-08 21:35:30
【问题描述】:
我一直在阅读http://www.linuxjournal.com/article/8144 并思考以下情况:
4253 /* Wait for kthread_stop */
4254 set_current_state(TASK_INTERRUPTIBLE);
4255 while (!kthread_should_stop()) {
4256 schedule();
4257 set_current_state(TASK_INTERRUPTIBLE);
4258 }
4259 set_current_state(TASK_RUNNING);
4260 return 0;
现在,如果在我们将进程设置为睡眠的第 4254 行之前调用了 kthread_stop,并且在该行之后我们实际上被抢占/调度并且进程也真的被发送到睡眠状态,会发生什么?
在这种情况下,唤醒呼叫是在更改状态之前收到的(因此它不会影响我们),操作系统的正常运行会在我们实际检查任何内容之前让我们进入睡眠状态。
我想我错过了一些东西,可能是以下两个选项之一: (1) 状态的实际变化仅在我们调用 schedule() 时发生,或者 (2) 在 set_current_state 调用之后和 schedule() 之前,我们无法被调度(通过抢占、中断等) ) 调用。
感谢您的帮助!
【问题讨论】:
标签: c linux multithreading kernel preemption