详解Linux内核进程调度函数schedule()的触发和执行时机-创新互联

内核的调度操作分为触发和执行两个部分,触发时仅仅设置一下当前进程的TIF_NEED_RESCHED标志,执行的时候则是通过schedule()函数来完成进程的选择和切换。当前进程的thread_info->flags中TIF_NEED_RESCHED位表示需要调用schedule()函数进行调度。内核在两种情况下会设置该标志,一个是在时钟中断进行周期性的检查时,另一个是在被唤醒进程的优先级比正在运行的进程的优先级高时。

成都创新互联服务项目包括建邺网站建设、建邺网站制作、建邺网页制作以及建邺网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,建邺网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到建邺省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!

周期性地更新当前任务的状态时:

定时中断处理函数中会调用schedule_tick()用于处理关于调度的周期性检查和处理,其调用路径是和时钟处理有关的tick_periodic()->update_process_times()->scheduler_tick()或者tick_sched_handle()->update_process_times()->scheduler_tick(),主要用于更新就绪队列的时钟、CPU负载和当前任务的运行时间统计等,如下所示:

//linux-3.13/kernel/sched/core.c
void scheduler_tick(void)
{
  int cpu = smp_processor_id();         //获取当前cpu编号
  struct rq *rq = cpu_rq(cpu);         //取得对应cpu的rq(就绪队列)
  struct task_struct *curr = rq->curr;     //获取当前运行的任务

  sched_clock_tick();

  raw_spin_lock(&rq->lock);
  update_rq_clock(rq);             //更新队列时钟
  curr->sched_class->task_tick(rq, curr, 0);  //调用当前任务的调度类对应的函数
  update_cpu_load_active(rq);          //更新本处理器的负载
  raw_spin_unlock(&rq->lock);

  perf_event_task_tick();

#ifdef CONFIG_SMP
  rq->idle_balance = idle_cpu(cpu);
  trigger_load_balance(rq, cpu);        //必要时进行负载均衡
#endif
  rq_last_tick_reset(rq);
}

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


网站标题:详解Linux内核进程调度函数schedule()的触发和执行时机-创新互联
网站地址:http://ybzwz.com/article/dcephg.html