V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Sunkz
V2EX  ›  问与答

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

  •  
  •   Sunkz · 2020-04-02 16:30:14 +08:00 · 4090 次点击
    这是一个创建于 1695 天前的主题,其中的信息可能已经有所发展或是发生改变。
    第 1 条附言  ·  2020-04-02 17:05:36 +08:00
    不要从技术层面讲, 就从逻辑上 如果不循环拿当前时间与指定时间作比较.......那怎么知道到了指定时间呢😥😥😥
    谁能从逻辑上先通俗易懂的讲一下啊😅
    24 条回复    2020-04-03 12:34:20 +08:00
    Sunkz
        1
    Sunkz  
    OP
       2020-04-02 16:32:13 +08:00
    不停地判断?????
    if(currTime==givenTime){
    }
    cissoid
        2
    cissoid  
       2020-04-02 16:42:34 +08:00
    用小顶堆维护任务下次执行时间, 每次 sleep 距离执行堆顶任务的时间就行了
    Hstar
        3
    Hstar  
       2020-04-02 16:48:07 +08:00
    考虑机器启停,或者定时任务触发器被挂起暂停这种情况,我觉得轮询是最优的办法了,具体优化细节就是开几个轮询器、每次轮询间隔以及如何触发
    fancy111
        4
    fancy111  
       2020-04-02 16:58:28 +08:00
    不一定啊,可以基于时钟。
    Mohanson
        5
    Mohanson  
       2020-04-02 17:19:44 +08:00 via Android   ❤️ 7
    如果你没有使用轮询而能获知了一个事件发生,是因为有别人在你看不到的地方帮你做了轮询。

    比如 cpu 中断。
    whypool
        6
    whypool  
       2020-04-02 17:20:02 +08:00
    这样说也没毛病
    Morge
        7
    Morge  
       2020-04-02 18:28:10 +08:00 via Android
    linux 下,使用 timerfd_* 系列函数,把时间变成文件描述符,这样可以很好的与 select/poll/epoll 结合在一起。
    dallaslu
        8
    dallaslu  
       2020-04-02 18:30:46 +08:00   ❤️ 12
    哪有什么岁月静好,不过是有人替你不断轮询。
    nl101531
        9
    nl101531  
       2020-04-02 18:43:12 +08:00 via iPhone
    目前发现都是这样的
    tigerstudent
        10
    tigerstudent  
       2020-04-02 20:05:48 +08:00 via Android
    算出下一个要执行的任务,一觉 sleep 到那个时间点就好了
    printese
        11
    printese  
       2020-04-02 20:18:31 +08:00 via iPhone
    如果真的深入到最低层,那应该是定时器才对,先设置一下定时器的初始数值,然后使能定时器,定时时间到了就通过中断通知 cpu,然后 cpu 去执行定时任务
    billlee
        12
    billlee  
       2020-04-02 21:32:01 +08:00
    说一定要轮询的都没学过电路吧
    Sunkz
        13
    Sunkz  
    OP
       2020-04-02 23:08:32 +08:00
    @tigerstudent
    @printese
    关键是怎么知道时间到了呢, 如果不循环判断当前时间是否等于指定时间, 怎么才能知道到时间了呢
    tairan2006
        14
    tairan2006  
       2020-04-02 23:42:24 +08:00 via Android
    硬件定时器不是轮询哦,脉冲计数即可。
    Ediacaran
        15
    Ediacaran  
       2020-04-02 23:44:08 +08:00
    定时中断
    ZZSZZSZZS
        16
    ZZSZZSZZS  
       2020-04-02 23:51:00 +08:00 via iPhone
    @Sunkz 有硬件电路可以实现,各种定时器触发器等
    ZZSZZSZZS
        17
    ZZSZZSZZS  
       2020-04-02 23:57:15 +08:00 via iPhone   ❤️ 1
    从逻辑上来说硬件定时器也是哪当前时间和指定时间做比较来实现的,当硬件计时器计到指定时间之后就会触发 cpu 的中断从而告诉 cpu 时间到了。由于有专用硬件处理定时任务,所以不会占用 cpu 时间。当然你也可以理解为定时器通过轮询实现的。
    dremy
        18
    dremy  
       2020-04-03 01:31:19 +08:00 via iPhone
    就是不知道定时器是否会因 CPU 的长时间高负载而不准确,不可靠,所以就自己去轮询了…
    lzyliangzheyu
        19
    lzyliangzheyu  
       2020-04-03 01:36:02 +08:00 via Android
    @dremy 硬件定时器工作时序不是由晶振决定的吗
    lzyliangzheyu
        20
    lzyliangzheyu  
       2020-04-03 01:40:55 +08:00 via Android
    @Sunkz 定时器寄存器溢出触发
    ZZSZZSZZS
        21
    ZZSZZSZZS  
       2020-04-03 08:24:08 +08:00 via iPhone
    @dremy 不会,这是有硬件专门完成的,定时器其实就是脉冲计数器,用来计数的脉冲由 rc 振荡器或者更高精度的晶体振荡器产生,这些东西产生的脉冲频率都是恒定的,和 cpu 负载没有关系,而且一般还有 PLL 锁相环 FLL 锁频环电路等进一步修正频率
    aguesuka
        22
    aguesuka  
       2020-04-03 10:29:18 +08:00 via Android
    @Sunkz 模电有一章专门说这个
    aguesuka
        23
    aguesuka  
       2020-04-03 10:33:55 +08:00 via Android
    数电里的 jk 触发器加上一个电容就是最简单的定时器
    printese
        24
    printese  
       2020-04-03 12:34:20 +08:00 via iPhone
    楼已经歪了,从软件歪到了底层硬件电路...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2556 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 04:58 · PVG 12:58 · LAX 20:58 · JFK 23:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.