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

手机系统闹钟是怎么实现的?

  •  
  •   1oNflow · 2017-11-03 13:15:48 +08:00 via iPhone · 3155 次点击
    这是一个创建于 2566 天前的主题,其中的信息可能已经有所发展或是发生改变。
    难道是每分钟都要把当前时间和闹钟列表对比一下吗?桌面有动画的,每秒都要查询一下时间更新图标?直观感觉性能不会很好吧。
    20 条回复    2017-11-03 22:46:11 +08:00
    wxyz
        1
    wxyz  
       2017-11-03 16:26:29 +08:00
    猜测应该有时钟中断,在设置的时间点触发回调。
    coderluan
        2
    coderluan  
       2017-11-03 16:49:20 +08:00   ❤️ 2
    最底层有个硬件叫 PIT ( Programmable Interval Timer ),操作系统会根据这个实现好闹钟之类的实现,比如 android 下的 AlarmManager 类,开发者只需要调用这个类就行了。所以你的问题是操作系统开发者要考虑的,应用开发者不用关心。
    zhujinliang
        3
    zhujinliang  
       2017-11-03 16:54:23 +08:00 via iPhone
    每秒钟才一次,有啥性能问题……
    wingoo
        4
    wingoo  
       2017-11-03 17:03:18 +08:00   ❤️ 1
    lz 知道屏幕的刷新频率 60Hz 是啥意思不?
    coolcoffee
        5
    coolcoffee  
       2017-11-03 17:06:05 +08:00   ❤️ 1
    html5 的 canvas 写东西,大部分都是实时刷新,也就是每秒钟都要把所有元素重绘 60 次, 楼主会不会觉得 cpu 都要炸了?
    ytpfxnj
        6
    ytpfxnj  
       2017-11-03 17:08:05 +08:00
    ```
    /**
    * @return the total amount of time remaining up to this moment; expired timers will return a
    * negative amount
    */
    public long getRemainingTime() {
    if (mState == RUNNING || mState == EXPIRED) {
    return mRemainingTime - (now() - mLastStartTime);
    }

    return mRemainingTime;
    }
    ```

    可以去參考下源代碼,看看怎麼實現的 lineage/packages/apps/DeskClock/src/com/android/deskclock/data/Timer.java
    Icezers
        7
    Icezers  
       2017-11-03 17:15:47 +08:00   ❤️ 1
    Android 手机时刻是有系统广播的,监听就行了, 定时闹钟是向系统注册一个事件,到时间系统广播给你(5.0 以上只有系统签名的 app 可以申请,非系统签名 app 无法在被关闭状态收到广播)
    SourceMan
        8
    SourceMan  
       2017-11-03 17:29:48 +08:00
    过度优化、过度考虑
    xs
        9
    xs  
       2017-11-03 18:35:29 +08:00
    @zhujinliang 这是手机,性能差一倍,待机时长减少将近一半
    234235
        10
    234235  
       2017-11-03 19:05:38 +08:00   ❤️ 2
    如何实现的:
    手机 CPU 中有一个子模块 RTC (Real-Time Clock),这个模块能够存储当前日期与 1970-1-1 的差值,并每秒自动加 1。
    OS Kernel 中有函数负责配置此值,同时能够定时读取,读取之后当然就传给 OS 中负责 Time 的模块来处理了。

    前台时钟如何刷新:
    这个当然因软件而异了,不过就算是每秒查询 2 次,也是完全不会对性能有影响的。同时也像上面说的一样,现在都是注册事件调用 CallBack 的方式,查询量就更小了。
    loading
        11
    loading  
       2017-11-03 19:06:50 +08:00 via Android
    难道单独设置闹钟芯片?
    zhujinliang
        12
    zhujinliang  
       2017-11-03 20:46:20 +08:00 via iPhone
    @xs 还是一样,1 秒进行一次的操作,假设消耗 1ms CPU time,与 2ms CPU time 差别大么?将 2ms 优化到 1ms,只提高了千分之一性能。
    如果判断是否到闹钟时间需要 500ms,我觉得你先赶紧优化判断逻辑,而不是纠结是主动查询时间还是等系统回调。
    redsonic
        13
    redsonic  
       2017-11-03 20:54:23 +08:00
    @wxyz

    http://blog.csdn.net/anonymalias/article/details/52022787

    参考 2.6.16 那段高分辨率的情况。android 框架层没有仔细看过代码不多说,但 android 底层都是调用 posix 函数,最后还是 linux 内核干那些事。
    简单说就是内核维护一个 RB-tree,把注册的定时器放进去,然后由硬件时钟源触发中断来运行一段极为高效的代码来操作这个 RB-tree,主要就是激活 callback 和 RB-tree 再排序。

    可以理解为有闹钟芯片,还不止一个,且有的定时间隔可设为纳秒。但操作系统只会选择一个来用,不管你挂了多少定时器(有哪些程序 call 了多少次 api ),最后都是这一个芯片触发(按照排好序的 RB-tree )。
    redsonic
        14
    redsonic  
       2017-11-03 20:54:44 +08:00
    lightening
        15
    lightening  
       2017-11-03 20:55:10 +08:00
    @xs 就算查个时间占 1000 个 CPU 时钟,以现代手机 1GHz 的 CPU 来说,也才占用手机一百万分之一的性能。如果时钟逻辑性能变差了一倍……嗯,手机续航会减少一百万分之一……
    redsonic
        16
    redsonic  
       2017-11-03 21:05:03 +08:00
    @lightening @xs

    曾经有个比喻, 人类感知的 1 秒在 cpu 看来像是过年。
    goodan
        17
    goodan  
       2017-11-03 21:09:15 +08:00   ❤️ 1
    感觉 lz 想知道的是赫兹 hz,晶振这些概念
    ys0290
        18
    ys0290  
       2017-11-03 21:36:29 +08:00 via iPhone
    以前在虚拟主机玩儿 wordpress 的时候,有一个插件定时备份数据,有一天发现博客无法访问,问客服,客服说是我那个定时插件把主机搞崩了,是不是在骗我?
    1oNflow
        19
    1oNflow  
    OP
       2017-11-03 21:49:12 +08:00 via iPhone
    @redsonic 提供的文章很不错,我的疑惑主要是,闹钟触发是未来的一个时间点,程序要准时响铃就要以最大精度知道当前的时间,我一开始想到的就是不停查询时间,看来 Linux 实现比想象中复杂。
    redsonic
        20
    redsonic  
       2017-11-03 22:46:11 +08:00
    @1oNflow 时间,内核里面叫 jiffies,不是到用的时候才查,而是随时放在内存里的变量。jiffies 不是具体的时分秒,而是内核初始化到目前的时间偏移,精度是毫秒。当前时间就是内核初始化时电池驱动的那个表( RTC )时刻 加上 jiffies。除了初始化或关机那会儿,那个 RTC 几乎不会被任何应用程序和内核访问。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5867 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 02:36 · PVG 10:36 · LAX 18:36 · JFK 21:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.