热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

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

这篇文章主要介绍了详解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);
}

其中curr->sched_class->task_tick(rq, curr, 0);这行代码调用了当前任务的调度类的task_tick()函数,这个函数根据具体情况决定是否需要对当前任务设置TIF_NEED_RESCHED标志,如果需要则最终调用set_tsk_need_resched()设置该标志。需要注意的是,此处仅仅是设置标志而没有执行schedule()函数,在各种系统调用、中断的返回代码最后,才会根据这个标志来决定是否执行schedule()函数。

睡眠的任务被唤醒时:

当睡眠任务所等待的事件到达时,内核(例如驱动程序的中断处理函数)将会调用wake_up()唤醒相关的任务,并最终调用try_to_wake_up()。它完成三件事:将任务重新添加到就绪队列,将运行标志设置为TASK_RUNNING,如果被唤醒的任务可以抢占当前运行任务则设置当前任务的TIF_NEED_RESCHED标志。

设置了TIF_NEED_RESCHED标志之后,真正调用执行schedule()函数的时机只有两种,第一种是系统调用或者中断返回时,根据TIF_NEED_RESCHED标志决定是否调用schedule()函数(从效率方面考虑,趁着还在内核态把该处理的事情处理完毕);第二种情况是当前任务因为原因需要睡眠,进程睡眠后立即调用schedule()函数,在内核中这种情况也比较多,比如磁盘、网卡等设备驱动程序中。

参考文献:《Linux技术内幕》

PS:刚开始学习Linux内核的时候很容易被各种结构体各种概念充斥脑海,一团乱麻。这时候需要把它们各自负责的功能以及之间相互的配合理清楚,推荐这本书。看完《Linux内核设计与实现》后可以相互比照,效果不错。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 本文探讨了如何在日常工作中通过优化效率和深入研究核心技术,将技术和知识转化为实际收益。文章结合个人经验,分享了提高工作效率、掌握高价值技能以及选择合适工作环境的方法,帮助读者更好地实现技术变现。 ... [详细]
  • 本文将详细介绍如何在ThinkPHP6框架中实现多数据库的部署,包括读写分离的策略,以及如何通过负载均衡和MySQL同步技术优化数据库性能。 ... [详细]
  • 免费获取:全面更新的Linux集群视频教程及配套资源
    本资源包含最新的Linux集群视频教程、详细的教学资料、实用的学习课件、完整的源代码及多种软件开发工具。百度网盘链接:https://pan.baidu.com/s/1roYoSM0jHqa3PrCfaaaqUQ,提取码:41py。关注我们的公众号,获取更多更新的技术教程。 ... [详细]
  • 本文详细介绍如何使用arm-eabi-gdb调试Android平台上的C/C++程序。通过具体步骤和实用技巧,帮助开发者更高效地进行调试工作。 ... [详细]
  • MySQL 高性能实战教程
    本课程深入探讨 MySQL 的架构、性能调优、索引优化、查询优化及高可用性等关键领域。通过实际案例和详细讲解,帮助学员掌握提升 MySQL 数据库性能的方法与技巧。 ... [详细]
  • 本文介绍了数据库体系的基础知识,涵盖关系型数据库(如MySQL)和非关系型数据库(如MongoDB)的基本操作及高级功能。通过三个阶段的学习路径——基础、优化和部署,帮助读者全面掌握数据库的使用和管理。 ... [详细]
  • Nginx 反向代理与负载均衡实验
    本实验旨在通过配置 Nginx 实现反向代理和负载均衡,确保从北京本地代理服务器访问上海的 Web 服务器时,能够依次显示红、黄、绿三种颜色页面以验证负载均衡效果。 ... [详细]
  • 在项目中使用 Redis 时,了解其不同架构模式(如单节点、主从复制、哨兵模式和集群)对于确保系统的高可用性和扩展性至关重要。本文将详细探讨这些模式的特点和应用场景。 ... [详细]
  • 深入解析Spring Cloud微服务架构与分布式系统实战
    本文详细介绍了Spring Cloud在微服务架构和分布式系统中的应用,结合实际案例和最新技术,帮助读者全面掌握微服务的实现与优化。 ... [详细]
  • 本文作为SpringCloud Alibaba系列教程的第一部分,主要介绍如何搭建SpringCloud Alibaba的开发环境,帮助初学者快速入门。SpringCloud Alibaba是由阿里巴巴团队开源的一套微服务工具集,旨在简化分布式系统的构建过程。 ... [详细]
  • 使用LVS与ldirectord实现高可用负载均衡
    本文介绍了如何通过LVS(Linux Virtual Server)结合ldirectord工具来实现服务器的健康检查及负载均衡功能。环境设置包括一个LVS节点和两个真实服务器节点,通过配置ldirectord进行健康状态监测,确保系统的高可用性。 ... [详细]
  • 深入理解Docker网络管理
    本文介绍了Docker网络管理的基本概念,包括为什么需要Docker网络管理以及Docker提供的多种网络驱动模式。同时,文章还详细解释了Docker网络相关的命令操作,帮助读者更好地理解和使用Docker网络功能。 ... [详细]
  • Spring Cloud因其强大的功能和灵活性,被誉为开发分布式系统的‘一站式’解决方案。它不仅简化了分布式系统中的常见模式实现,还被广泛应用于企业级生产环境中。本书内容详实,覆盖了从微服务基础到Spring Cloud的高级应用,适合各层次的开发者。 ... [详细]
  • 探讨GET与POST请求数据传输的最大容量
    在Web开发领域,GET和POST是最常见的两种数据传输方法。本文将深入探讨这两种请求方式在不同环境下的数据传输能力及其限制。 ... [详细]
author-avatar
快乐天使小可爱66
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有