引言

我一直认为对于java的学习,掌握基础的性价比要远远高于使用框架,而基础知识中对于网络相关知识的掌握也是重中之重。对于一个java程序来说,无论是工作中还是面试,对于Netty的掌握都是及其重要的。所以博主下定决心深度的学习一下Netty并且做下笔记与心得,供大家一起学习探讨。

Netty的卓越之处在于它是一个高性能、异步事件驱动的NIO框架,目前很多著名的开源框架都使用Netty作为底层的通信框架,如Haddop、storm等。

好的废话不多说,我们直接进入主题。

linux的五种网络 I/O 模型

Linux的内核将所有的外部设备都看作一个文件来操作。比如操作一个文件的时候,linux会得到这个文件的文件描述符(fd),通过这个描述符来操作文件。socket的读写尽管不是本地的文件,但是Linux是通过一个类似文件描述符,称为socket描述符(socketfd)来操作网络数据的。描述符就是一个数字,它指向内核中的一个结构体(文件的路径,数据区等一些属性)。

阻塞I/O模型

这是我们最最常见的I/O模型,例如我们平常编写java程序所用的读写文件都是阻塞的。什么意思呢?就是当程序执行到读/写这一步操作的时候不会继续往下执行代码,而是等到读/写的操作执行完毕。
套接字接口的情况则是,进程准备接受或发送的数据的时候,,会向内核调用recvfrom()方法,这个方法会一直阻塞,直到数据包接受或发送完毕,或者发生错误的时候才返回,在此期间一直等待。

非阻塞I/O模型

区别于阻塞I/O模型,当我们接受或发送数据包的时候不会阻塞的等待,而是通过一个循环检查套接口的状态,如果缓存区中没有数据,当进程调用recvfrom()方法的时候,内核直接返回一个EWOULDBLOCK错误。当有数据来的时候,才继续后续操作。

I/O复用模型

这个是Netty底层所使用的 I/O模型,类似于一个小区的物业,管理着所有住户的快递,当有快递小哥来送快递的时候快递小哥不用一层一层爬到用户家中,而是将快递存放到物业。再由物业来通知用户取快递。

原理是Linux提供 select/poll方法,通过启动一个进程来管理所有连接的描述符,通过顺序扫描所有描述符是否为就绪状态。但是这种方式有一个弊端,那就是同时管理的描述符有上限,一般来说最多支持1024个。所以linux在后来提供了pselect/epoll方法,区别于select/poll方法:

  1. 循环扫描的时候只扫描活跃的文件,所支持的描述符管理上线为操作系统的最大文件句柄数,比如1GB内存的机器数量大约是10万个句柄左右,因此现在基本上都是使用的后者。

  2. 由于epoll每次都只是扫描活跃的socket,并且在大多数情况下,只有少部分的socket是活跃的,因此epoll效率会高很多,但是如果在一个高速的LAN环境下,epoll并不会比select/poll的效率高太多;相反相率可能还会稍稍降低。

  3. 每次接受数据的时候内核需要把数据从内核缓存复制到用户缓存,这一步内存复制其实是很降低效率的,epoll是通过内核和用户空间mmap同一块内存来实现的。

  4. epoll的API更加简单。

信号驱动I/O模型

首先开启套接口信号驱动,并通过系统调用sigaction执行一个信号处理函数,然后进程继续工作。当数据准备就绪的时候,就为该进程生成一个SIGIO信号,通过信号回调通知引用程序来读取数据。

异步I/O模型

这种模型与信号驱动模型的主要区别就是:信号驱动I/O模型由内核通知进程可以开始一个I/O操作了。而异步I/O模型这个逼就更猛了,直接通知进程,劳资已经帮你搞完了。

总结

这五种模型每一种都有很深的学问,博主在这里只是用我自己所理解的知识来简单的介绍一下这五种模型,但是如果你对其中的I/O模型有浓厚的兴趣,可以自行对每一种模型进行进一步深度学习。这里我推荐I/O复用模型,因为Netty的底层就是使用的该模型。

Netty基础系列(1) --linux网路I/O模型的更多相关文章

  1. Netty基础系列(3) --彻底理解NIO

    前言 上一节中我们提到了同步异步与阻塞非阻塞的区别,知道了同步并不等于阻塞.而本节的主角NIO是一种同步非阻塞的I/O模型,并且是I/O多路复用模型.NIO在java中被称为 New I/O.它并不能 ...

  2. Netty基础系列(4) --堆外内存与零拷贝详解

    前言 到目前为止,我们知道Nio当中有三个最最核心的组件,分别是:Selelctor,Channel,Buffer.在Netty基础系列(3) --彻底理解NIO 这一篇文章中只是进行了大致的介绍. ...

  3. 【夯实PHP基础系列】linux下yum安装PHP APC

    Alternative PHP Cache(可选PHP缓存),依赖于 PECL扩展库 用源码方式安装,直接yum就行了:首先要安装apc的依赖包:yum install php-pear php-de ...

  4. Netty基础系列(2) --彻底理解阻塞非阻塞与同步异步的区别

    引言 在进行I/O学习的时候,阻塞和非阻塞,同步和异步这几个概念常常被提及,但是很多人对这几个概念一直很模糊.要想学好Netty,这几个概念必须要掌握清楚. 同步和异步 同步与异步的区别在于,异步基于 ...

  5. Netty基础系列(5) --零拷贝彻底分析

    前言 上一节(堆外内存与零拷贝)当中我们从jvm堆内存的视角解释了一波零拷贝原理,但是仅仅这样还是不够的. 为了彻底搞懂零拷贝,我们趁热打铁,接着上一节来继续讲解零拷贝的底层原理. 感受一下NIO的速 ...

  6. 大数据入门基础系列之Hadoop1.X、Hadoop2.X和Hadoop3.X的多维度区别详解(博主推荐)

    不多说,直接上干货! 在前面的博文里,我已经介绍了 大数据入门基础系列之Linux操作系统简介与选择 大数据入门基础系列之虚拟机的下载.安装详解 大数据入门基础系列之Linux的安装详解 大数据入门基 ...

  7. Netty入门系列(1) --使用Netty搭建服务端和客户端

    引言 前面我们介绍了网络一些基本的概念,虽然说这些很难吧,但是至少要做到理解吧.有了之前的基础,我们来正式揭开Netty这神秘的面纱就会简单很多. 服务端 public class PrintServ ...

  8. linux驱动基础系列--linux spi驱动框架分析

    前言 主要是想对Linux 下spi驱动框架有一个整体的把控,因此会忽略某些细节,同时里面涉及到的一些驱动基础,比如平台驱动.设备模型等也不进行详细说明原理.如果有任何错误地方,请指出,谢谢! spi ...

  9. linux驱动基础系列--linux spi驱动框架分析(续)

    前言 这篇文章是对linux驱动基础系列--linux spi驱动框架分析的补充,主要是添加了最新的linux内核里设备树相关内容. spi设备树相关信息 如之前的文章里所述,控制器的device和s ...

随机推荐

  1. Google Bigtable (中文版)

    http://dblab.xmu.edu.cn/post/google-bigtable/ Abstract BigTable是一个分布式存储系统,它可以支持扩展到很大尺寸的数据:PB级别的数据,包含 ...

  2. Mac下MySQL无my-default.cnf

    转自https://www.jianshu.com/p/628bcf8bb557 As of MySQL 5.7.18, my-default.ini is no longer included in ...

  3. vim快捷键汇总

    命令历史 以:和/开头的命令都有历史纪录,可以首先键入:或/然后按上下箭头来选择某个历史命令. 启动vim 在命令行窗口中输入以下命令即可 vim 直接启动vim vim filename 打开vim ...

  4. Math对象中比较常用的计算数学相关的三个方法

    Math类中提供了三个与取整有关的方法:ceil.floor.round,这些方法的作用与它们的英文名称的含义相对应,例如: ceil的英文意义是天花板,该方法就表示向上取整,所以,Math.ceil ...

  5. springMVC(spring)+WebSocket案例(获取请求参数)

    开发环境(最低版本):spring 4.0+java7+tomcat7.0.47+sockjs 前端页面要引入: <script src="http://cdn.jsdelivr.ne ...

  6. 并发容器之CopyOnWriteArraySet

    CopyOnWriteArraySet是基于CopyOnWriteArrayList实现的,其唯一的不同是在add时调用的是CopyOnWriteArrayList的addIfAbsent方法. 具体 ...

  7. spring Cloud 域名映射 ip地址实现

    spring.cloud.inetutils.preferredNetworks[0]=^192\.168 eureka.instance.prefer-ip-address=true

  8. elasticSearch+spring 整合 maven依赖详解

    摘自:http://www.mayou18.com/detail/nTxPQSyu.html [Elasticsearch基础]elasticSearch+spring 整合 maven依赖详解 Ma ...

  9. 在基于Windows系统的PHP虚拟主机上实现域名的301永久重定向

    作者:荒原之梦 原文链接:http://zhaokaifeng.com/?p=581 操作背景: 当网站在更换或添加域名.进行网址规范化或删除旧页面时,出于对用户使用体验和搜索引擎优化方面的考虑就需要 ...

  10. Composer基本安装步骤

    Composer是 PHP 世界里用于管理项目依赖的工具. 1,确保安装PHP,检查方法命令行窗口执行php -v,查看是否正常输出版本 php -v 2,下载安装脚本composer-setup.p ...