前言

前面的文章已经有讲过Netty,为了巩固自己的知识和理清Netty的知识脉络,所以整理了一些相关的关键知识。

一、BIO、NIO、AIO的区别

1.1 BIO

我们java里常说的传统IO, 基于流模型同步阻塞。阻塞:也就是在读输出流、输入流时,在读写动作完成前,线程是一直阻塞的。缺点是IO效率低。

1.2 NIO

有翻译成Non-Block-IO,也有翻译成了New-IO。NIO本身是基于事件驱动的思想来实现的。它同时支持阻塞与非阻塞模式,但我们一般都是说它是同步非阻塞的,实现方式是多路复用

非阻塞:在Bio模型中,每个请求要占有一个线程,并且是阻塞的,Nio中,因为多路复用,多个请求可以只占有一个服务器线程,多路复用器可以不断地轮询各个连接的状态,只有当连接可读或可写状态,才进行处理。这样就避免了BIO模型下大量线程处于阻塞等待状态的情景。

1.3 AIO

这个我不是很了解,以下是复制网上:

异步非阻塞I/O模型。异步非阻塞与同步非阻塞的区别在哪里?异步非阻塞无需一个线程去轮询所有IO操作的状态改变,在相应的状态改变后,系统会通知对应的线程来处理。对应到烧开水中就是,为每个水壶上面装了一个开关,水烧开之后,水壶会自动通知我水烧开了。

二、什么是同步和异步

2.1 进程中IO调用步骤

进程中的IO调用步骤大致可以分为以下四步:

  1. 进程向操作系统请求数据 ;
  2. 操作系统把外部数据加载到内核的缓冲区中;
  3. 操作系统把内核的缓冲区拷贝到进程的缓冲区 ;
  4. 进程获得数据完成自己的功能 ;

当操作系统在把外部数据放到进程缓冲区的这段时间(即上述的第二,三步),如果应用进程是挂起等待的,那么就是同步IO,反之,就是异步IO,也就是AIO

三、什么是阻塞和非阻塞

  • 阻塞:前面说过了,就是在准备数据并返回的过程中,线程是阻塞的。
  • 非阻塞:在服务器准备数据时到数据准备完成时,该线程可以处理其他请求。

四、什么是多路复用

首先,输入操作一般包含两个步骤:

  1. 等待数据准备好(waiting for data to be ready)。对于一个套接口上的操作,这一步骤关系到数据从网络到达,并将其复制到内核的某个缓冲区。
  2. 将数据从内核缓冲区复制到进程缓冲区(copying the data from the kernel to the process)。

同步非阻塞场景中,由一个人轮询所有的事情,由于轮询方式的不同,存在三种典型的:select、poll、epoll;

可以简单的理解,select、poll、epoll是不同的代次技术,每一代都有增强;

Select等待的个数有限制,1024,并且每一次操作都需要在内核态和用户态拷贝监控信息,耗时;真正的全部轮询;

Poll个数无限制,但是还是有其他限制;

Epoll是新创建了一个fd,将监控的fd挂接在上面,监控的fd如果有变化,就直接通知原fd;这样返回的event数量也是明确的,只返回有相应的fd事件;

一般epoll在网络IO用得比较多,其实在磁盘IO上,LIBAIO和epoll也有很不错的配合;

五、NIO的优势

NIO相比BIO的优势就是前面说的同步非阻塞的优势。

六、Netty的优势

先贴下Nio的劣势:

  1. NIO的类库和API还是有点复杂,比如Buffer的使用
  2. Selector编写复杂,如果对某个事件注册后,业务代码过于耦合
  3. 需要了解很多多线程的知识,熟悉网络编程
  4. 面对断连重连、保丢失、粘包等,处理复杂
  5. NIO存在BUG,根据网上言论说是selector空轮训导致CPU飙升,具体有兴趣的可以看看JDK的官网

Netty就是Nio的框架,它的出现就是为了解决Nio原有的劣势。

七、Reactor线程模型

看这篇文章:Reactor模型讲解

八、select、poll、epoll

这一快了解的不多,所以以下内容会比较浅显,后续再做深入了解。

select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。

(1)select==>时间复杂度O(n)

它仅仅知道了,有I/O事件发生了,却并不知道是哪那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对他们进行操作。所以select具有O(n)的无差别轮询复杂度,同时处理的流越多,无差别轮询时间就越长。

(2)poll==>时间复杂度O(n)

poll本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态, 但是它没有最大连接数的限制,原因是它是基于链表来存储的.

(3)epoll==>时间复杂度O(1)

epoll可以理解为event poll,不同于忙轮询和无差别轮询,epoll会把哪个流发生了怎样的I/O事件通知我们。所以我们说epoll实际上是事件驱动(每个事件关联上fd)的,此时我们对这些流的操作都是有意义的。(复杂度降低到了O(1))

Netty阶段性学习总结(一)相关推荐

  1. 20165310_获奖感想与Java阶段性学习总结

    获奖感想与Java阶段性学习总结 一.Learning By Doing ​ 在此之前,其实我并没有想到能够成为小黄杉的第一批成员之一,喜悦之余,也感受到了许多的压力.小黄杉一方面代表了老师对于我这一 ...

  2. SVG—初识5之SVG变形动画和阶段性学习成果展示

    SVG-初识5 SVG 变形动画 MorphSVGPlugin 多个变换 蒙版动画 阶段性学习成果 SVG 变形动画 在做形状转换的时候,转换前形状的控制点和转换后的控制点数最好相同,这样效果能好些 ...

  3. netty框架学习及springboot整合集成

    netty框架学习及springboot整合集成 1. Netty基本概念 2. Netty框架 2.1 Netty框架结构 2.1 Netty NIO 2.2 Reactor线程模型 3. Spri ...

  4. Netty源代码学习——EventLoopGroup原理:NioEventLoopGroup分析

    类结构图: 不了解Executor接口原理的能够查看concurrent包中的api介绍.这里仅仅介绍Netty中EventExecutorGroup的主要功能! 从类的结构图中能够看到EventEx ...

  5. Netty快速学习1-基础知识回顾

    Netty作为软件高级编程必学技术框架 目录 传统BIO框架 基础回顾-网络七层模型 基础回顾-TCP 报文 题外扩展-TCP三次握手与四次挥手 BIO样例 服务端socket 客户端 Java里面的 ...

  6. Netty 入门学习

    本篇博客是基于在B站黑马教程中的netty网络编程的学习记录笔记: 目录 1. 概述 1.1 Netty 是什么? 1.2 Netty 的优势 2. 编写Hello World 2.1 服务器端 2. ...

  7. 《精通并发与Netty》学习笔记(13 - 解决TCP粘包拆包(一)概念及实例演示)

    一.粘包/拆包概念 TCP是一个"流"协议,所谓流,就是没有界限的一长串二进制数据.TCP作为传输层协议并不不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行数据包的 ...

  8. Netty 框架学习(二):Netty粘包和拆包

    文章目录 一.什么是粘包和拆包 二.粘包和拆包示例代码 1.TimeServerHandler 2.TimeClientHandler 三.使用Netty解决粘包和拆包 1.TimeServerHan ...

  9. Netty 框架学习(一):初始netty

    文章目录 一.Netty简介 二.开发包获取 maven依赖 三.简单例子 服务端 客户端 一.Netty简介 官方定义为:"Netty 是一款异步的事件驱动的网络应用程序框架,支持快速地开 ...

  10. 《精通并发与Netty》学习笔记(02 - 服务端程序编写)

    上节我们介绍了开发netty项目所必需的开发环境及工具的使用,这节我们来写第一个netty项目 开发步骤 第一步:打开https://search.maven.org 找到netty依赖库 第二步:打 ...

最新文章

  1. 陆奇宣布卸任COO后首度露面,将担任李彦宏的个人顾问
  2. Python爬虫,利用scrapy来编写一个爬虫
  3. 用神经网络模拟分子:钠的卤化物
  4. C语言fputs()函数(把字符串写入到指定的流 stream (文件指针)中)
  5. 透过汇编另眼看世界之多继承下的虚函数函数调用
  6. 过拟合与模型调优(part2)--重抽样技术
  7. Python_全局变量的定义
  8. ROS在编译生成自定义消息时报错ModuleNotFoundError: No module named 'em'
  9. FPGA时钟激励编写(方法二)
  10. php递归删除空数组,php 递归删除非空文件夹示例
  11. 通过伪协议解决 父页面与iframe页面通信的问题
  12. 玩转docker、Swarm、Kubernetes
  13. 第九届河南理工大学算法程序设计大赛 正式赛(部分题解)
  14. 【2019杭电多校第六场1011=HDU6644】11 Dimensions(dp+思维)
  15. 上传图片时出现http 415错误
  16. openstack版本_庆祝新版本,供应商自由以及更多OpenStack新闻
  17. RNA 二级结构预测方法
  18. C++ 编写一个解释器
  19. 生物化学 核磁共振 氢谱 n+1定律 邻碳耦合 同碳耦合
  20. 延云YDBYA100安装部署文档

热门文章

  1. c#加粗代码_C# 8中的可空引用类型
  2. 翻译:使用 AWS Deep Racer 的日志分析工具
  3. TensorFlow by Google CNN分类真实图片 Machine Learning Foundations: Ep #5 - Classifying real-world images
  4. 算法:Reverse String(反转字符串)
  5. php $stomp write byte message,PHP通过Stomp协议与,ActiveMQ,通信所遇到的问题
  6. CTR预估之outbrain
  7. DST(对话状态追踪)常用方法
  8. 1193, Unknown system variable 'tx_isolation'
  9. http://blog.csdn.net/wangyoujin321/article/details/51472606
  10. 协同过滤算法:在线推荐系统如何工作?