详解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