定时任务追溯到最底层都是"轮询"实现的吗🤔

2020-04-02 16:30:14 +08:00
 Sunkz
4119 次点击
所在节点    问与答
24 条回复
Sunkz
2020-04-02 16:32:13 +08:00
不停地判断?????
if(currTime==givenTime){
}
cissoid
2020-04-02 16:42:34 +08:00
用小顶堆维护任务下次执行时间, 每次 sleep 距离执行堆顶任务的时间就行了
Hstar
2020-04-02 16:48:07 +08:00
考虑机器启停,或者定时任务触发器被挂起暂停这种情况,我觉得轮询是最优的办法了,具体优化细节就是开几个轮询器、每次轮询间隔以及如何触发
fancy111
2020-04-02 16:58:28 +08:00
不一定啊,可以基于时钟。
Mohanson
2020-04-02 17:19:44 +08:00
如果你没有使用轮询而能获知了一个事件发生,是因为有别人在你看不到的地方帮你做了轮询。

比如 cpu 中断。
whypool
2020-04-02 17:20:02 +08:00
这样说也没毛病
Morge
2020-04-02 18:28:10 +08:00
linux 下,使用 timerfd_* 系列函数,把时间变成文件描述符,这样可以很好的与 select/poll/epoll 结合在一起。
dallaslu
2020-04-02 18:30:46 +08:00
哪有什么岁月静好,不过是有人替你不断轮询。
nl101531
2020-04-02 18:43:12 +08:00
目前发现都是这样的
tigerstudent
2020-04-02 20:05:48 +08:00
算出下一个要执行的任务,一觉 sleep 到那个时间点就好了
printese
2020-04-02 20:18:31 +08:00
如果真的深入到最低层,那应该是定时器才对,先设置一下定时器的初始数值,然后使能定时器,定时时间到了就通过中断通知 cpu,然后 cpu 去执行定时任务
billlee
2020-04-02 21:32:01 +08:00
说一定要轮询的都没学过电路吧
Sunkz
2020-04-02 23:08:32 +08:00
@tigerstudent
@printese
关键是怎么知道时间到了呢, 如果不循环判断当前时间是否等于指定时间, 怎么才能知道到时间了呢
tairan2006
2020-04-02 23:42:24 +08:00
硬件定时器不是轮询哦,脉冲计数即可。
Ediacaran
2020-04-02 23:44:08 +08:00
定时中断
ZZSZZSZZS
2020-04-02 23:51:00 +08:00
@Sunkz 有硬件电路可以实现,各种定时器触发器等
ZZSZZSZZS
2020-04-02 23:57:15 +08:00
从逻辑上来说硬件定时器也是哪当前时间和指定时间做比较来实现的,当硬件计时器计到指定时间之后就会触发 cpu 的中断从而告诉 cpu 时间到了。由于有专用硬件处理定时任务,所以不会占用 cpu 时间。当然你也可以理解为定时器通过轮询实现的。
dremy
2020-04-03 01:31:19 +08:00
就是不知道定时器是否会因 CPU 的长时间高负载而不准确,不可靠,所以就自己去轮询了…
lzyliangzheyu
2020-04-03 01:36:02 +08:00
@dremy 硬件定时器工作时序不是由晶振决定的吗
lzyliangzheyu
2020-04-03 01:40:55 +08:00
@Sunkz 定时器寄存器溢出触发

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/658706

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX