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 ...
随机推荐
- Redis的Java使用入门
因项目需要,最近简单学习了redis的使用 redis在服务器centos环境下安装比较简单. 如果要在windows上安装,可以参考别人的文章 http://blog.csdn.net/renfuf ...
- Docker 三剑客之 Docker Swarm(基于 overlay 组网通信)
相关文章:Docker 三剑客之 Docker Swarm 这一篇主要是对 Docker Swarm 的完善,增加基于 overlay 组网通信,以便 Docker 容器可以跨主机访问. 不同主机间的 ...
- java--接口的定义与实现
利用接口方法计算矩形面积 代码如下: //接口的定义与实现[public] interface A{ //定义一个接口[public] [static][final] void conter(doub ...
- 爬虫初探--PHP
我有收藏的cms网站,偶尔会下载一些资源,老司机都懂的:-D.然后有一次好几天没上,堆了好些没弄,心想:cao,这好麻烦啊,能不能写个脚本自动帮我搞?然后忽然就想到,这是不是就是所谓的爬虫呢?心中一阵 ...
- nginx基本配置参数说明
#运行用户 user nobody; #启动进程,通常设置成和cpu的数量相等 worker_processes 1; #全局错误日志及PID文件 #error_log logs/error.log; ...
- 第一课:Hadoop集群环境搭建
一. 检查列表 1.1.网络访问 设置电脑IP以及可以访问网络设置:进入etc/sysconfig/network-scripts/,使用命令"ls -all" 查看文件.会看到i ...
- 在win10下给vs2013配置opencv3.0
opencv这玩意是真难搞呀. 先吐槽下..... 下面进入正文. 1准备工具: opencv3.0+vs2013 这里面不提供链接下载,自行谷歌百度. 2配置环境: a.打开下载好的opencv(解 ...
- 关于css盒模型
在css中,width和height指的是内容区域的宽度和高度.增加内边距,边框和外边距不会影响内容区域的尺寸,但是会增加元素框的总尺寸.假设框的每个边上有10个像素的外边距和5像素的内边距,如果希望 ...
- java(一、概念和开发工具)
Java 简介 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称.由James Gosling和同事们共同研发,并在1995年正式 ...
- spring cloud 入门系列七:基于Git存储的分布式配置中心
我们前面接触到的spring cloud组件都是基于Netflix的组件进行实现的,这次我们来看下spring cloud 团队自己创建的一个全新项目:Spring Cloud Config.它用来为 ...