nio学习
一、Linux内核知识
- Reactor事件驱动,通过死循环中Selector调用select阻塞方法获取就绪的事件
- select, poll, epoll是系统调用(Linux 2.6之前是select、poll,2.6之后是epoll,Windows是IOCP)
- select 、poll涉及fd,用户态内核态切换,内存拷贝
- epoll涉及直接内存,回调,零拷贝
- 逛到底层看NIO的零拷贝
- 从Linux内核理解JAVA的NIO
二、nio组件
- nio是jdk组件,含Selector, Buffer, SocketChannel,ServerSocketChannel
- 并发编程网nio教程
- 看Doug lee课件
三、事件处理器
一般情况下,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是框架
省略,看极客时间视频课
六、其余参考博客
七、遗留问题
jdk1.8 nio组件中,关于SocketChannel和ServerSocketChannel都是继承至AbstractSelectChannel,它们拥有一个方法configureBlocking。当ServerSocketChannel通过register()方法注册到Selector前,需要自身先调用方法configureBlocking(false)将blocking属性置为false,使register能够通过校验。 但是,这个参数,还有什么其他作用吗。为什么注册到Selector中要求Channel设置为非阻塞,这和操作系统,系统调用,内核数据拷贝之间有关系吗,与SocketChannel非阻塞read和非阻塞write有什么关系?