关于Netty的学习前总结
摘要
前段时间一直在学习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的学习前总结的更多相关文章
- VB6.0编程笔记——(2)开发环境准备&学习前导入
工欲善其事必先利其器,着手开始学习写代码之前,我们需要先准备好需要用到的工具.这篇文章会教大家部署好环境,同时会告知前期我们需要知道的一点内容(可以不用特别理解,只要记住用法就行,后续会深入展开介绍) ...
- netty深入学习之一: 入门篇
netty深入学习之一: 入门篇 本文代码下载: http://download.csdn.net/detail/cheungmine/8497549 1)Netty是什么 Netty是Java NI ...
- netty深入学习之中的一个: 入门篇
netty深入学习之中的一个: 入门篇 本文代码下载: http://download.csdn.net/detail/cheungmine/8497549 1)Netty是什么 Netty是Java ...
- Linux学习前的准备
Linux学习前的准备 Linux的学习也是这次项目的一个点. 我的学习教材是 The Linux Command Line,这是本已经被翻译好了的 中英版本的教材,知识点还是比较入门的 我使用的是 ...
- 《精通并发与Netty》学习笔记(01 - netty介绍及环境搭建)
一.Netty介绍 Netty是由JBOSS提供的一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客户端程序. ...
- Netty 框架学习 —— 编解码器框架
编解码器 每个网络应用程序都必须定义如何解析在两个节点之间来回传输的原始字节,以及如何将其和目标应用程序的数据格式做相互转换.这种转换逻辑由编解码器处理,编解码器由编码器和解码器组成,它们每种都可以将 ...
- Java学习前的一些准备
1.JDK - (Java SE Development Kit) JDK是Java开发所需要的环境,就跟我们想玩某个网游一样,玩之前一定是需要先安装相应的程序包的.那这个JDK就是我们准备登陆Jav ...
- Vue学习笔记之Vue学习前的准备工作
0x00 起步 1.扎实的HTML/CSS/Javascript基本功,这是前置条件. 2.不要用任何的构建项目工具,只用最简单的<script>,把教程里的例子模仿一遍,理解用法.不推荐 ...
- JAVA学习前十天:小结、面向对象之”扑克牌“例子
2016年4月26号正式步入JAVA学习课堂,学习了第一节JAVA课程,由于以前有C语言基础,所以课程有点快! 第一天:学习了教材的第一部分,第一部分总共两章,分别是JAVA简介和JAVA基础语法. ...
随机推荐
- in有两种用法:
# in有两种用法: 1. 在for中. 是把每一个元素获取到赋值给前⾯的变量. 2. 不在for中. 判断xxx是否出现在str中. #len() 为内置函数,输出为1,2,3,4....., 长度 ...
- Programming Assignment 4: Boggle
编程作业四 作业链接:Boggle & Checklist 我的代码:BoggleSolver.java 问题简介 Boggle 是一个文字游戏,有 16 个每面都有字母的骰子,开始随机将它们 ...
- jquery validation验证身份证号、护照、电话号码、email
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- swift内存管理:值类型与引用类型
Use struct to create a structure. Structures support many of the same behaviors as classes, includin ...
- Golang reflect 反射
反射的规则如下: 从接口值到反射对象的反射 从反射对象到接口值的反射 为了修改反射对象,其值必须可设置 -------------------------------------------- ...
- node.js 连接 sql server 包括低版本的sqlserver 2000
利用tedious连接,github地址:https://github.com/tediousjs/tedious 废话不多时直接上代码. connection.js var Connection = ...
- ZooKeeper分布式专题与Dubbo微服务入门
第1章 分布式系统概念与ZooKeeper简介对分布式系统以及ZooKeeper进行简介,使得大家对其有大致的了解1-1 zookeeper简介1-2 什么是分布式系统1-3 分布式系统的瓶颈以及zk ...
- c实现 简单的文件管理 不含交互
实现如下功能: 1.读取指定目录下的所有子目录和文件信息(比如:指定目录为C:/temp则把此目录 下的所有子目录下的文件信息读出来)2.在C盘创建一个以个人姓名命名的目录(比如:张三)3.在目录下创 ...
- ubuntu18.04(bionic) 配置阿里数据源
先备份源数据原文件 cp sources.list sources.list.bak 编辑 sources.list,输入内容如下: deb http://mirrors.aliyun.com/ubu ...
- Mac开发中遇到的一些小问题解析
通过mac开发的过程中,有一些小问题出现,列如下,后续会持续增加: 1. 命令行清空废纸篓(jar包太多,倾倒废纸篓太慢) sudo rm -rfv ~/.Trash /Volumes/*/.Tras ...