[转]BIO/NIO/AIO的几个思考
原文:https://www.jianshu.com/p/ff29e028af07
-----------------------------------------------------
BIO/NIO/AIO中的IO指的是什么?为什么网上一讲到BIO/NIO/AIO就是Socket编程、网络编程blabla一堆?NIO是不是就是java nio库?
其实这是笔者的一大疑问,我们最常接触的IO不应该是文件IO么,怎么一上来就是Socket编程、网络编程blabla一大堆。这大概要从IO的概念和发展历史来理解了(以下观点包含大量个人理解):
广义上来讲,IO(Input/Output)可以指任何系统or设备之间的数据输入输出操作,我们这边讨论的是应用程序与其他应用程序or IO设备之间的数据传输,而这个数据传输的过程抽象就叫IO,BIO/NIO/AIO只是IO过程的不同模型,全称分别是blocking-io阻塞式的IO,non-blocking-io非阻塞式的IO,asynchronized-io异步式的IO,概念上来说BIO/NIO/AIO适用于文件IO、网络IO等所有的IO,具体看是否有相关的实现罢了。至于网上为什么都是Socket编程、网络编程,主要是因为NIO/AIO的出现本身就是因为BIO模型的效率不足以适应高并发的网络环境,为了提高网络IO并发处理效率而产生的,在文件IO系统中应用好处并不是非常大,所以慢慢地提到NIO/AIO默认视为网络IO了。讲到这,应该也能清楚NIO≠java.nio,NIO是一种IO模型,java.nio只是一个实现库,而且全称是new io,区别有原来的io库罢了,里面不仅包含NIO的实现,还包含AIO的实现。
BIO vs NIO,Blocking到底指的啥?为啥NIO能提高并发效率?
首先,我们需要理解网络IO的整个过程,网络IO主要分为两个部分or状态:网卡可读、应用程序可读(真正可读)。这两个部分其实很好理解,当一个网络请求过来时,都是先经由网卡接收数据,然后再把数据从网卡读入内存中,这样才完成了整个IO操作。BlO和NIO的区别在于在应用程序可读之前,BIO会阻塞线程,NIO则是会立即返回结果。至于这样为什么会提高并发效率,举个例子:
假设网卡读写时间为2s,应用程度读写时间为1s
BIO模型下每个连接的耗时为3s,处理能力为20个/分钟;
而NIO模型下,应用程序无需等待那些处于网卡可读状态的连接,所以每个连接耗时为1s,处理能力为60个/分钟!
除此之外,NIO还支持同时监听多个IO渠道,面向缓冲区支持双向操作,这些也是其优点。
有了NIO还不够?AIO又是干嘛的?
AIO模型的定义是缓冲区与底层IO系统之间的数据读写操作都是由操作系统完成的,上层应用程序都是通过回调函数的方式去操作缓冲区的数据,对于上层应用程序来说只关心缓冲区数据读写好了的结果,并不关心数据从哪里来到哪里去的过程。至于为什么AIO会出现,这个笔者也未完全理解,主流的说法是NIO Selector检查通道是否可读/写时采用是轮询操作,效率上仍存在改进的空间,而AIO完全基于系统层面的事件通知,不需要主动去轮询,效率上来说更加高效。
作者:ohzyo
链接:https://www.jianshu.com/p/ff29e028af07
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
[转]BIO/NIO/AIO的几个思考的更多相关文章
- IO回忆录之怎样过目不忘(BIO/NIO/AIO/Netty)
有热心的网友加我微信,时不时问我一些技术的或者学习技术的问题.有时候我回微信的时候都是半夜了.但是我很乐意解答他们的问题.因为这些年轻人都是很有上进心的,所以在我心里他们就是很优秀的,我愿意多和努力的 ...
- 对于BIO/NIO/AIO,你还只停留在烧开水的水平吗?
1.发发牢骚 相信大家在网上看过不少讲解 BIO/NIO/AIO 的文章,文章中举起栗子来更是夯吃夯吃一大堆,我是越看越觉得 What are you 你讲啥嘞? 本文将针对 BIO/NIO/AIO ...
- [转]对于BIO/NIO/AIO,你还只停留在烧开水的水平吗
原文:https://www.javazhiyin.com/40106.html https://coding.imooc.com/class/381.html ------------------- ...
- (转)也谈BIO | NIO | AIO (Java版)
原文地址: https://my.oschina.net/bluesky0leon/blog/132361 关于BIO | NIO | AIO的讨论一直存在,有时候也很容易让人混淆,就我的理解,给出一 ...
- 拿搬东西来解释udp tcpip bio nio aio aio异步
[群主]雷欧纳德简单理解 tcpip是有通信确认的面对面通信 有打招呼的过程 有建立通道的过程 有保持通道的确认 有具体传输udp是看到对面的人好像在对面等你 就往对面扔东西[群主]雷欧 ...
- 也谈BIO | NIO | AIO (Java版--转)
关于BIO | NIO | AIO的讨论一直存在,有时候也很容易让人混淆,就我的理解,给出一个解释: BIO | NIO | AIO,本身的描述都是在Java语言的基础上的.而描述IO,我们需要从两个 ...
- Netty5序章之BIO NIO AIO演变
Netty5序章之BIO NIO AIO演变 Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能.高可靠的网络服务器和客户端程序.Netty简化了网络程序的开发,是很多框架和公司都在使 ...
- I/O模型系列之三:IO通信模型BIO NIO AIO
一.传统的BIO 网络编程的基本模型是Client/Server模型,也就是两个进程之间进行相互通信,其中服务端提供位置信息(绑定的IP地址和监听端口),客户端通过连接操作向服务端监听的地址发起连接请 ...
- 【netty】(1)---BIO NIO AIO演变
BIO NIO AIO演变 Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能.高可靠的网络服务器和客户端程序.Netty简化了网络程序的开发,是很多框架和公司都在使用的技术. Net ...
随机推荐
- centos7 双网口绑定
1.关闭和停止NetworkManager服务 systemctl stop NetworkManager.service # 停止NetworkManager服务 systemctl disable ...
- ubuntu18.10 安装nodejs
进入官网下载页面 下载对应版本 2.解压tar.xz文件在linux下,大部分情况下不能直接解压tar.xz的文件. 需要用 xz -d xxx.tar.xz 将 xxx.tar.xz解压成 xxx. ...
- LeetCode 674. 最长连续递增序列(Longest Continuous Increasing Subsequence) 18
674. 最长连续递增序列 674. Longest Continuous Increasing Subsequence 题目描述 给定一个未经排序的整型数组,找到最长且连续的递增序列. Given ...
- linux 加载新的磁盘(卷组)
pvcreate /dev/vdbvgcreate datavg /dev/vdblvcreate -n datalv -L 99.8G datavgmkfs.ext3 /dev/datavg/dat ...
- [转帖]大数据hadoop与spark的区别
大数据hadoop与spark的区别 https://www.cnblogs.com/adnb34g/p/9233906.html Posted on 2018-06-27 14:43 左手中倒影 阅 ...
- Python 解LeetCode:394 Decode String
题目描述:按照规定,把字符串解码,具体示例见题目链接 思路:使用两个栈分别存储数字和字母 注意1: 数字是多位的话,要处理后入数字栈 注意2: 出栈时过程中产生的组合后的字符串要继续入字母栈 注意3: ...
- java实现屏幕截屏功能
最近在项目中遇到这样一个需求,用户生成推广海报想要发送给朋友,但是推广海报是用html网页写的,这时候想要分享给朋友的话只能用户自己手机截图,显然这样的用户体验是不友好的,如果可以给用户一个按钮实现一 ...
- 09 IO流(六)——ByteArray字节流、流对接
字节数组流 ByteArray流是节点流. 前面讲到的文件字节流,文件字符流,他们的源都是来自于pc硬盘. 本节要讲的字节数组流的源是来自于内存或网络. 它更合适用来处理来自网络的字节流. 由于源并不 ...
- protobuf的使用(netty传输多种对象类型)
重点是: 1.枚举DataType的定义 2.oneof的使用
- 使用Spring Cloud OAuth2和JWT保护微服务
采用Spring Security AOuth2 和 JWT 的方式,避免每次请求都需要远程调度 Uaa 服务.采用Spring Security OAuth2 和 JWT 的方式,Uaa 服务只验证 ...