手机系统闹钟是怎么实现的? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
1oNflow
V2EX    问与答

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

  •  
  •   1oNflow 2017-11-03 13:15:48 +08:00 via iPhone 3702 次点击
    这是一个创建于 2975 天前的主题,其中的信息可能已经有所发展或是发生改变。
    难道是每分钟都要把当前时间和闹钟列表对比一下吗?桌面有动画的,每秒都要查询一下时间更新图标?直观感觉性能不会很好吧。
    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     Solana     860 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 21:45 PVG 05:45 LAX 13:45 JFK 16:45
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86