关于Netty的学习前总结

时间:2022-09-11 09:36:41

摘要

  前段时间一直在学习netty因为工作忙的原因没有写一个学习的总结,今天抽个空先把总结写了吧。事先声明,本文不会详细的介绍每一个部分不过每个部分都会附上讲解详细的url.本文只是为了解释通Netty学习过程。

目录

  (一) 什么是阻塞IO模型?什么是非阻塞IO模型

  (二)select,poll,epoll

(三)NIO

  (四)Reactor模型

  (五)线程池

什么是阻塞IO模型?什么是非阻塞IO模型?

   OK,理解这句话首先我们得知道当我们调用流时文件是怎么从磁盘上跑到用户进程上的。众所周知内存在逻辑上分为用户空间和内核空间当我们需要把文件加载到内存上时首先会将文件拷贝到内核空间中一份然后再拷贝到用户空间里,在这两个阶段内用户的线程会被阻塞也就是我们所说的阻塞IO模型,那非阻塞IO模型是什么呢?非阻塞IO模型在第一阶段是不会被阻塞的但是第二阶段时候被阻塞的(注epoll中用户关系的文件描述符的事件存放到内核的一个事件表中,这样用户空间和内核空间copy只需一次①,从同步IO和异步IO的概念上来讲Epoll依然属于同步IO)。如下图所示:

  关于Netty的学习前总结

              (该图来源自《JAVA NIO》书籍)

  关于其他的IO模型什么异步模型,多路复用IO模型、信号模型、异步模型请看我贴出来的连接:

   https://www.cnblogs.com/dolphin0520/p/3916526.html(良心博客)

什么是Select、Poll、Epoll?

   select、poll、epoll都是I/O的系统调用,它们通过监视描述符来触发事件。它们之间的不同有两点:

  (一)描述符的监控方式不同

  (二)文件拷贝方式不同

   我们先说第一点描述符的监控方式不同.Select和Poll的监控方式相似都是通过轮询的方式来检测描述符(它俩之间的不同就是select用数组来存储描述符,Poll用链表来存储描述符),但是epoll和它们两个不一样,epoll通过事件通知的方式来激活描述符。关于文件拷贝的方式,select和poll都是先把文件拷贝到内核空间再从内核空间拷贝到用户空间,而epoll会将用户关系的文件描述符的事件存放到内核的一个事件表中这样的话文件拷贝就只拷贝了一次。不过在IO类型上它们都是同步IO(再次强调阻塞和非阻塞,同步和异步是两组不同的概念希望大家不要弄混淆)。因为原来保存的url失效了这里就不给大家贴url了。

NIO

  NIO俗称java新IO也就是NEW IO,其主要类就是Channel、Buffer和Selector。NIO和BIO本质上的区别就是BIO是面向流的而NIO是面向缓冲的,虽说BIO有缓冲类但是这些缓冲类都是流的包装类说到底还是从流到缓冲区,而NIO是直接读到buffer中操作②。如果还是不理解的话看这个博客http://tonydark01.iteye.com/blog/2359000,普通io是直接读取流的,而新IO会将数据放到新申请的堆外内存中。其他重要的知识点请看《Java NIO》。

Reactor模型

  早先传统处理IO请求的方式都是用阻塞I/O加多线程,后来就用非阻塞加多线程(单线程)的方式来处理IO请求,至于为什么会使用这种方式其实是为了不让CPU进行频繁的上下文切换(cpu进行上下文的切换会很消耗资源)。Reactor模型是基于非阻塞IO模型来实现的它有三种类型分别是:单线程Reactor,多线程Reactor,主从Reactor(Netty使用的是这种模型)。要是详细讲解每个Reactor的话我估计可以再去写篇博客了我在这里先总结一下然后再附上url连接。

  单线程Reactor:单线程Reactor模型指的是所有IO操作都在同一个NIO线程上来完成的。其中acceptor来接口TCP请求,dispatch将对应的bytebuffer转发的对应的handler进行处理。

  多线程Reactor:多线程Reactor模型与单线程Reactor模型最大的区别就是:多线程Reactor模型IO处理不再是一个线程而是一个NIO线程池。如下图所示:

  主从Reactor:服务端用于接受客户端连接的不再是一个线程,而是一个独立的NIO线程池。Acceptor接收到客户端TCP连接请求并处理完成之后,再将新创建的SocketChannel注册到IO线程池的某个IO处理线程并处理编码和读写工作。

  以上是我做的一个简单的总结,如果想要详细了解的话可以看这个博客:

  https://blog.csdn.net/u010853261/article/details/55805216

线程池

   线程池是一个老生常谈的问题了在这里就不总结了,想了解线程池的可以看《Java并发实战》或者去网上找一些其他人写的博客。

总结

  其实本来想把篇幅再写长点的,但是我看到头凶神恶煞的眼光还是先把学习netty基础的知识点先总结一下吧,以后等有时间了再把netty的学习博客写一下。OK就到这里吧!有什么不对的地方希望大家能够给我指出来谢谢!

  

参考博客献

  ①《IO多路复用值epoll总结》 http://www.cnblogs.com/Anker/archive/2013/08/17/3263780.html

② 百度知道 《java中io和nio的区别和使用场景》 https://zhidao.baidu.com/question/1992496674995191707.html