linux进程调度

抢占是不会将非运行进程移出调度队列的。

 
TASK_RUNNING:正在运行或处于就绪状态:就绪状态是指进程申请到了CPU以外的其他所有资源,正所谓:万事俱备,只欠东风.提醒:一般的操作系统教科书将正在CPU上执行的进程定义为RUNNING状态、而将可执行但是尚未被调度执行的进程定义为READY状态,这两种状态在Linux下统一为 TASK_RUNNING状态.
TASK_INTERRUPTIBLE:处于等待队伍中,等待资源有效时唤醒(比如等待键盘输入、socket连接、信号等等),但可以被中断唤醒.一般情况下,进程列表中的绝大多数进程都处于TASK_INTERRUPTIBLE状态.毕竟皇帝只有一个(单个CPU时),后宫佳丽几千;如果不是绝大多数进程都在睡眠,CPU又怎么响应得过来.
TASK_UNINTERRUPTIBLE:处于等待队伍中,等待资源有效时唤醒(比如等待键盘输入、socket连接、信号等等),但不可以被中断唤醒.
TASK_ZOMBIE:僵死状态,进程资源用户空间被释放,但内核中的进程PCB并没有释放,等待父进程回收.
TASK_STOPPED:进程被外部程序暂停(如收到SIGSTOP信号,进程会进入到TASK_STOPPED状态),当再次允许时继续执行(进程收到SIGCONT信号,进入TASK_RUNNING状态),因此处于这一状态的进程可以被唤醒
 
在利用kthread_create创建了一个进程后,并设置进程状态为TASK_INTERRUPTIBLE,当前进程的运行状态不会改变,依然是执行状态。举例:
int thread_do(void* arg)
{
__set_current_state(TASK_INTERRUPTIBLE);
while(!kthread_should_stop()) {
printk("*** ");
            //schedule();
 
}
return 0;
}
static int __init t_init(void)
{
p = kthread_create(thread_do, NULL, "TASK1");
wake_up_process(p);
return 0;
}
在wake_up进程p后,会一直打印***。__set_current_state(TASK_INTERRUPTIBLE);   只是设置了进程的一个状态位而已,什么也没做。
如果不调用SCHEDULE ()是不会把当前进程从运行队列MOVE到 等待队列的,所以,当前任务一直在运行队列。所以,能够一直执行。
 
kthread_create是创建一个线程后,等待事件触发。kthread_run是创建一个线程后,直接唤醒线程开始运行。
原文地址:https://www.cnblogs.com/scu-cjx/p/6879017.html