Nio

Posted by Lucas Blog on November 18, 2021

nio学习

一、Linux内核知识

  1. Reactor事件驱动,通过死循环中Selector调用select阻塞方法获取就绪的事件
  2. select, poll, epoll是系统调用(Linux 2.6之前是select、poll,2.6之后是epoll,Windows是IOCP)
  3. select 、poll涉及fd,用户态内核态切换,内存拷贝
  4. epoll涉及直接内存,回调,零拷贝
  5. 逛到底层看NIO的零拷贝
  6. 从Linux内核理解JAVA的NIO

二、nio组件

  1. nio是jdk组件,含Selector, Buffer, SocketChannel,ServerSocketChannel
  2. 并发编程网nio教程
  3. 看Doug lee课件 Doug Lee nio

三、事件处理器

一般情况下,I/O 复用机制需要事件分发器(event dispatcher)。 事件分发器的作用,即将那些读写事件源分发给各读写事件的处理者,就像送快递的在楼下喊: 谁谁谁的快递到了, 快来拿吧!开发人员在开始的时候需要在分发器那里注册感兴趣的事件,并提供相应的处理者(event handler),或者是回调函数;事件分发器在适当的时候,会将请求的事件分发给这些handler或者回调函数。 涉及到事件分发器的两种模式称为:Reactor和Proactor。 Reactor模式是基于同步I/O的,而Proactor模式是和异步I/O相关的。

四、5种IO模型

  • 阻塞I/O模型
  • 非阻塞I/O模型
  • I/O复用模型
  • 信号驱动的I/O模型
  • 异步I/O模型

五、netty是框架

省略,看极客时间视频课

六、其余参考博客

  1. java nio浅析
  2. io模型与相关概念
  3. Java 中 NIO 看这一篇就够了

七、遗留问题

jdk1.8 nio组件中,关于SocketChannel和ServerSocketChannel都是继承至AbstractSelectChannel,它们拥有一个方法configureBlocking。当ServerSocketChannel通过register()方法注册到Selector前,需要自身先调用方法configureBlocking(false)将blocking属性置为false,使register能够通过校验。 但是,这个参数,还有什么其他作用吗。为什么注册到Selector中要求Channel设置为非阻塞,这和操作系统,系统调用,内核数据拷贝之间有关系吗,与SocketChannel非阻塞read和非阻塞write有什么关系?