摘要

  前段时间一直在学习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. Oracle 关于WKT构造SDO_GEOMETRY的问题。

    由于系统前端使用OpenLayers框架,后台数据库使用oracle spatial.大家知道Oracle spatial的SDO_GEOMETRY十分复杂,如果使用期java api ,那就坑爹了, ...

  2. Python3中内置类型bytes和str用法及byte和string之间各种编码转换

    Python 3最重要的新特性大概要算是对文本和二进制数据作了更为清晰的区分.文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示.Python 3不会以任意隐式的方式混用str ...

  3. 使用redis4.0.1和redis-cluster搭建集群并编写重启shell脚本

    1.删除机器上原有的redis2.8 关闭redis-server killall -9 redis-server 查找redis文件所在目录 which redis 删除相关文件 rm -rf re ...

  4. docker 不同版本 添加--insecure-registry

    docker  17.0.3 vim /lib/systemd/system/docker.service 然后重启 systemctl  daemon-reload , systemctl rest ...

  5. 基于swoole的聊天室模型

    client.html: <!doctype html><html><head> <meta charset="utf-8"> &l ...

  6. JS 兼容大全

    //获取浏览器可视区宽度 function getWidth() { if (window.innerWidth){ return window.innerWidth; } else{ if (doc ...

  7. TensorFlow Activation Function 1

    部分转自:https://blog.csdn.net/caicaiatnbu/article/details/72745156 激活函数(Activation Function)运行时激活神经网络中某 ...

  8. PATtest1.3:最大子列和

    题目源于:https://pintia.cn/problem-sets/16/problems/663 题目要求:输入一个数列,求其最大子列和. 问题反馈:1.部分C++代码不是很熟练 2.没有仔细读 ...

  9. Handlebars模板引擎

    介绍 Handlebars 是 JavaScript 一个语义模板库,通过对view和data的分离来快速构建Web模板.它采用"Logic-less template"(无逻辑模 ...

  10. Y310 线刷

    以下操作都是在XP 32位 系统下执行,64位以及WIN7 WIN8均未测试. ① 下载并安装 spreadtrum_android_24027_32.exe 驱动.(如驱不上,请使用最新版本的驱动精 ...