BIO
同时处理一个连接,要管理多个并发客户端,需要为每个新的客户端
Socket 创建一个新的 Thread,如图 1-1 所示。
让我们考虑一下这种方案的影响。第一,在任何
时候都可能有大量的线程处于休眠状态,只是等待输
入或者输出数据就绪,这可能算是一种资源浪费。第
二,需要为每个线程的调用栈都分配内存,其默认值
大小区间为 64 KB 到 1 MB,具体取决于操作系统。第
三,即使 Java 虚拟机(JVM)在物理上可以支持非常
大数量的线程,但是远在到达该极限之前,上下文切换所带来的开销就会带来麻烦,例如,在达
到 10 000 个连接的时候。
虽然这种并发方案对于支撑中小数量的客户端来说还算可以接受,但是为了支撑 100 000 或
者更多的并发连接所需要的资源使得它很不理想
图下所示
NIO
展示了一个非阻塞设计,其实际上消除了
BIO中所描述的那些弊端。
class java.nio.channels.Selector 是
Java 的非阻塞 I/O 实现的关键。它使用了事件通知 API
以确定在一组非阻塞套接字中有哪些已经就绪能够进
行 I/O 相关的操作。因为可以在任何的时间检查任意
的读操作或者写操作的完成状态,所以如图下加粗样式 所示,
一个单一的线程便可以处理多个并发的连接。
总体来看,与阻塞 I/O 模型相比,这种模型提供
了更好的资源管理:
使用较少的线程便可以处理许多连接,因此也减少了内存管理和上下文切换所带来开销;
当没有 I/O 操作需要处理的时候,线程也可以被用于其他任务。
尽管已经有许多直接使用 Java NIO API 的应用程序被构建了,但是要做到如此正确和安全并
不容易。特别是,在高负载下可靠和高效地处理和调度 I/O 操作是一项繁琐而且容易出错的任务,
最好留给高性能的网络编程专家——Netty。
图下所示
Netty
优势
BIO NIO 和Netty
最新推荐文章于 2025-03-22 21:28:05 发布