线程状态,摘自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)