Netty基础系列(1) --linux网路I/O模型
引言
我一直认为对于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方法:
循环扫描的时候只扫描活跃的文件,所支持的描述符管理上线为操作系统的最大文件句柄数,比如1GB内存的机器数量大约是10万个句柄左右,因此现在基本上都是使用的后者。
由于epoll每次都只是扫描活跃的socket,并且在大多数情况下,只有少部分的socket是活跃的,因此epoll效率会高很多,但是如果在一个高速的LAN环境下,epoll并不会比select/poll的效率高太多;相反相率可能还会稍稍降低。
每次接受数据的时候内核需要把数据从内核缓存复制到用户缓存,这一步内存复制其实是很降低效率的,epoll是通过内核和用户空间mmap同一块内存来实现的。
epoll的API更加简单。
信号驱动I/O模型
首先开启套接口信号驱动,并通过系统调用sigaction执行一个信号处理函数,然后进程继续工作。当数据准备就绪的时候,就为该进程生成一个SIGIO信号,通过信号回调通知引用程序来读取数据。
异步I/O模型
这种模型与信号驱动模型的主要区别就是:信号驱动I/O模型由内核通知进程可以开始一个I/O操作了。而异步I/O模型这个逼就更猛了,直接通知进程,劳资已经帮你搞完了。
总结
这五种模型每一种都有很深的学问,博主在这里只是用我自己所理解的知识来简单的介绍一下这五种模型,但是如果你对其中的I/O模型有浓厚的兴趣,可以自行对每一种模型进行进一步深度学习。这里我推荐I/O复用模型,因为Netty的底层就是使用的该模型。
Netty基础系列(1) --linux网路I/O模型的更多相关文章
- Netty基础系列(3) --彻底理解NIO
前言 上一节中我们提到了同步异步与阻塞非阻塞的区别,知道了同步并不等于阻塞.而本节的主角NIO是一种同步非阻塞的I/O模型,并且是I/O多路复用模型.NIO在java中被称为 New I/O.它并不能 ...
- Netty基础系列(4) --堆外内存与零拷贝详解
前言 到目前为止,我们知道Nio当中有三个最最核心的组件,分别是:Selelctor,Channel,Buffer.在Netty基础系列(3) --彻底理解NIO 这一篇文章中只是进行了大致的介绍. ...
- 【夯实PHP基础系列】linux下yum安装PHP APC
Alternative PHP Cache(可选PHP缓存),依赖于 PECL扩展库 用源码方式安装,直接yum就行了:首先要安装apc的依赖包:yum install php-pear php-de ...
- Netty基础系列(2) --彻底理解阻塞非阻塞与同步异步的区别
引言 在进行I/O学习的时候,阻塞和非阻塞,同步和异步这几个概念常常被提及,但是很多人对这几个概念一直很模糊.要想学好Netty,这几个概念必须要掌握清楚. 同步和异步 同步与异步的区别在于,异步基于 ...
- Netty基础系列(5) --零拷贝彻底分析
前言 上一节(堆外内存与零拷贝)当中我们从jvm堆内存的视角解释了一波零拷贝原理,但是仅仅这样还是不够的. 为了彻底搞懂零拷贝,我们趁热打铁,接着上一节来继续讲解零拷贝的底层原理. 感受一下NIO的速 ...
- 大数据入门基础系列之Hadoop1.X、Hadoop2.X和Hadoop3.X的多维度区别详解(博主推荐)
不多说,直接上干货! 在前面的博文里,我已经介绍了 大数据入门基础系列之Linux操作系统简介与选择 大数据入门基础系列之虚拟机的下载.安装详解 大数据入门基础系列之Linux的安装详解 大数据入门基 ...
- Netty入门系列(1) --使用Netty搭建服务端和客户端
引言 前面我们介绍了网络一些基本的概念,虽然说这些很难吧,但是至少要做到理解吧.有了之前的基础,我们来正式揭开Netty这神秘的面纱就会简单很多. 服务端 public class PrintServ ...
- linux驱动基础系列--linux spi驱动框架分析
前言 主要是想对Linux 下spi驱动框架有一个整体的把控,因此会忽略某些细节,同时里面涉及到的一些驱动基础,比如平台驱动.设备模型等也不进行详细说明原理.如果有任何错误地方,请指出,谢谢! spi ...
- linux驱动基础系列--linux spi驱动框架分析(续)
前言 这篇文章是对linux驱动基础系列--linux spi驱动框架分析的补充,主要是添加了最新的linux内核里设备树相关内容. spi设备树相关信息 如之前的文章里所述,控制器的device和s ...
随机推荐
- 影响Sql server性能的因素
目前本人在看<SQL Server性能调优实战> ,以下内容是本人看书笔记 数据库性能取决于各方面综合因素: 硬件,操作系统,软件 硬件:内存,CPU,磁盘 当服务器的物理内存不足时,会产 ...
- python---数据类型---列表
#列表: name = ["lc","pxm","pt"] print('------------',name[2],"----- ...
- Lintcode397 Longest Increasing Continuous Subsequence solution 题解
[题目描述] Give an integer array,find the longest increasing continuous subsequence in this array. An in ...
- centos/linux 禁止root用户远程登录
注意:在禁止root等前要建立一个用户用来远程登录,否则退出后无法通过远程登录服务器. 编辑 /etc/ssh/sshd_config 文件 更改参数 PermitRootLogin yes 为 Pe ...
- JSF-页面导航
页面导航 1)导航处理涉及的术语: -动作值:触发动作事件的组件的action:EL方法表达式.字符串文字. -结果值:动作组件的action属性的:EL方法表达式的返回值.字符串文字:或结果组件的o ...
- java之Spring(AOP)前奏-动态代理设计模式(上)
我们常常会遇到这样的事,项目经理让你为一个功能类再加一个功能A,然后你加班为这个类加上了功能A: 过了两天又来了新需求,再在A功能后面加上一个新功能B,你加班写好了这个功能B,加在了A后面:又过 了几 ...
- AVL Tree 操作
1.AVL树是带有平衡条件的二叉查找树, 一棵AVL树是其每个节点的左子树和右子树的高度最多差1的二叉查找树. 2.AVL树的删除要比插入复杂.如果删除相对较少,那么用懒惰删除的方法是最好的策略. 3 ...
- 正则表达式re模块小结
re模块的常用方法 1.compile(pattern[,flags]) 创建模式对象,一般配合其他方法使用.例如: import re #导入re模块 text = 'All that doth f ...
- 第五章 MySQL函数
一.数学函数 (1) 绝对值函数:ABS(x) ABS(x) 用于返回 x 的绝对值 mysql> SELECT ABS(2), ABS(-2.3), ABS(-33); +--------+- ...
- JS 数据类型、赋值、深拷贝和浅拷贝
js 数据类型 六种 基本数据类型: Boolean. 布尔值,true 和 false. null. 一个表明 null 值的特殊关键字. JavaScript 是大小写敏感的,因此 null 与 ...