Netty学习(1)IO模型BIO/NIO/AIO

IO我们非常熟悉了,IO不仅仅针对文件的操作,网络编程socket的通信,就是IO操作。通常所说的 BIO 是相对于 NIO 来说的,BIO 也就是 Java 开始之初推出的 IO 操作模块,BIO 是 BlockingIO 的缩写,顾名思义就是阻塞 IO 的意思。

5种Linux网络I/O模型简介

Linux提供了5中I/O模型,如下:

  1. 阻塞I/O模型:所有文件操作都是阻塞的,数据从硬盘到内核态到用户态整个过程都是阻塞的。
  2. 非阻塞I/O模型:一般通过轮询的方式检查数据是否准备好数据。
  3. I/O复用模型:Linux提供了select/poll ,select/poll顺序扫描fd是否就绪,而且fd有限,因此使用收到了一些制约;linux还提供了epoll,epoll使用了基于事件的方式替代了顺序扫描,因此性能更高。
  4. 信号驱动I/O模型
  5. 异步I/O:告知内核开启某个操作,并再操作完成(包括数据从内核态复制到用户自己的缓冲区)后通知我们。

BIO、NIO、AIO的区别

  • BIO(Block IO) 就是传统的 java.io 包,它是基于流模型实现的,交互的方式是同步、阻塞方式,也就是说在读入输入流或者输出流时,在读写动作完成之前,线程会一直阻塞在那里,它们之间的调用时可靠的线性顺序。它的有点就是代码比较简单、直观;缺点就是 IO 的效率和扩展性很低,容易成为应用性能瓶颈。
  • NIO 是 Java 1.4 引入的 java.nio 包,提供了 Channel、Selector、Buffer 等新的抽象,可以构建多路复用的、同步非阻塞 IO 程序,同时提供了更接近操作系统底层高性能的数据操作方式。
  • AIO 是 Java 1.7 之后引入的包,是 NIO 的升级版本,提供了异步非堵塞的 IO 操作方式,所以人们叫它 AIO(Asynchronous IO),异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。

BIO、NIO、AIO使用场景

  • BIO 适用于连接数小且固定的架构,堆服务器资源要求比较高,jdk1.4前的唯一选择,但程序简单易懂
  • NIO 适用于连接数多且连接比较短的架构,比如聊天服务器,弹幕系统,服务间通讯;编程比较负责,jdk1.4开始支持。
  • AIO 适用于连接数比较多且比较长的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,jdk7开始支持

BIO(block IO)同步阻塞

  • 每个请求都要创建独立的线程与对应的客户端进行交互
  • 并发量大的时候需要创建大量的线程来处理连接,系统资源占用比较大
  • 连接建立后,如果当前线程没有数据可读,则线程阻塞再read操作上,造成线程资源浪费

NIO (non-block IO/New IO) 同步非阻塞

NIO有三大核心类:Channel,Selector,Buffer, 面向缓冲区编程。

发布了52 篇原创文章 · 获赞 8 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/wufengui1315/article/details/103513297