高性能IO

参考书籍: 《UNIX网络编程第六章》
参考文章: 高性能IO模型,BIO&NIO&AIO

1. IO模型:

1.1 常见IO模型

常见IO模型有以下几类:

  • 同步阻塞IO(Blocking IO): BIO
  • 同步非阻塞IO(Non-blocking IO): NIO
  • IO多路复用(IO Multiplexing): 例如Reactor模式,通过把多个IO的阻塞复用到同一个select的阻塞上,从而使得系统在单线程的情况下可以同时处理多个客户端请求。
  • 信号驱动IO(SIGIO)
    上述四种都是同步IO模型,只有POSIX定义的异步IO模型才是真正的异步IO,但是需要操作系统的支持才能实现。
  • 异步IO(Asynchronous IO): AIO, 例如Proactor模式
    1.2 IO操作
    一个输入操作包含两个阶段:
  • 等待数据准备好
  • 从内核向用户进程复制数据
    典型的如一个套接字上的输入操作,第一步等待数据从网络中到达,然后分组到达时,被复制到内核中的某个缓冲区。第二步就是把数据从内核缓冲区复制的应用进程缓冲区。
    1.3 IO多路复用技术
    目前支持IO多路复用的系统调用有select, pselect, poll, epoll。现在使用epoll代替select,epoll有以下改进:
  1. 支持一个进程打开的socket描述符(FD)不受限制,select默认打开的文件描述符为1024个:
    查看系统最大FD数目: s/fs/file-max
  2. IO效率不会随着FD数目增加而线性下降:不同于select, epoll只会扫描活跃的,而不是扫描全部FD
  3. 使用mmap加速内核与用户空间的消息传递:epoll是通过内核和用户进程mmap同一块内存
  4. epoll的API更加简单
    1.4 Java的IO演进
    BIO : Blocking IO
    JDK1.4之前只支持BIO
    NIO : Non-Blocking IO
    2002年, JDK1.4开始支持NIO
  • 进行异步操作的buffer和pipe
  • 进行同步或者异步操作的channel
  • 实现非阻塞IO操作的多路复用器selector
  • 多种字符集的编码和解码能力
  • 文件通道FileChannel
    AIO : Asynchronous IO
    2011年, JDK1.7升级为NIO2.0
  • 提供了AIO

2. BIO–>NIO–>AIO

2.1 同步阻塞
2.2 伪异步
2.3 NIO
2.4 AIO