首页 > 编程知识 正文

每个io端口位可以自由的编程,io模型有哪几种

时间:2023-05-05 20:06:49 阅读:53506 作者:2880

参考:

Netty权威指南第1版

Java网络IO编程总结(包括完整的实例代码以及BIO、NIO和AIO )。

1 .传统的BIO模型通常在独立的Acceptor线程侦听客户端连接并接收到来自客户端的连接请求之后,为每个客户端创建和处理新线程,并在处理完成时通过流处理客户端这就是典型的请求响应通信模型。

这个模型最大的问题是缺乏灵活性。 随着客户端同时访问量的增加,服务端线程数与客户端同时访问量呈1:1的比例关系。 线程是java虚拟机非常宝贵的系统资源,因此随着线程数量的增加,系统性能急剧下降,同时访问量的增加,系统无法进行线程溢出和创建新线程,最终导致进程中断和僵化

2 .伪异步IO编程面临同步块IO的问题。 然后,有人优化其线程模型,后端在一个线程池中处理多个客户端的请求访问,形成客户端数量m :线程池中最大线程数量n的比例关系。 其中,m可以远大于n,通过线程池灵活地调配线程资源并设置线程的最大值,可以防止线程因大量并发访问而耗尽。

这种方法避免了由于为每个请求创建独立线程而导致的线程资源耗尽。 但底层通信仍然采用同步拥塞模型,无法从根本上解决问题。

分析:

如果每个read操作被阻止,并且线程池立即饱和,则无法继续处理新请求,服务将不可用。

3. NIO编程概念:

缓冲区缓冲器

ByteBuffer :字节缓冲区CharBuffer :字符缓冲区ShortBuffer :短整数缓冲区IntBuffer :整数缓冲区LongBuffer :长整数缓冲区FloatBuffer :浮点缓冲区双缓冲区

复用选择器4.AIO编程JDK1.7提供了NIO2.0,引入了新的异步信道概念,并提供了异步文件信道和异步套接字信道实现。 异步通道有两种获取操作结果的方法。

使用多java.util.concurrent.Future类,异步操作的结果在执行异步操作时传递给java.nIO.channels NIO2.0的异步套接字通道是UNIX网络

因为AIO是真正的异步无阻塞,所以要应对非常多的客户端就更方便了。

5 .明确4种IO比较概念异步非阻塞IO

很多人习惯将JDK1.4提供的NIO称为异步非阻塞IO,但实际上它严格区分于UNIX网络编程模型和JDK实现,实际上只称为非阻塞IO,而非同步非阻塞IO 在早期版本的JDK1.4和1.5 update10之前,JDK的选择器是基于select/poll模型实现的。 这是基于IO复用技术的无阻塞IO,不是异步IO。 在JDK1.5 update10和Linux core2.6及更高版本中,Sun优化了Selector的实施,并在基础上将select/poll替换为epoll。 上层API不变,被认为是JDK NIO的性能优化,但IO的模型依然没有变。

JDK1.7提供的NIO2.0才是真正的异步IO。

多路复用器选择

将Selector翻译为选择器也不会体现出Selector的功能和特征,最好翻译为多路复用器。

伪异步

伪异步IO是完全可行的,后端使用线程池处理IO任务。

对比

结语的具体代码请参考《Netty权威指南》或博客Java网络IO编程总结。 (BIO、NIO、AIO均包含完整的实例代码)。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。