关于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基础语法. ...
随机推荐
- Java编程练习题
曾经,有人说过,没有刷题的人生是不完整的.看了几天Java,我试着做了几道练习题,好让我的人生完整一点.(偷笑--)这里挑了一些题来跟大家分享,本文不定期更新. 题目集 1. 最后一个单词的长度 ...
- iis7.5加fck解析漏洞后台拿shell
记录下来 经常用到 电脑准备格式化了 一切从头开始 每天浑浑噩噩的不知道干什么.认准一样东西 认认真真的学 IIS6.0解析漏洞,可以上传a.asp;.jps或者a.asp;a.jpg或者a.asp目 ...
- oracle查看用户属于哪个表空间
select username,default_tablespace from dba_users where username='用户名';
- 用php代码统计数据库中符合条件的行数
$sql1 = "select count(*) from t_user where age<17"; $data1 = mysql_query($sql1); $rows1 ...
- sql按月模糊查询
select * from tb where convert(varchar(7),date,120) = '2011-05'
- AE-----合成
AE-----合成 大纲:
- Day10 上传和下载
上传 将本地文件传输到服务器 jsp: 文件上传的请求方式必须是post input的type必须是file enctype="multipart/form-data" ...
- c++——inline内联函数
1 inline内联函数 C++中的const常量可以替代宏常数定义,如: const int A = 3; #define A 3 C++中是否有解决方案替代宏代码片段呢?(替代宏代码片段就可以 ...
- ZOJ 3212 K-Nice(满足某个要求的矩阵构造)
H - K-Nice Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu Submit Sta ...
- springboot activiti 整合项目框架源码 shiro 安全框架 druid windows10风格
官网:www.fhadmin.org 此项目为Springboot工作流版本 windows 风格,浏览器访问操作使用,非桌面应用程序. 1.代码生成器: [正反双向](单表.主表.明细表.树形表 ...