【问题标题】:Could we build sth similar to Java NIO from Java IO? [closed]我们可以从 Java IO 构建类似于 Java NIO 的东西吗? [关闭]
【发布时间】:2018-04-25 17:06:20
【问题描述】:

我看到Java NIO 相当复杂。我们能不能从 Java IO 中创造出达到 Java NIO 目的的东西?

我认为很容易实现面向缓冲区和非阻塞 IO——Java NIO 的两个主要特性。我们可以将数据从流中读取到缓冲区中,而不是立即处理它们。关于非阻塞 IO,我们可以使用 Java IO 的 setSoTimeout 方法让线程在一定时间(例如 100ms)后放弃等待。基于此,我们可以创建一个处理多个连接的线程。

如果像上面那样简单,Java NIO 是不是多余的?

【问题讨论】:

  • 没有。 100mS 和零,甚至 1mS 和零之间有很大的区别。您无法通过读取超时有效地实现select()
  • 好吧,我放弃,什么是“sth”?
  • 我想知道Java NIO如何识别通道中的数据是否可用?不是要等待一段时间的数据吗?
  • @PeterPhan 否。它调用select(2)poll() 变体之一。
  • “我认为这很容易”:每个人想到简单的解决方案来解决他们不完全理解的问题的著名第一句话。

标签: java io network-programming netty nio


【解决方案1】:

乍一看,您提出的解决方案似乎可行。然而,这只是一个模拟,永远不可能像实际的 NIO 实现那样高效。

这样做的原因是 NIO 的工作方式与 Java IO 本质上不同。这个“高级”部分需要操作系统的支持。当您只处理少量数据时,10ms 看起来与 60ms 没有太大区别。但正如其他人所说,需要 10 秒而不是 1 分钟的 I/O 会带来不同的结果。

还有其他一些微妙之处。套接字超时与等待数据不同。异步 I/O 不一定要使用很多线程。通常,每个硬件设备一个线程就足够了。不涉及等待。上下文切换更少。尽可能高效地处理数据,包括在可以避免的情况下不将其从一个缓冲区复制到另一个缓冲区。最后,这一切都加起来了。

【讨论】:

  • 你能解释更多关于操作系统支持的信息吗?它们是什么?
  • @PeterPhan 使用普通 IO,您需要每个通道有 1 个线程,以确保您有最小的延迟。使用 NIO,你给操作系统一个套接字列表,然后它会等待任何一个通道有数据(参见 select(2) 的手册页),然后你可以快速查询每个通道有多少数据,然后才行动在有数据的频道上
  • 哦,又是“select(2)”。它是一个java方法吗?我搜索谷歌,但没有找到相关性
  • 总体思路是将 I/O 设备视为自治设备。例如,您向磁盘发出命令,将一系列扇区直接读取到内存中,然后不理会它。完成后,磁盘将设置一个中断标志,以便 CPU 知道它需要服务。这是通过使用选择器(一种检查状态的机制)、缓冲区(物理内存区域的包装器)和通道(能够读取/写入数据的设备的抽象)来实现的。在幕后,这使用了中断和 DMA 等硬件功能。操作系统提供硬件抽象,而 Java NIO 提供操作系统抽象。
猜你喜欢
  • 2021-11-08
  • 1970-01-01
  • 2011-01-01
  • 2015-11-03
  • 2011-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多