linux进程调度源码是什么

  

这篇文章主要讲解了“linux进程调度源码是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“linux进程调度源码是什么”吧!

下面是进程调度函数及其相关函数的代码。

void schedule(void)
{
    int i,next,c;
    struct task_struct ** p;

/* check alarm, wake up any interruptible tasks that have got a signal */
    // 处理进程的信号和状态
    for(p = &LAST_TASK ; p > &FIRST_TASK ; --p)
        if (*p) {
            /*
                alarm的值是调用alarm函数设置的,见alarm函数,进程可以调用alarm函数,设置一个时间,
                然后到期后会触发alram信号,alarm < jiffies说明过期了。设置alarm信号
            */
            if ((*p)->alarm && (*p)->alarm < jiffies) {
                    (*p)->signal |= (1<(SIGALRM-1));
                    (*p)->alarm = 0;
                }
            /*
                _BLOCKABLE为可以阻塞的信号集合,blocked为当前进程设置的阻塞集合,相与
                得到进程当前阻塞的集合,即排除进程阻塞了不能阻塞的信号,然后取反得到可以接收的
                信号集合,再和signal相与,得到当前进程当前收到的信号。如果进程处于挂起状态,则改成可执行 
            */
            if (((*p)->signal & ~(_BLOCKABLE & (*p)->blocked)) &&
            (*p)->state==TASK_INTERRUPTIBLE)
                (*p)->state=TASK_RUNNING;
        }

/* this is the scheduler proper: */
    // 开始调度,选择合适的进程执行
    while (1) {
        c = -1;
        next = 0;
        i = NR_TASKS;
        p = &task[NR_TASKS];
        while (--i) {
            if (!*--p)
                continue;
                // 找出时间片最大的进程,说明他执行的时间最短
            if ((*p)->state == TASK_RUNNING && (*p)->counter > c)
                c = (*p)->counter, next = i;
        }
        // 还有进程需要执行,c大于等于0
        if (c) break;
        // 没有break说明c等于0,即所有的进程时间片已经执行完,需要重新设置
        for(p = &LAST_TASK ; p > &FIRST_TASK ; --p)

linux进程调度源码是什么