一、什么是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的区别,使用场景。相关推荐

  1. bio nio aio区别_8分钟深入浅出搞懂BIO、NIO、AIO

    在高性能的IO体系设计中,BIO.NIO.AIO的概念,常常会让我们感到困惑不解.在Java面试中,我们也经常会被问到这个问题.譬如: BIO.NIO.AIO 的概念 同步/异步.阻塞/非阻塞的区别 ...

  2. Java之BIO NIO AIO区别联系

    1F 说一说I/O 首先来说一下什么是I/O? 在计算机系统中I/O就是输入(Input)和输出(Output)的意思,针对不同的操作对象,可以划分为磁盘I/O模型,网络I/O模型,内存映射I/O, ...

  3. bio nio aio区别_什么是BIO、NIO和AIO?

    周末午后,在家里面进行电话面试,我问了面试者几个关于IO的问题,其中包括什么是BIO.NIO和AIO?三者有什么区别?具体如何使用等问题,但是面试者回答的并不是很满意.于是我在面试评价中写道:&quo ...

  4. BIO NIO AIO 介绍与差别

    个人介绍: 怠惰的程序员,致力于提供有效且完整的资料 所以资料经过真实测试,欢迎各位沟通讨论,如有问题请留言评论区. 对于问题博主会勤勉的进行验证和修改文章. 文章目录 一.总结 二.io 阻塞与非阻 ...

  5. 从 Netpoll 中寻找 BIO/NIO 编程模型的对比 | Netpoll 源码解读

    前言 最近在阅读<Go 组件设计与实现>这本小册,其中让我很感兴趣的一点是为什么在字节开源中间件团队 CloudWeGo 所开发的网络库 Netpoll 中使用了 NIO 模型,而没有使用 ...

  6. BIO和NIO的区别

    BIO:同步阻塞式IO,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善.   NI ...

  7. BIO ,NIO,AIO的区别

    IO的方式通常分为几种,同步阻塞的BIO.同步非阻塞的NIO.异步非阻塞的AIO. 一.BIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSock ...

  8. NIO和BIO和AIO区别

    这里写目录标题 tcp/ip协议: 三次握手和四次分手名词解释: http与tcp/ip协议的区别: NIO和BIO和AIO区别: NIO的三大核心组件关系 Channel Buffer buffer ...

  9. IO之 java中BIO NIO AIO原理、区别以及应用

    在本篇文章中,我们主要介绍一下java中的BIO NIO AIO,重点是NIO 先说一下同步.异步.阻塞和非阻塞. 简单来讲,同步和异步是针对内核和应用程序之间的交互而言的:阻塞和非阻塞其实是针对进程 ...

  10. 网络编程中BIO和NIO的区别

    网络编程中BIO和NIO的区别 先上结论 BIO中,每个请求因为要阻塞直到结果返回,所以比较好的解决是每个请求都需要一个线程来处理,但是线程又是他的制约条件. NIO中,每个请求进来都会绑定到一个ch ...

最新文章

  1. CVPR 2019 | 百度17篇论文入选,AI巨头都在关注什么?(附论文下载)
  2. python中的format函数_python中的format 函数是什么?如何使用?
  3. vue-11-路由嵌套-参数传递-路由高亮
  4. Linux运维之道之ENGINEER1.3(配置SMB共享,配置NFS共享)
  5. cublas matlab,Check failed: status == CUBLAS_STATUS_SUCCESS (11 vs. 0) CUBLAS_STATUS_MAPPING_ERROR
  6. python 遍历两个列表_python 如何在一个for循环中遍历两个列表
  7. 使用keytool 生成证书
  8. C语言国二上机题库,【高分飘过】2013年国二C语言上机题库(必备完美版).doc
  9. MPEG4写为avi文件
  10. 北京上空出现三个太阳?专家:冰晶云对太阳光散射形成“幻日”
  11. vnc远程控制软件配置,如何对vnc远程控制软件配置
  12. 路由控制配置network命令解析
  13. 教你用Python感受量子霸权
  14. kettle 在Linux下执行kjb
  15. android Studio Crunching Cruncher
  16. 解决VS Community“无法刷新此账户的凭证”和“无法添加此账户”的问题
  17. java游戏主角叶开,逸之老板的天机城与叶开大神女魃墓,决赛场上谁更抢眼?...
  18. uniapp打开地图选择位置(查看位置)详解
  19. html5中扇形的绘制
  20. Linux 离线安装 autoformat

热门文章

  1. Javascript中的Trait与代码重用
  2. 《Web测试囧事》——1.3 测试Web Service能否正常提供JSON数据
  3. [Deep Learning] 神经网络基础
  4. 服务器安全设置篇(珍藏补充版中)
  5. Wireshark实战分析之DHCP协议(二)
  6. Linux下安装Win10ARM,更多安卓旗舰机将可以安装运行Win10 ARM
  7. 使用BCC工具获取Linux内核空间read/write操作的文件名
  8. 初识SONiC,官方文档
  9. Qt调用jrtplib实现单播、多播和广播
  10. linux内存源码分析 - 内存池