引言

我一直认为对于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. 推荐个Mac OSX下的Code Editor:Atom

    首先只是当Editor用,不是整成IDE级. 先说几个大家耳熟能详的: 1.Sublime,Sublime在Mac下的安装并不完全,CLI启动需要自己ln个链接.还有一些其他原因,比如Packages ...

  2. ubuntu 14.04 安装svn server (subversionedge )

    ubuntu 14.04 安装subversionedge 请仔细阅读安装包自带的readme文件! 1.先去官网,找安装包: http://subversion.apache.org/ http:/ ...

  3. MySQL 的索引优化

    索引类似大学图书馆建书目索引,可以提高数据检索的效率,降低数据库的IO成本.MySQL在300万条记录左右性能开始逐渐下降,虽然官方文档说500~800w记录,所以大数据量建立索引是非常有必要的.My ...

  4. Linux/Windows 文件交互读取转义字符变换

  5. 通过终端使用ssh-keygen免密码登录远程服务器

    使用终端ssh登录远程Linux服务器,每次不输入如密码 原理:使用keygen认证,实现免密码验证即可登录服务器. Linux(包括Mac OS): $ ssh-keygen /*生成密钥*/ $ ...

  6. python3学习笔记4---引用http://python3-cookbook.readthedocs.io/zh_CN/latest/

    2018-03-01数据结构与算法(4) 1.16过滤序列元素 最简单的过滤序列元素的方法就是使用列表推导.比如: >>> mylist = [1, 4, -5, 10, -7, 2 ...

  7. ArcCore重构-Platform_Types.h实现辨析

    AUTOSAR定义了一系列PlatformTypes,如uint8/uint16/uint32等等基本类型. It contains all platform dependent types and ...

  8. AUTOSAR-关于配置文件的思考

    基于Can: 1. Can_Cfg.h contains compile time configurations. It should be included by Can.h which is sp ...

  9. 理解Python中的类对象、实例对象、属性、方法

    class Animal(object): # 类对象 age = 0 # 公有类属性 __like = None # 私有类属性 def __init__(self): # 魔法方法 self.na ...

  10. 115个Java面试题和答案——终极列表(上)【转】

    本文我们将要讨论Java面试中的各种不同类型的面试题,它们可以让雇主测试应聘者的Java和通用的面向对象编程的能力.下面的章节分为上下两篇,第一篇将要讨论面向对象编程和它的特点,关于Java和它的功能 ...