IO模型历经了从BIO到伪异步IO,到NIO,再到AIO这四种IO模型的演变。其中伪异步IO是非官方说法。
BIO即Block Input Output,同步阻塞IO。
BIO通信模型的服务端,通常由一个独立的Acceptor线程负责监听客户端的连接,它接收到客户端连接请求后,为每个客户端创建一个新的线程进行链路处理,处理完成之后,通过输出流返回应答给客户端,线程销毁。
该模型最大的问题就是缺乏弹性伸缩能力,当客户端并发访问量增加后,服务端的线程个数和客户端并发访问数呈1:1的正比关系。因为线程是JVM非常宝贵的系统资源,当线程数膨胀之后,系统的性能将急剧下降,随着并发访问量的继续增大,系统会发生线程堆栈溢出、创建新线程失败等问题,并最终导致进程宕机或僵死,不能对外提供服务。因此很显然,这种模型无法满足高性能、高并发接入的场景。
为了改进一线程一连接的这种模型,演进出了一种通过线程池或消息队列实现一个或多个线程处理N个客户端的模型。由于这种模型的底层通信机制依然使用同步阻塞IO,所以被称为“伪异步”。该模型服务端的线程池最大线程数N,与客户端个数M,形成N:M的比例关系,其中M可以远远大于N。通过线程池可以灵活地调配线程资源,设置线程的最大值,防止由于海量并发接入而导致线程耗尽。
伪异步IO实际上仅仅是对BIO线程模型的一个简单优化,无法从根本上解决同步IO导致的通信线程阻塞问题。
官方将NIO称之为 New I/O,因为它相对于之前的I/O类库是新增的。
但是更多的人喜欢称之为Non-block I/O,非阻塞IO,因为非阻塞I/O更能体现NIO的特点。
【NIO三大组件】
由于JDK的Selector在Linux等主流操作系统上通过epoll实现,它没有连接句柄数的限制,这意味着一个Selector线程可以同时处理成千上万个客户端连接,而且性能不会随着客户端的增加而线性下降。因此,该模型非常适合做高性能、高负载的网络服务器。
AIO即Asynchronous Input Output,异步IO。
JDK7升级了NIO类库,升级后的NIO类库被称为NIO2.0,NIO2.0的异步套接字通道是真正的异步非阻塞I/O,对应于UNIX网络编程中的事件驱动I/O,即AIO。该模型不需要通过多路复用选择器Selector对注册的通道进行轮询操作即可实现异步读写,从而简化了NIO的编程模型。
上一篇:java毕业生设计中小学图书馆管理计算机源码+系统+mysql+调试部署+lw
下一篇:第十章、python字符串操作与with语句及上下文管理器------with语句与上下文管理器(Context Manager)