【发布时间】:2014-07-30 11:39:50
【问题描述】:
当一个任务调度程序(例如 cron)触发一个任务(例如 cron 作业)时,它是通过每隔最小周期(例如秒)“轮询”时钟来做到这一点的,还是注册一个回调,当时间到了?
如果是push/callback,底层平台(如linux)是怎么做的?对于基于时间的事件,是否存在“硬件中断”或其他回调机制?
那么,任务调度程序如何触发作业?
【问题讨论】:
标签: cron scheduled-tasks scheduler
当一个任务调度程序(例如 cron)触发一个任务(例如 cron 作业)时,它是通过每隔最小周期(例如秒)“轮询”时钟来做到这一点的,还是注册一个回调,当时间到了?
如果是push/callback,底层平台(如linux)是怎么做的?对于基于时间的事件,是否存在“硬件中断”或其他回调机制?
那么,任务调度程序如何触发作业?
【问题讨论】:
标签: cron scheduled-tasks scheduler
来自手册页:
cron 实用程序每分钟唤醒一次,检查所有存储的 crontab,检查每个命令以查看它是否应该在当前分钟内运行。执行命令时,任何 输出被邮寄给 crontab 的所有者(或者发送给 crontab 中 MAILTO 环境变量中指定的用户,如果存在的话)。
【讨论】:
可能取决于实现。有些做轮询(如上所述),但有些使用中断方法(检查下一个任务何时必须运行并设置系统警报)。
【讨论】:
Unix 7 的 cron 有以下算法:
它的算法很简单:
1) 读取 /usr/etc/crontab 2) 确定是否有任何命令必须在当前日期和时间运行,如果是,则以超级用户 root 身份运行它们。 3)睡一分钟 4) 从第 1 步开始重复。
但这对系统来说很沉重。并且用于多用户环境占用大量资源。然后设计了一个新的算法:
这个cron使用的算法如下:
1) 启动时,在所有帐户持有人的主目录中查找名为 .crontab 的文件。 2) 对于找到的每个 crontab 文件,确定每个命令必须运行的下一次。 3) 将这些命令与它们的相应时间和它们的“五场”时间说明符一起放在 Franta-Maly 事件列表中。 4)进入主循环:
现代实现是 vixiecron 和 anacron。这已被 fcron 取代。我对它们的实现细节没有太多了解。
【讨论】:
这个问题的目的不是关于 CRON,而是一般以 cron 为例的任务调度,如果问题陈述中没有明确说明,请见谅。
我想知道最低级别的软件是如何进行基于时间的调度的,它是否必须轮询硬件时钟,或者是否存在某种基于时间的事件的硬件中断。
事实证明实际上存在硬件中断。来自*:
一个典型的用途是通过划分周期性地产生中断 晶体振荡器的输出并具有中断处理程序计数 中断以保持时间。这些周期性中断是 经常被操作系统的任务调度器用来重新调度优先级 运行进程。一些较旧的计算机会产生周期性中断 从电源线频率,因为它是由控制 消除电子钟长期漂移的实用程序。
http://en.wikipedia.org/wiki/Interrupt
所以,虽然 cron 会进行轮询(感谢 @joshua-nelson),但也有可能不这样做,操作系统也不会。
【讨论】:
守护进程是运行后台进程的程序。和 Cron 是执行预定命令的守护进程。并获得这些命令 Cron 查看 /etc/crontab 或 /usr/lib/cron/tabs 中的文件和 如果那里存在任何命令文件,则 Cron 会执行该文件。克朗 实用程序由已启动的进程启动,该进程将 init 替换为 PID 1。
【讨论】: