• 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是创建一个线程后,直接唤醒线程开始运行。
  • 相关阅读:
    STM32F107的DAC配置
    步进电机工作原理
    winform笔记本蓝牙与外部蓝牙设备通信
    C#里三种强制类型转换
    IE6/7BUG之OL有序列表没顺序
    IE6/7BUG之列表UL楼梯
    IE6/7BUG之A超链接无效
    IE6/7BUG之overflow:hidden无效
    linux shell 管道命令(pipe)使用及与shell重定向区别
    UGUI研究院之全面理解图集与使用
  • 原文地址:https://www.cnblogs.com/scu-cjx/p/6879017.html
Copyright © 2020-2023  润新知