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

2021-05-09 23:21:12 +08:00
 Frankhong
小白求问,NIO 和 IO 多路复用中的 select 貌似都是单线程轮询,这两者有什么区别啊?
2470 次点击
所在节点    Java
7 条回复
546L5LiK6ZOt
2021-05-10 00:51:30 +08:00
select 底层实现不一定是轮询。我记得 linux 下是基于 epoll:网卡收到数据包,会触发中断,操作系统会唤醒监听这个端口的线程。
wellsc
2021-05-10 03:25:37 +08:00
@546L5LiK6ZOt epoll 是基于 select 优化的呀,两个都是多路复用的实现
uselessVisitor
2021-05-10 08:38:30 +08:00
啊? NIO 不是用的 IO 多路复用模型吗。。不一样吗。。
zardly666
2021-05-10 09:04:43 +08:00
多路复用的优化是 select --> poll --> epoll

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

至于多路复用 先理解不多路时候怎么做 一个接口一个线程 没毛病 线程多了又浪费又耗资原 那就一个线程管理多个借口 就多路复用了

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

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

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

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

© 2021 V2EX