现在的位置: 首页 > 综合 > 正文

linux系统调度源码分析

2019年05月22日 ⁄ 综合 ⁄ 共 562字 ⁄ 字号 评论关闭

废话不多说,直接上源码:

    while (1) { 
        c = -1; 
        next = 0; 
        i = NR_TASKS; 
        p = &task[NR_TASKS]; 
// 这段代码也是从任务数组的最后一个任务开始循环处理,并跳过不含任务的任务槽。比较每个就绪 
// 状态任务的 counter(任务运行时间的递减滴答计数)值,哪一个值大,运行时间还不长,next 就 
// 指向哪个的任务号。 
     while (--i) { 
	    if (!*--p) 
	         continue; 
            if ((*p)->state== TASK_RUNNING&& (*p)->counter > c) 
                 c = (*p)->counter, next = i; 
      } 
// 如果比较得出有counter 值大于 0 的结果,则退出 124行开始的循环,执行任务切换(141 行)。 
            if (c) break; 
// 否则就根据每个任务的优先权值,更新每一个任务的 counter值,然后回到 125 行重新比较。 
// counter值的计算方式为 counter = counter /2 + priority。[右边 counter=0??] 
     for(p = &LAST_TASK; p > &FIRST_TASK; --p) 
             if (*p) 
          (*p)->counter = ((*p)->counter >> 1) + 
          (*p)->priority; 
             } 
        switch_to(next); // 切换到任务号为 next 的任务,并运行之。 
   } 

抱歉!评论已关闭.