引言

我一直认为对于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. Fast Paxos

    http://blog.csdn.net/chen77716/article/details/7297122 自从Lamport在1998年发表Paxos算法后,对Paxos的各种改进工作就从未停止, ...

  2. 鼠标拖拽定位和DOM各种尺寸详解

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. 关于前端本地压缩图片,兼容IOS/Android/PC且自动按需加载文件之lrz.bundle.js

    一.介绍说明主要特点: ①在前端压缩好要上传的图片可以更快的发送给后端,因此也特别适合在移动设备上使用. ②兼容IOS/Android,修复了IOS/Android某些版本已知的BUG. ③按需加载文 ...

  4. 从javascript发展说到vue

    Vue是基于javascript的一套MVVC前端框架,在介绍vue之前有必要先大体介绍下javascript产生背景及发展的历史痕迹.前端MVVC模式等,以便于大家更好的理解为什么会有vue/rea ...

  5. thinkphp框架实现删除上传的文件

    public function article_delete(){ $article_id = I('get.article_id'); $model = M('zx_article'); $data ...

  6. cug-day02

    昨天就主要就熟悉了项目,今天就简单完成了 后台代码,但是没有进行测试,前端的vue也不是很懂,所以还有很多需要学习的地方. 目前主要就是需要理解项目运行流程, 项目采用的是ssh ,用了vo和po , ...

  7. 洛谷 P1490 解题报告

    P1490 买蛋糕 题目描述 野猫过生日,大家当然会送礼物了(咳咳,没送礼物的同志注意了哈!!),由于不知道送什么好,又考虑到实用性等其他问题,大家决定合伙给野猫买一个生日蛋糕.大家不知道最后要买的蛋 ...

  8. Python_socket_UDP

    zReceiver.py import socket #使用ipv4协议,使用UDP协议传输数据 s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # ...

  9. 【python3】如何建立爬虫代理ip池

    一.为什么需要建立爬虫代理ip池 在众多的网站防爬措施中,有一种是根据ip的访问频率进行限制的,在某段时间内,当某个ip的访问量达到一定的阀值时,该ip会被拉黑.在一段时间内被禁止访问. 这种时候,可 ...

  10. PAT1077: Kuchiguse

    1077. Kuchiguse (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 HOU, Qiming The Japan ...