【问题标题】:How does a task scheduler fire a job?任务调度程序如何触发作业?
【发布时间】:2014-07-30 11:39:50
【问题描述】:

当一个任务调度程序(例如 cron)触发一个任务(例如 cron 作业)时,它是通过每隔最小周期(例如秒)“轮询”时钟来做到这一点的,还是注册一个回调,当时间到了?

如果是push/callback,底层平台(如linux)是怎么做的?对于基于时间的事件,是否存在“硬件中断”或其他回调机制?

那么,任务调度程序如何触发作业?

【问题讨论】:

    标签: cron scheduled-tasks scheduler


    【解决方案1】:

    来自手册页:

    cron 实用程序每分钟唤醒一次,检查所有存储的 crontab,检查每个命令以查看它是否应该在当前分钟内运行。执行命令时,任何 输出被邮寄给 crontab 的所有者(或者发送给 crontab 中 MAILTO 环境变量中指定的用户,如果存在的话)。

    【讨论】:

      【解决方案2】:

      可能取决于实现。有些做轮询(如上所述),但有些使用中断方法(检查下一个任务何时必须运行并设置系统警报)。

      【讨论】:

      • 这是我最感兴趣的,不是具体的cron,而是最低级别的触发器是如何触发的。如果这是操作系统设置的,它又是如何触发的呢?操作系统是否“轮询”或是否存在某种“基于时间的硬件中断”...
      【解决方案3】:

      Unix 7 的 cron 有以下算法:

      它的算法很简单:

      1) 读取 /usr/etc/crontab 2) 确定是否有任何命令必须在当前日期和时间运行,如果是,则以超级用户 root 身份运行它们。 3)睡一分钟 4) 从第 1 步开始重复。

      但这对系统来说很沉重。并且用于多用户环境占用大量资源。然后设计了一个新的算法:

      这个cron使用的算法如下:

      1) 启动时,在所有帐户持有人的主目录中查找名为 .crontab 的文件。 2) 对于找到的每个 crontab 文件,确定每个命令必须运行的下一次。 3) 将这些命令与它们的相应时间和它们的“五场”时间说明符一起放在 Franta-Maly 事件列表中。 4)进入主循环:

      1. 检查队列头部的任务条目,计算距离 它必须运行的未来。
      2. 睡那段时间。
      3. 在唤醒并验证正确时间后,以创建它的用户的权限执行队列头部的任务(在后台)。
      4. 确定未来下次运行此命令的时间,并将其放回该时间值的事件列表中。

      现代实现是 vixiecron 和 anacron。这已被 fcron 取代。我对它们的实现细节没有太多了解。

      【讨论】:

        【解决方案4】:

        这个问题的目的不是关于 CRON,而是一般以 cron 为例的任务调度,如果问题陈述中没有明确说明,请见谅。

        我想知道最低级别的软件是如何进行基于时间的调度的,它是否必须轮询硬件时钟,或者是否存在某种基于时间的事件的硬件中断。

        事实证明实际上存在硬件中断。来自*:

        一个典型的用途是通过划分周期性地产生中断 晶体振荡器的输出并具有中断处理程序计数 中断以保持时间。这些周期性中断是 经常被操作系统的任务调度器用来重新调度优先级 运行进程。一些较旧的计算机会产生周期性中断 从电源线频率,因为它是由控制 消除电子钟长期漂移的实用程序。

        http://en.wikipedia.org/wiki/Interrupt

        所以,虽然 cron 会进行轮询(感谢 @joshua-nelson),但也有可能不这样做,操作系统也不会。

        【讨论】:

          【解决方案5】:

          守护进程是运行后台进程的程序。和 Cron 是执行预定命令的守护进程。并获得这些命令 Cron 查看 /etc/crontab 或 /usr/lib/cron/tabs 中的文件和 如果那里存在任何命令文件,则 Cron 会执行该文件。克朗 实用程序由已启动的进程启动,该进程将 init 替换为 PID 1。

          【讨论】: