V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Frankhong
V2EX  ›  Java

Java NIO 和 IO 多路复用中 select 的区别

  •  
  •   Frankhong · 2021-05-09 23:21:12 +08:00 · 2238 次点击
    这是一个创建于 1054 天前的主题,其中的信息可能已经有所发展或是发生改变。
    小白求问,NIO 和 IO 多路复用中的 select 貌似都是单线程轮询,这两者有什么区别啊?
    7 条回复    2021-06-22 02:02:20 +08:00
    546L5LiK6ZOt
        1
    546L5LiK6ZOt  
       2021-05-10 00:51:30 +08:00 via Android
    select 底层实现不一定是轮询。我记得 linux 下是基于 epoll:网卡收到数据包,会触发中断,操作系统会唤醒监听这个端口的线程。
    wellsc
        2
    wellsc  
       2021-05-10 03:25:37 +08:00 via iPhone
    @546L5LiK6ZOt epoll 是基于 select 优化的呀,两个都是多路复用的实现
    uselessVisitor
        3
    uselessVisitor  
       2021-05-10 08:38:30 +08:00
    啊? NIO 不是用的 IO 多路复用模型吗。。不一样吗。。
    zardly666
        4
    zardly666  
       2021-05-10 09:04:43 +08:00
    多路复用的优化是 select --> poll --> epoll

    select,poll 实现需要自己不断轮询所有 fd 集合
    epoll 会直接把就绪的 fd 放进链表,只需要轮询就绪链表。
    Frankhong
        5
    Frankhong  
    OP
       2021-05-10 11:17:53 +08:00
    NIO 和多路复用 IO 到底是什么关系啊,我感觉是 NIO 里用到了多路复用技术。但我查到资料都说有 5 种 IO 模型:阻塞式 IO,非阻塞式 IO,多路复用 IO,信号驱动式 IO 和异步 IO 。这里的“非阻塞式 IO(Non-blocking IO)”是不是不等同于 NIO 啊?
    araraloren
        6
    araraloren  
       2021-05-10 11:48:21 +08:00
    @Frankhong NIO 只是一个名字,他叫 JIO 也没什么关系。。
    linoder
        7
    linoder  
       2021-06-22 02:02:20 +08:00 via Android
    你理解的没错 只是三者区别在于 这个一直跑的线程如何快速感知到对应文件描述符就绪也就是你端口有数据 select poll epoll 就是调度这些借口的茴字几种写法

    至于多路复用 先理解不多路时候怎么做 一个接口一个线程 没毛病 线程多了又浪费又耗资原 那就一个线程管理多个借口 就多路复用了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1136 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 22:57 · PVG 06:57 · LAX 15:57 · JFK 18:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.