V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Sponsored by
LinkedIn
2000 个不用坐班的远程好工作在召唤你 · 弹性上班不打卡,工作和生活都能拥有
2000 个不用坐班的全球远程工作,帮助 V2EX 的小伙伴开启全新的工作方式。
Promoted by LinkedIn
narutow
V2EX  ›  Android

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

  •  1
     
  •   narutow · 353 天前 · 2821 次点击
    这是一个创建于 353 天前的主题,其中的信息可能已经有所发展或是发生改变。

    分几个小问题来讨论:

    1. MessageQueue 为什么不直接使用 wait/notify? 它同样提供了超时, 唤醒等功能.
    2. Android 6.0 后为什么不再使用 epoll+管道的组合, 而使用 epoll+eventfd 了?
    3. 为什么用 epoll 实现, epoll 不是在 fd 多但活跃 fd 少的场景好用吗? 而消息队列只轮询了一个 eventfd, 用 select 不是更好吗?
    8 条回复    2021-10-08 17:09:58 +08:00
    mattx
        1
    mattx  
       353 天前 via iPhone
    +1
    billlee
        2
    billlee  
       353 天前
    只用来做 wait/notify 功能时,eventfd 的开销比 pipe 小。至于 select, 由于它只支持小于 1024 的 fd, 在任何比较复杂,fd 范围不可控的程序中,都不应该使用。
    zpxshl
        3
    zpxshl  
       352 天前 via Android
    问题 1,2 2 楼回答了。
    问题 3 消息队列只轮训一个 fd 吗? 你可以想想 touch 事件最终怎么分发给应用层的。
    zpxshl
        4
    zpxshl  
       352 天前 via Android
    再反问一句,即使是单 fd 监听,select 就比 epoll 好吗?
    hzyang
        5
    hzyang  
       352 天前
    插👀
    feiniu
        6
    feiniu  
       352 天前
    等大佬回答
    mail2dechao
        7
    mail2dechao  
       352 天前
    👀
    BrokenVns
        8
    BrokenVns  
       351 天前
    MessageQueue 并不是只轮询了 eventfd,MessageQueue 的 Native 实现还能额外监听 16 (没记错的话)个 FD,而且这 16 个事件 FD 的处理优先级比消息队列里的消息更高。要我说原本就是设计了一个多路复用的事件处理器,并使用其中一路实现了消息队列功能。这种设计在很多开源库里都能看到。既然 Native 已经实现了一个好用的组件,那么 Java 层的 MessageQueue 通过 JNI 复用这些功能也是合情合理的。MessageQueue 整个组件的功能并不止应用开发者用到的那点,系统服务比如 surfaceflinger 就需要监听额外的事件。
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2360 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 52ms · UTC 05:26 · PVG 13:26 · LAX 22:26 · JFK 01:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.