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

2017-11-03 13:15:48 +08:00
 1oNflow
难道是每分钟都要把当前时间和闹钟列表对比一下吗?桌面有动画的,每秒都要查询一下时间更新图标?直观感觉性能不会很好吧。
3201 次点击
所在节点    问与答
20 条回复
wxyz
2017-11-03 16:26:29 +08:00
猜测应该有时钟中断,在设置的时间点触发回调。
coderluan
2017-11-03 16:49:20 +08:00
最底层有个硬件叫 PIT ( Programmable Interval Timer ),操作系统会根据这个实现好闹钟之类的实现,比如 android 下的 AlarmManager 类,开发者只需要调用这个类就行了。所以你的问题是操作系统开发者要考虑的,应用开发者不用关心。
zhujinliang
2017-11-03 16:54:23 +08:00
每秒钟才一次,有啥性能问题……
wingoo
2017-11-03 17:03:18 +08:00
lz 知道屏幕的刷新频率 60Hz 是啥意思不?
coolcoffee
2017-11-03 17:06:05 +08:00
html5 的 canvas 写东西,大部分都是实时刷新,也就是每秒钟都要把所有元素重绘 60 次, 楼主会不会觉得 cpu 都要炸了?
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
2017-11-03 17:15:47 +08:00
Android 手机时刻是有系统广播的,监听就行了, 定时闹钟是向系统注册一个事件,到时间系统广播给你(5.0 以上只有系统签名的 app 可以申请,非系统签名 app 无法在被关闭状态收到广播)
SourceMan
2017-11-03 17:29:48 +08:00
过度优化、过度考虑
xs
2017-11-03 18:35:29 +08:00
@zhujinliang 这是手机,性能差一倍,待机时长减少将近一半
234235
2017-11-03 19:05:38 +08:00
如何实现的:
手机 CPU 中有一个子模块 RTC (Real-Time Clock),这个模块能够存储当前日期与 1970-1-1 的差值,并每秒自动加 1。
OS Kernel 中有函数负责配置此值,同时能够定时读取,读取之后当然就传给 OS 中负责 Time 的模块来处理了。

前台时钟如何刷新:
这个当然因软件而异了,不过就算是每秒查询 2 次,也是完全不会对性能有影响的。同时也像上面说的一样,现在都是注册事件调用 CallBack 的方式,查询量就更小了。
loading
2017-11-03 19:06:50 +08:00
难道单独设置闹钟芯片?
zhujinliang
2017-11-03 20:46:20 +08:00
@xs 还是一样,1 秒进行一次的操作,假设消耗 1ms CPU time,与 2ms CPU time 差别大么?将 2ms 优化到 1ms,只提高了千分之一性能。
如果判断是否到闹钟时间需要 500ms,我觉得你先赶紧优化判断逻辑,而不是纠结是主动查询时间还是等系统回调。
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
2017-11-03 20:54:44 +08:00
lightening
2017-11-03 20:55:10 +08:00
@xs 就算查个时间占 1000 个 CPU 时钟,以现代手机 1GHz 的 CPU 来说,也才占用手机一百万分之一的性能。如果时钟逻辑性能变差了一倍……嗯,手机续航会减少一百万分之一……
redsonic
2017-11-03 21:05:03 +08:00
@lightening @xs

曾经有个比喻, 人类感知的 1 秒在 cpu 看来像是过年。
goodan
2017-11-03 21:09:15 +08:00
感觉 lz 想知道的是赫兹 hz,晶振这些概念
ys0290
2017-11-03 21:36:29 +08:00
以前在虚拟主机玩儿 wordpress 的时候,有一个插件定时备份数据,有一天发现博客无法访问,问客服,客服说是我那个定时插件把主机搞崩了,是不是在骗我?
1oNflow
2017-11-03 21:49:12 +08:00
@redsonic 提供的文章很不错,我的疑惑主要是,闹钟触发是未来的一个时间点,程序要准时响铃就要以最大精度知道当前的时间,我一开始想到的就是不停查询时间,看来 Linux 实现比想象中复杂。
redsonic
2017-11-03 22:46:11 +08:00
@1oNflow 时间,内核里面叫 jiffies,不是到用的时候才查,而是随时放在内存里的变量。jiffies 不是具体的时分秒,而是内核初始化到目前的时间偏移,精度是毫秒。当前时间就是内核初始化时电池驱动的那个表( RTC )时刻 加上 jiffies。除了初始化或关机那会儿,那个 RTC 几乎不会被任何应用程序和内核访问。

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

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

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

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

© 2021 V2EX