1. Netty初认识--Java的I/O演进之路

  |   0 评论   |   0 浏览

首先认识下unix系统提供的5中i/o模型, 分别如下:

  1. 阻塞i/o模型, 整个调用过程都是阻塞等待。
  2. 非阻塞i/o模型, 其中会有轮训监测状态
  3. i/o复用模型: linux提供select/poll 是顺序扫描模式,所有使用有限制,Linux还提供了epoll系统调用, epoll使用基于事件驱动方式代替顺序扫描,因此性能更高,当有fd(file descriptor 文件描述符)就绪时,立即回调函数rollback.
  4. 信号驱动I/O模型
  5. 异步I/O 告知内核启动某个操作,并让内核在整个操作完成后通知我们,这种模型与信号驱动模型的主要区别是:信号驱动I/O由内核通知我们何时可以开始一个I/O操作;异步I/O 模型由内核通知我们I/O操作何时已经完成。

I/O多路复用:

在I/O编程过程中,当需要同时处理多个客户端接入请求时,可以利用多线程或者I/O多路复用技术进行处理。I/O多路复用技术通过把多个I/O阻塞复用到同一个select的阻塞上,从而使得在单线程情况下可以同时处理多个客户端请求。与传统的多线程/多进程模型比,I/O多路复用的最大优势是系统开销小,系统不需要创建新的额外的进程或者线程,也不需要维护这些进程和线程的运行,降低了系统的维护工作量,节省了系统资源,I/O多路复用的主要应用场景如下:
a. 服务器需要同时处理多个处于监听状态或者多个连接状态的套接字;
b. 服务器需要同时处理多种网络协议的套接字。

目前支持I/O多路复用的系统调用有select、pselect、poll、epoll,由于select的固有缺陷,最终选择用epoll作为替代方案。
epoll 与select的原理比较类似,为了克服select的缺点,epoll做了很多重大的改进如下:

  • 支持一个进程打开的socket描述符不受限制(仅受限于操作系统的最大文件句柄数) ,可以通过cat /proc/sys/fs/file-max 查看
  • I/O效率不会随着文件句柄数的增加而线性下降
  • 使用mmap加速内核与用户空间的消息传递。 这样内核把文件描述符通知到用户空间的时候,内核和用户空间mmap使用同一块内存实现,较少不必要的内存复制。
  • epoll的API更加简单.

java nio包从jdk1.4引入. jdk1.7升级为了NIO2.0


标题:1. Netty初认识--Java的I/O演进之路
作者:码农路上
地址:http://wujingjian.club/articles/2020/02/26/1582710430146.html