Java阻塞IO—写操作有什么优势吗?

Java阻塞IO—写操作有什么优势吗?,java,tcp,io,nio,nonblocking,Java,Tcp,Io,Nio,Nonblocking,在Java的阻塞IO中,APIaccept()阻塞直到连接可用,read()阻塞直到输入可用 但是,write()是否也会为不同的阻塞IOOutputStreams进行阻塞? 那么write()在FileOutputStream和SocketOutputStream(TCP)类中阻塞多长时间呢 编辑:或者更一般地问:非阻塞IO对写操作有什么好处吗 但是,write()是否也会为不同的阻塞IOOutputStreams进行阻塞?那么write()在FileOutputStream和SocketOu

在Java的阻塞IO中,API
accept()
阻塞直到连接可用,
read()
阻塞直到输入可用

但是,
write()
是否也会为不同的阻塞IO
OutputStreams
进行阻塞? 那么
write()
FileOutputStream
SocketOutputStream
(TCP)类中阻塞多长时间呢

编辑:或者更一般地问:非阻塞IO对写操作有什么好处吗

但是,
write()
是否也会为不同的阻塞IO
OutputStreams
进行阻塞?那么write()在
FileOutputStream
SocketOutputStream
(TCP)类中阻塞多长时间呢

它会一直阻塞,直到您请求写入的所有数据都交付到操作系统。这方面没有理论上的上限。不同类型的流类之间没有理论上的差异

实际上,阻塞时间的长短取决于数据传输的速度。写入本地文件通常是最快的。任何涉及网络的事情都取决于网络(和NIC)带宽、延迟和拥塞。(这包括使用文件流向本地安装的远程文件系统读/写文件的情况。)



这是否意味着阻塞写入与非阻塞写入的性能没有任何改进?如果有的话,是什么

不,这并不意味着。。。确切地潜在的性能改进不是直接的

如果你有很多正在阅读和/或写作的连接,那么性能就会得到提高

  • 使用阻塞I/O时,每个连接实际上需要一个线程。每个线程都有与其相关的重要资源(例如线程堆栈内存),并且每当您进行线程上下文切换时都会有开销。拥有大量线程通常也会增加其他事情,如锁争用、堆空间使用、GC开销、虚拟内存占用、分页活动

  • 使用非阻塞I/O(和选择器),您可以使用一个线程为多个连接提供服务,可以直接使用,也可以通过队列将工作传递给工作线程


非阻塞IO对写操作有什么好处吗

正确使用非阻塞I/O允许您以更少的资源支持更多的并发客户端。但是对于单个连接/客户机,使用非阻塞I/O不会加快速度

但是,
write()
是否也会为不同的阻塞IO
OutputStreams
进行阻塞?那么write()在
FileOutputStream
SocketOutputStream
(TCP)类中阻塞多长时间呢

它会一直阻塞,直到您请求写入的所有数据都交付到操作系统。这方面没有理论上的上限。不同类型的流类之间没有理论上的差异

实际上,阻塞时间的长短取决于数据传输的速度。写入本地文件通常是最快的。任何涉及网络的事情都取决于网络(和NIC)带宽、延迟和拥塞。(这包括使用文件流向本地安装的远程文件系统读/写文件的情况。)



这是否意味着阻塞写入与非阻塞写入的性能没有任何改进?如果有的话,是什么

不,这并不意味着。。。确切地潜在的性能改进不是直接的

如果你有很多正在阅读和/或写作的连接,那么性能就会得到提高

  • 使用阻塞I/O时,每个连接实际上需要一个线程。每个线程都有与其相关的重要资源(例如线程堆栈内存),并且每当您进行线程上下文切换时都会有开销。拥有大量线程通常也会增加其他事情,如锁争用、堆空间使用、GC开销、虚拟内存占用、分页活动

  • 使用非阻塞I/O(和选择器),您可以使用一个线程为多个连接提供服务,可以直接使用,也可以通过队列将工作传递给工作线程


非阻塞IO对写操作有什么好处吗


正确使用非阻塞I/O允许您以更少的资源支持更多的并发客户端。但是对于单个连接/客户端,使用非阻塞I/O不会加速。

只要有效负载被写入。@ElliottFrisch您能在回答中解释一下TCP和文件的这一点吗?TCP输出流是否等待接收器确认数据包?TCP和文件不是一回事。你为什么期望他们也这样做?在大多数情况下,差异被抽象掉了;但我相信实际的底层实现是在本机代码中完成的,因此很难真正回答。当操作系统级别的缓冲区已满且无法接受更多数据时,对套接字的写入将被阻塞(例如,因为它无法将数据传输到另一端)。但就这些,真的。不——那将是一个巨大的性能损失!由操作系统来处理这些事情,而且它通常做得很好(而且,现代文件系统非常快速和安全)。但是,您可以在同步数据模式下打开文件,但只能使用java.nio.file(请参见
StandardOpenOption.SYNC
StandardOpenOption.DSYNC
)打开文件。只要有效负载需要写入。@ElliottFrisch您能在回答中解释一下TCP和文件的情况吗?TCP输出流是否等待接收器确认数据包?TCP和文件不是一回事。你为什么期望他们也这样做?在大多数情况下,差异被抽象掉了;但我相信,真正的潜在implem