BIO,NIO的区别,使用场景。
一、什么是io?
i就是input,输入,o就是output,输出,合起来就是以流为基本的输入输出。
二、传统的io
传统的服务器端同步阻塞I/O处理(也就是BIO,Blocking I/O):
当客户端有请求到服务端的时候,服务端就会开启一个线程进行处理,当有多个请求进入时,就会开启多个线程分别处理对应的请求。
现在的多线程一般都使用线程池,可以让线程的创建和回收成本相对较低。在活动连接数不是特别高(小于单机1000)的情况下,这种模型是比较不错的,可以让每一个连接专注于自己的I/O并且编程模型简单,也不用过多考虑系统的过载、限流等问题、
三:NIO出现的原因背景
当面对十万甚至百万级连接的时候,传统的BIO模型是无能为力的。随着移动端应用的兴起和各种网络游戏的盛行,百万级长连接日趋普遍,此时,必然需要一种更高效的I/O处理模型。
大多数客户端BIO+连接池模型,可以建立n个连接,然后当某一个连接被I/O占用的时候,可以使用其他连接来提高性能。
但多线程的模型面临和服务端相同的问题:如果指望增加连接数来提高性能,则连接数又受制于线程数、线程很贵、无法建立很多线程,则性能遇到瓶
四:常见的I\O模型对比:
以socket.read()为例子:
- 传统的BIO里面socket.read(),如果TCP RecvBuffer里没有数据,函数会一直阻塞,直到收到数据,返回读到的数据。
- 对于NIO,如果TCP RecvBuffer有数据,就把数据从网卡读到内存,并且返回给用户;反之则直接返回0,永远不会阻塞。
- 最新的AIO(Async I/O)里面会更进一步:不但等待就绪是非阻塞的,就连数据从网卡到内存的过程也是异步的。
- 换句话说,BIO里用户最关心“我要读”,NIO里用户最关心"我可以读了",在AIO模型里用户更需要关注的是“读完了”。
- NIO一个重要的特点是:socket主要的读、写、注册和接收函数,在等待就绪阶段都是非阻塞的,真正的I/O操作是同步阻塞的(消耗CPU但性能非常高)。
NIO存在的问题
使用NIO != 高性能,当连接数<1000,并发程度不高或者局域网环境下NIO并没有显著的性能优势。
NIO并没有完全屏蔽平台差异,它仍然是基于各个操作系统的I/O系统实现的,差异仍然存在。使用NIO做网络编程构建事件驱动模型并不容易,陷阱重重。
推荐大家使用成熟的NIO框架:如Netty,MINA等,解决了很多NIO的陷阱,并屏蔽了操作系统的差异,有较好的性能和编程模型。
五:NIO总结
NIO给我们带来了些什么:
- 事件驱动模型
- 避免多线程
- 单线程处理多任务
- 非阻塞I/O,I/O读写不再阻塞,而是返回0
- 基于block的传输,通常比基于流的传输更高效
- 更高级的IO函数,zero-copy
- IO多路复用大大提高了Java网络应用的可伸缩性和实用性
转载于:https://www.cnblogs.com/takemyjavalisfe/p/10096338.html
BIO,NIO的区别,使用场景。相关推荐
- bio nio aio区别_8分钟深入浅出搞懂BIO、NIO、AIO
在高性能的IO体系设计中,BIO.NIO.AIO的概念,常常会让我们感到困惑不解.在Java面试中,我们也经常会被问到这个问题.譬如: BIO.NIO.AIO 的概念 同步/异步.阻塞/非阻塞的区别 ...
- Java之BIO NIO AIO区别联系
1F 说一说I/O 首先来说一下什么是I/O? 在计算机系统中I/O就是输入(Input)和输出(Output)的意思,针对不同的操作对象,可以划分为磁盘I/O模型,网络I/O模型,内存映射I/O, ...
- bio nio aio区别_什么是BIO、NIO和AIO?
周末午后,在家里面进行电话面试,我问了面试者几个关于IO的问题,其中包括什么是BIO.NIO和AIO?三者有什么区别?具体如何使用等问题,但是面试者回答的并不是很满意.于是我在面试评价中写道:&quo ...
- BIO NIO AIO 介绍与差别
个人介绍: 怠惰的程序员,致力于提供有效且完整的资料 所以资料经过真实测试,欢迎各位沟通讨论,如有问题请留言评论区. 对于问题博主会勤勉的进行验证和修改文章. 文章目录 一.总结 二.io 阻塞与非阻 ...
- 从 Netpoll 中寻找 BIO/NIO 编程模型的对比 | Netpoll 源码解读
前言 最近在阅读<Go 组件设计与实现>这本小册,其中让我很感兴趣的一点是为什么在字节开源中间件团队 CloudWeGo 所开发的网络库 Netpoll 中使用了 NIO 模型,而没有使用 ...
- BIO和NIO的区别
BIO:同步阻塞式IO,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善. NI ...
- BIO ,NIO,AIO的区别
IO的方式通常分为几种,同步阻塞的BIO.同步非阻塞的NIO.异步非阻塞的AIO. 一.BIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSock ...
- NIO和BIO和AIO区别
这里写目录标题 tcp/ip协议: 三次握手和四次分手名词解释: http与tcp/ip协议的区别: NIO和BIO和AIO区别: NIO的三大核心组件关系 Channel Buffer buffer ...
- IO之 java中BIO NIO AIO原理、区别以及应用
在本篇文章中,我们主要介绍一下java中的BIO NIO AIO,重点是NIO 先说一下同步.异步.阻塞和非阻塞. 简单来讲,同步和异步是针对内核和应用程序之间的交互而言的:阻塞和非阻塞其实是针对进程 ...
- 网络编程中BIO和NIO的区别
网络编程中BIO和NIO的区别 先上结论 BIO中,每个请求因为要阻塞直到结果返回,所以比较好的解决是每个请求都需要一个线程来处理,但是线程又是他的制约条件. NIO中,每个请求进来都会绑定到一个ch ...
最新文章
- CVPR 2019 | 百度17篇论文入选,AI巨头都在关注什么?(附论文下载)
- python中的format函数_python中的format 函数是什么?如何使用?
- vue-11-路由嵌套-参数传递-路由高亮
- Linux运维之道之ENGINEER1.3(配置SMB共享,配置NFS共享)
- cublas matlab,Check failed: status == CUBLAS_STATUS_SUCCESS (11 vs. 0) CUBLAS_STATUS_MAPPING_ERROR
- python 遍历两个列表_python 如何在一个for循环中遍历两个列表
- 使用keytool 生成证书
- C语言国二上机题库,【高分飘过】2013年国二C语言上机题库(必备完美版).doc
- MPEG4写为avi文件
- 北京上空出现三个太阳?专家:冰晶云对太阳光散射形成“幻日”
- vnc远程控制软件配置,如何对vnc远程控制软件配置
- 路由控制配置network命令解析
- 教你用Python感受量子霸权
- kettle 在Linux下执行kjb
- android Studio Crunching Cruncher
- 解决VS Community“无法刷新此账户的凭证”和“无法添加此账户”的问题
- java游戏主角叶开,逸之老板的天机城与叶开大神女魃墓,决赛场上谁更抢眼?...
- uniapp打开地图选择位置(查看位置)详解
- html5中扇形的绘制
- Linux 离线安装 autoformat