在Java中阻止IO API accept()
阻塞,直到连接可用并且read()
阻塞,直到输入可用。
但write()
是否也阻止了不同的阻止IO OutputStreams
?
那么write()
在FileOutputStream
和SocketOutputStream
(TCP)类中会阻塞多长时间?
编辑:或者更广泛地问:非阻塞IO对写操作有什么好处吗?
答案 0 :(得分:4)
但
write()
是否也阻止了不同的阻止IOOutputStreams
?那么write()在FileOutputStream
和SocketOutputStream
(TCP)类中阻塞了多长时间?
它会阻塞,直到您要求写入的所有数据都传送到操作系统。这没有理论上限。不同类型的流类之间没有理论上的差异。
实际上,阻止的时间长度取决于数据传输的速度。写入本地文件通常是最快的。涉及网络的任何事情都取决于网络(和NIC)带宽,延迟和拥塞。 (包括使用文件流将文件读/写到本地安装的远程文件系统的情况。)
这是否意味着阻塞与非阻塞写入没有性能提升?如果有的话,他们是什么?
不,它并不意味着......确切地说。 潜在的性能改进不是直接的。
如果您有很多正在阅读和/或写作的联系,那么绩效就会提高。
使用阻塞I / O,您实际上每个连接需要一个线程,每个线程都有与之关联的重要资源(例如线程堆栈内存),并且每当您进行线程上下文切换时都会产生开销。拥有大量线程通常也会增加其他因素,例如锁争用,堆空间使用,GC开销,虚拟内存占用,分页活动。
使用非阻塞I / O(和选择器),您可以使用一个线程直接为多个连接提供服务,也可以通过队列将工作传递给工作线程。
非阻塞IO对写操作有什么好处吗?
正确使用非阻塞I / O 允许您以更少的资源支持更多并发客户端。但是对于单个连接/客户端,使用非阻塞I / O没有加速。