線程狀態,摘自kernel-3.10.102 include/linux/sched.h
除了RUNNING外,都不佔有CPU。
線(進)程描述符task_struct。
當線程執行的條件得不到滿足,可以用以下兩行使線程讓出CPU:
set_current_state(TASK_INTERRUPTIBLE);
schedule();
爲什麼schedule前要set_current_state
schedule實現如下
asmlinkage void __sched schedule(void)
{
struct task_struct *tsk = current;
sched_submit_work(tsk);
__schedule();
}
__schedule()註釋
如果當前task state還是running狀態,
if (prev->state && !(preempt_count() & PREEMPT_ACTIVE)) 無法進入,
不會執行到deactivate_task,線程仍有可能佔有CPU,沒有sleep。
schedule也有帶超時的函數
signed long __sched schedule_timeout(signed long timeout)
實現也在sched.h中,簡單來說就是在schedule()前設置了一個timer,timeout的時間後就wake_up_process(current)