首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >任务调度程序如何触发作业?

任务调度程序如何触发作业?
EN

Stack Overflow用户
提问于 2014-06-09 20:37:18
回答 5查看 885关注 0票数 3

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

如果是推送/回调,底层平台(例如linux)是如何做到的?对于基于时间的事件是否存在“硬件中断”或另一种回调机制?

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-06-18 11:00:34

这个问题的目的不是关于CRON,而是一般使用cron作为例子的任务调度,如果这在问题声明中不清楚的话,很抱歉。

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

结果是有一个硬件中断。来自wilipedia:

一个典型的用途是周期性地产生中断,方法是将晶体振荡器的输出除以,并让中断处理程序对中断进行计数以保持时间。操作系统的任务调度程序经常使用这些周期性中断来重新安排运行进程的优先级。一些较老的计算机从电力线频率中产生周期性中断,因为它是由公用设备控制的,以消除电子时钟的长期漂移。

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

所以,尽管cron做了轮询(谢谢@乔舒亚-纳尔逊),它是有可能不做,而操作系统没有。

票数 2
EN

Stack Overflow用户

发布于 2014-06-12 04:08:34

从手册页:

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

票数 8
EN

Stack Overflow用户

发布于 2014-06-18 10:56:17

Unix的cron版本7有以下算法:

它的算法很简单:

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

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

该cron使用的算法如下:

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

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

现代的实现有vixiecron和anacron。这被fcron取代了。我对它们的实现细节没有太多的洞察力。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24128624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档