BIO & NIO & NIO常见框架
BIO & NIO
BIO - Blocking IO - 同步式阻塞式IO --- UDP/TCP
NIO - New IO - 同步式非阻塞式IO
AIO - AsynchronousIO - 异步式非阻塞式IO - jdk1.8
BIO的缺点:
1.会产生阻塞行为 --- receive/accept/connect/read/write
2.一对一的连接:每连接一个客户端,在服务器端就需要开启一个线程去处理请求.在客户端较多的情况下,服务器端就会产生大量的线程 - 耗费内存
3.连接建立之后如果不发生任何的操作.那么就会导致服务器中的这个线程依然被占用,耗费服务器的资源
4.无法实现定点操作
NIO的三个基本组件:
Buffer-缓冲区, Channel-通道, Selector-多路复用选择器
Buffer-缓冲区
容器 - 存储数据 - 在底层存储数据的时候实际上是以数组形式来存储
capacity - 容量位 - 指定缓冲区的容量
limit - 限制位 - 限制操作位所能达到的尺度
position - 操作位 - 指定要操作的位置
mark - 标记位 - 标记位置,认为标记位置之前的数据是已经操作过的没有错误的数据
mark <= position <= limit <= capacity
flip - 反转缓冲区:先将限制位挪到操作位上, 然后将操作位归零, 清空标记位
clear - 清空缓冲区: 将操作位归零,将limit挪到capacity,将标记位清空
reset - 重置缓冲区: 将操作位挪到标记位
rewind - 重绕缓冲区: 将操作位归零,将标记位清空 --- 缓冲区多次读取
Channel-通道
传输数据 - 是面向缓冲区的。在java中,Channel默认也是阻塞的,需要手动将其设置为非阻塞模式。
BIO: File、UDP - DatagramSocket、TCP - Socket, ServerSocket
NIO: FileChannel、UDP - DatagramChannel、TCP - SocketChannel, ServerSocketChannel
FileChannel - 操作文件,可以利用通道实现相同平台之间的零拷贝技术。
Selector-多路复用选择器
进行选择 - 是面向通道进行操作。要求通道在使用的时候必须设置为非阻塞
客户端
可连接,可读、可写
服务端
可接受,可读,可写
通过Selector可以实现利用同一个服务器端来处理多个客户端的数据 --- 可以用少量线程处理大量的请求 --- 在底层处理的时候实际上依然是同步的
NIO的优势:
1.非阻塞:提高传输效率
2.一对多的连接:可以用一个或者少量的服务器中的线程来处理大量的请求,从而节省服务器的内存资源
3.即使已经建立连接,只要没有对应的读写事件,那么依然不能够使用服务器来进行处理
4.利用通道实现数据的双向传输
5.因为利用缓冲区来存储数据,所以可以对缓冲区中的数据实现定点操作
NIO常见框架比较
一.通信框架
流行基于Java NIO通信框架有Mina、Netty、Grizzly等。接下来说下它们之间的对比。 二.它们的出身
Mina出身于开源界的大牛Apache组织;
Netty出身于商业开源大亨Jboss;
Grizzly则出身于Sun公司。
三.它们的设计理念
1、Mina
Mina(Multipurpose Infrastructure for Network Applications) 是 Apache 组织一个较新的项目,它为开发高性能
和高可用性的网络应用程序提供了非常便利的框架。当前发行的 Mina 版本2.04支持基于 Java NIO 技术的
TCP/UDP 应用程序开发、串口通讯程序,Mina 所支持的功能也在进一步的扩展中。 目前,正在使用Mina的应用
包括:Apache Directory Project、AsyncWeb、AMQP(Advanced Message Queuing Protocol)、RED5
Server(Macromedia Flash Media RTMP)、ObjectRADIUS、 Openfire等等。
2、Netty
Netty是一款异步的事件驱动的网络应用框架和工具,用于快速开发可维护的高性能、高扩展性协议服务器和客户
端。也就是说,Netty是一个NIO客户端/服务器框架,支持快速、简单地开发网络应用,如协议服务器和客户端。
它极大简化了网络编程,如TCP和UDP套接字服务器。
3、Grizzly
Grizzly是一种应用程序框架,专门解决编写成千上万用户访问服务器时候产生的各种问题。使用JAVA NIO作为基
础,并隐藏其编程的复杂性。容易使用的高性能的API。带来非阻塞socket到协议处理层。利用高性能的缓冲和缓
冲管理使用高性能的线程池。
从设计的理念上来看,Mina的设计理念是最为优雅的。当然,由于Netty的主导作者与Mina的主导作者是同一人,
出自同一人之手的Netty在设计理念上与Mina基本上是一致的。而Grizzly在设计理念上就较差了点,几乎是
JavaNIO的简单封装。
四.Netty为什么这么火?
Netty是目前最流行的由JBOSS提供的一个Java开源框架NIO框架,Netty提供异步的、事件驱动的网络应用程序框
架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。 相比JDK原生NIO,Netty提供了相对十分
简单易用的API,非常适合网络编程。Netty是完全基于NIO实现的,所以Netty是异步的。
作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Listener机制,用户可以方便的主动
获取或者通过通知机制获得IO操作结果。
Netty无疑是NIO的老大,它的健壮性、功能、性能、可定制性和可扩展性在同类框架都是首屈一指的。它已经得
到成百上千的商业/商用项目验证,如Hadoop的RPC框架Avro、RocketMQ以及主流的分布式通信框架Dubbo等
等。 为什么这么火,是有原因的。
Netty的优点可以总结如下:
API使用简单,开发门槛低;
功能强大,预置了多种编解码功能,支持多种主流协议;
定制能力强,可以通过ChannelHandler对通信框架进行灵活地扩展;
性能高,通过与其他业界主流的NIO框架对比,Netty的综合性能最优;
成熟、稳定,Netty修复了已经发现的所有JDK NIO BUG,业务开发人员不需要再为NIO的BUG而烦
恼;
社区活跃,版本迭代周期短,发现的BUG可以被及时修复,同时,更多的新功能会加入;
经历了大规模的商业应用考验,质量得到验证。在互联网、大数据、网络游戏、企业应用、电信软件等
众多行业得到成功商用,证明了它已经完全能够满足不同行业的商业应用了。
与Mina相比有什么优势:
1. 都是Trustin Lee的作品,Netty更晚;
2. Mina将内核和一些特性的联系过于紧密,使得用户在不需要这些特性的时候无法脱离,相比下性能会有
所下降,Netty解决了这个设计问题;
3. Netty的文档更清晰,很多Mina的特性在Netty里都有;
4. Netty更新周期更短,新版本的发布比较快;
5. 它们的架构差别不大,Mina靠apache生存,而Netty靠jboss,和jboss的结合度非常高,Netty有对
google protocal buf的支持,有更完整的ioc容器支持(spring,guice,jbossmc和osgi);
6. Netty比Mina使用起来更简单,Netty里你可以自定义的处理upstream events或/和downstream
events,可以使用decoder和encoder来解码和编码发送内容;
7. Netty和Mina在处理UDP时有一些不同,Netty将UDP无连接的特性暴露出来;而Mina对UDP进行了高
级层次的抽象,可以把UDP当成"面向连接"的协议,而要Netty做到这一点比较困难。
8. 从任务调度粒度上看,mina会将有IO任务的session写入队列中,当循环执行任务时,则会轮询所有的
session,并依次把session中的所有任务取出来运行。这样粗粒度的调度是不公平调度,会导致某些请
求的延迟很高。
BIO & NIO & NIO常见框架的更多相关文章
- 从 BIO、NIO 聊到 Netty,最后还要实现个 RPC 框架!
大家好,我是 「后端技术进阶」 作者,一个热爱技术的少年. 觉得不错的话,欢迎 star!ღ( ´・ᴗ・` )比心 Netty 从入门到实战系列文章地址:https://github.com/Snai ...
- 京东数科二面:常见的 IO 模型有哪些?Java 中的 BIO、NIO、AIO 有啥区别?
IO 模型这块确实挺难理解的,需要太多计算机底层知识.写这篇文章用了挺久,就非常希望能把我所知道的讲出来吧!希望朋友们能有收货!为了写这篇文章,还翻看了一下<UNIX 网络编程>这本书,太 ...
- 京东数科面试真题:常见的 IO 模型有哪些?Java 中的 BIO、NIO、AIO 有啥区别?
本文节选自<Java面试进阶指北 打造个人的技术竞争力> 面试中经常喜欢问的一个问题,因为通过这个问题,面试官可以顺便了解一下你的操作系统的水平. IO 模型这块确实挺难理解的,需要太多计 ...
- 操作系统层面聊聊BIO,NIO和AIO (epoll)
BIO 有了Block的定义,就可以讨论BIO和NIO了.BIO是Blocking IO的意思.在类似于网络中进行read, write, connect一类的系统调用时会被卡住. 举个例子,当用re ...
- Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码)
本文会从传统的BIO到NIO再到AIO自浅至深介绍,并附上完整的代码讲解. 下面代码中会使用这样一个例子:客户端发送一段算式的字符串到服务器,服务器计算后返回结果到客户端. 代码的所有说明,都直接作为 ...
- 阿里面试题BIO和NIO数量问题附答案和代码
一.问题 BIO 和 NIO 作为 Server 端,当建立了 10 个连接时,分别产生多少个线程? 答案: 因为传统的 IO 也就是 BIO 是同步线程堵塞的,所以每个连接都要分配一个专用线程来处理 ...
- BIO 和 NIO
一.阻塞(Block)和非阻塞(NonBlock) 阻塞和非阻塞是进程在访问数据的时候,数据是否准备就绪的一种处理方式,当数据没有准备的时候阻塞: 阻塞:往往需要等待缞冲区中的数据准备好过后才处理其他 ...
- Java BIO、NIO、AIO
同步与异步 同步与异步的概念, 关注的是 消息通信机制 同步是指发出一个请求, 在没有得到结果之前该请求就不返回结果, 请求返回时, 也就得到结果了. 比如洗衣服, 把衣服放在洗衣机里, 没有洗好之前 ...
- Java IO:BIO和NIO差别及各自应用场景
转载请注明出处:jiq•钦's technical Blog - 季义钦 引言 BIO和NIO是两种不同的网络通信模型,现现在NIO已经大量应用在Jetty.ZooKeeper.Netty等开源框架中 ...
随机推荐
- 自动化-python介绍与基础
1.1-python的介绍: 简单点来说吧,python这玩意儿是一个叫做Guido van Rossum的程序猿在1989年的圣诞打发时间而决心去开发的一个脚本编程语言.它之前的名字是以abc语言的 ...
- ajax及其工作原理
1.关于ajax的名字 ajax 的全称是Asynchronous JavaScript and XML,其中,Asynchronous 是异步的意思,它有别于传统web开发中采用的同步的方式. 2. ...
- LeetCode - Partition Labels
A string S of lowercase letters is given. We want to partition this string into as many parts as pos ...
- software download
Develop Sourceinsight 3.50.0066 http://pan.baidu.com 这个版本支持输入文件名的一部分来查找文件,而不像3.50.0029必须输入完整的文件名 VFP ...
- lnmp安装总结
1.安装准备 建一个目录用于存放各软件包的压缩文件, 如我把我的源码文件都放在了 /software目录下 切换到/software目录下,执行 wget http://dev.mysql.com/g ...
- auto sudo password in shell
here is the example how to implement the auto password in shell script. Echo yourpasswordhere | sudo ...
- IT痴汉的工作现状11-程序猿的烦恼
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/lincyang/article/details/25535181 痴汉们事实上是非常 ...
- extundelete
http://extundelete.sourceforge.net/options.html 误删除/usr/share目录因此考虑恢复目录过程如下:1.选用extundelete软件来进行恢复,源 ...
- k8s-YAML配置文件
一.YAML基础 YAML是专门用来写配置文件的语言,非常简洁和强大,使用比json更方便.它实质上是一种通用的数据串行化格式. YAML语法规则: 大小写敏感 使用缩进表示层级关系 缩进时不允许使用 ...
- 我发起了一个 .Net 平台上的 产生式编程 开源项目 GP.Net
大家好 , 我发起了一个 .Net 平台上的 产生式编程 开源项目 GP.Net . 我们可以先看看一个网友的 代码生成器 项目 : <.Net 代码生成器 for PostgreSql> ...