Linux内核软中断线程对于通用内核线程的启示(2)

static inline void __cond_resched (void)
{
    do {
        add_preempt_count(PREEMPT_ACTIVE);   <---禁止内核(抢占计数++),目的是为了本线程切出后能尽快切回来,因为本次是本线程因为运行时间长了主动释放,后面还有软中断等待处理呢,系统不能老把我抢占了,耽误我的处理延迟
        schedule();
        sub_preempt_count(PREEMPT_ACTIVE);
    } while (need_resched());
}

static inline int need_resched (void)
{
    return unlikely(test_thread_flag(TIF_NEED_RESCHED));  <--测试TIF_NEED_RESCHED标志是否设置,主要是时钟中断调用的scheduler_tick()函数设置本线程的时间片是否到(本线程运行时间是否过长),如果到了,说明线程运行的时间足够长了,那就歇会儿吧,不要把系统其他线程饿死了,毕竟本线程是禁止了内核抢占的
}

上述软中断线程处理得经典框架可以作为有类似处理内核线程的通用框架 。

static int kmythread (...)
{
    ...
    set_current_state(TASK_INTERRUPTIBLE);
    while (!kthread_should_stop()) {
        if (!local_softirq_pending())    /* 这段代码对于通用线程可以删除 */
            schedule();

__set_current_state(TASK_RUNNING);
        while (/* 有自己的数据处理,如:自己的队列里面有报文需要处理等 */) {
            preempt_disable();
            /* 干活... */
            preempt_enable();
            cond_resched();
        }
        set_current_state(TASK_INTERRUPTIBLE);
    }
    __set_current_state(TASK_RUNNING);
    return 0;

}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/24287.html