考考大家: Android 的 MessageQueue 为什么要使用 epoll?

2021-10-07 12:09:42 +08:00
 narutow

分几个小问题来讨论:

  1. MessageQueue 为什么不直接使用 wait/notify? 它同样提供了超时, 唤醒等功能.
  2. Android 6.0 后为什么不再使用 epoll+管道的组合, 而使用 epoll+eventfd 了?
  3. 为什么用 epoll 实现, epoll 不是在 fd 多但活跃 fd 少的场景好用吗? 而消息队列只轮询了一个 eventfd, 用 select 不是更好吗?
6011 次点击
所在节点    Android
8 条回复
mattx
2021-10-07 12:21:06 +08:00
+1
billlee
2021-10-07 12:58:36 +08:00
只用来做 wait/notify 功能时,eventfd 的开销比 pipe 小。至于 select, 由于它只支持小于 1024 的 fd, 在任何比较复杂,fd 范围不可控的程序中,都不应该使用。
zpxshl
2021-10-07 14:36:23 +08:00
问题 1,2 2 楼回答了。
问题 3 消息队列只轮训一个 fd 吗? 你可以想想 touch 事件最终怎么分发给应用层的。
zpxshl
2021-10-07 14:40:27 +08:00
再反问一句,即使是单 fd 监听,select 就比 epoll 好吗?
hzyang
2021-10-07 17:50:24 +08:00
插👀
feiniu
2021-10-08 09:55:40 +08:00
等大佬回答
mail2dechao
2021-10-08 09:59:16 +08:00
👀
BrokenVns
2021-10-08 17:09:58 +08:00
MessageQueue 并不是只轮询了 eventfd,MessageQueue 的 Native 实现还能额外监听 16 (没记错的话)个 FD,而且这 16 个事件 FD 的处理优先级比消息队列里的消息更高。要我说原本就是设计了一个多路复用的事件处理器,并使用其中一路实现了消息队列功能。这种设计在很多开源库里都能看到。既然 Native 已经实现了一个好用的组件,那么 Java 层的 MessageQueue 通过 JNI 复用这些功能也是合情合理的。MessageQueue 整个组件的功能并不止应用开发者用到的那点,系统服务比如 surfaceflinger 就需要监听额外的事件。

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

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

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

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

© 2021 V2EX