摘要

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

目录

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

  (二)select,poll,epoll

(三)NIO

  (四)Reactor模型

  (五)线程池

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

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

  

              (该图来源自《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

关于Netty的学习前总结的更多相关文章

  1. VB6.0编程笔记——(2)开发环境准备&学习前导入

    工欲善其事必先利其器,着手开始学习写代码之前,我们需要先准备好需要用到的工具.这篇文章会教大家部署好环境,同时会告知前期我们需要知道的一点内容(可以不用特别理解,只要记住用法就行,后续会深入展开介绍) ...

  2. netty深入学习之一: 入门篇

    netty深入学习之一: 入门篇 本文代码下载: http://download.csdn.net/detail/cheungmine/8497549 1)Netty是什么 Netty是Java NI ...

  3. netty深入学习之中的一个: 入门篇

    netty深入学习之中的一个: 入门篇 本文代码下载: http://download.csdn.net/detail/cheungmine/8497549 1)Netty是什么 Netty是Java ...

  4. Linux学习前的准备

    Linux学习前的准备 Linux的学习也是这次项目的一个点. 我的学习教材是 The Linux Command Line,这是本已经被翻译好了的 中英版本的教材,知识点还是比较入门的 我使用的是 ...

  5. 《精通并发与Netty》学习笔记(01 - netty介绍及环境搭建)

    一.Netty介绍     Netty是由JBOSS提供的一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客户端程序.     ...

  6. Netty 框架学习 —— 编解码器框架

    编解码器 每个网络应用程序都必须定义如何解析在两个节点之间来回传输的原始字节,以及如何将其和目标应用程序的数据格式做相互转换.这种转换逻辑由编解码器处理,编解码器由编码器和解码器组成,它们每种都可以将 ...

  7. Java学习前的一些准备

    1.JDK - (Java SE Development Kit) JDK是Java开发所需要的环境,就跟我们想玩某个网游一样,玩之前一定是需要先安装相应的程序包的.那这个JDK就是我们准备登陆Jav ...

  8. Vue学习笔记之Vue学习前的准备工作

    0x00 起步 1.扎实的HTML/CSS/Javascript基本功,这是前置条件. 2.不要用任何的构建项目工具,只用最简单的<script>,把教程里的例子模仿一遍,理解用法.不推荐 ...

  9. JAVA学习前十天:小结、面向对象之”扑克牌“例子

    2016年4月26号正式步入JAVA学习课堂,学习了第一节JAVA课程,由于以前有C语言基础,所以课程有点快! 第一天:学习了教材的第一部分,第一部分总共两章,分别是JAVA简介和JAVA基础语法. ...

随机推荐

  1. EF 实体类的制定属性不生成数据库字段

    添加一个标签即可 [NotMapped] 没什么营养,就是防忘记

  2. vue 校验插件 veeValidate使用

    1.内置的校验规则 after{target} - 比target要大的一个合法日期,格式(DD/MM/YYYY) alpha - 只包含英文字符 alpha_dash - 可以包含英文.数字.下 ...

  3. django 取model字段的verbose_name值

    Django 模型中的verbose_name我们常常可能需要使用.比如将数据库里面的数据导出成csv文件,那么csv文件的表头的名字可以通过取每个字段的verbose_name来获取,数据可以通过q ...

  4. 也谈SpringCloud:假如 《复仇者联盟4》是一个微服务

    前言   <复仇者联盟4>(下文<妇联4>) 将于4月24号上映了,漫威迷们是不是迫不及待了.我虽然不是漫威迷,没有看过相关漫画,但是电影确实一步都不落.不过我在想一个问题:假 ...

  5. 下拉控件jQuery插件

    由于后端开发需要一个下拉控件,能输入,能选择,于是自己写了一个 ;(function($,window,document,undefined){ function Select(el,opt){ th ...

  6. selenium测试报告(含通过率统计图和失败截图)

    前言: 介绍的是含饼状统计图及失败截图的测试报告文件. 原文地址:https://testerhome.com/topics/9984 此版本增加了如下功能 测试报告完全汉化,包括错误日志的中文处理 ...

  7. ROS——rqt

    $ rosrun rqt_plot rqt_plot   # 画出发布在topic上的数据变化图 $ rosrun rqt_graph rqt_graph #画出node关系图 $ rosrun rq ...

  8. 拥抱.NET Core系列:MemoryCache 初识 (转载)

    阅读目录 MSCache能做什么? 从IMemoryCache说起 开发者的体验 写在最后 Cache是一个绝大多数项目会用到的一个技术,说起到缓存可能就联想到 Set.Add.Get.Remove. ...

  9. GoogleTest初探(1)

    此篇主要了解一下GoogleTest中的断言. 总的来说,GoogleTest中的断言分为两大类:EXPECT_*和ASSERT_*,这两者在测试成功或失败后均会给出测试报告,区别是前者在测试失败后会 ...

  10. easyui div 上下布局 最大化按钮 隐藏标题

    背景:easyui在做上下布局的时候,上面是数据列表,下面是数据图表.如下图 需要在上下面板右上角加上最大化按钮,以便可以全屏显示.逻辑就是当上面点击最大化时候,隐藏下面,主意:此时需要将下面的div ...