BIO、NIO、AIO --- 个人理解
1.前言
什么是 BIO、NIO、AIO ,不难看出,都是共同的字符IO ,
IO的意思是input output ,即输入输出 ,
那么 B 、 N 、A 分别指不同的io模型 ,而io又分为 文件io、socket通信io 等
2.什么意思?
BIO 是同步阻塞io模型,
NIO是同步非阻塞io模型,
AIO是异步非阻塞io模型。
3.该怎么理解?
(1)BIO ,同步阻塞io模型, 每当发起一个io操作,系统就会生成一个单独的线程来对其处理,此时需要等该线程处理结束返回结果后才可以做其他操作,
期间会卡在哪里;缺点是高并发操作会导致线程创建暴增,当线程数上涨到极限,会导致系统崩溃。
于是出现了一个叫做伪异步BIO的东西 ,也被称为M:N客户服务模型,其实就是在里面使用了线程池和任务队列,而减少线程的创建数量,提高线程利用率,增加服务器的处理能力。底层其实仍然是1对1的处理同步阻塞模式,只是增加了线程池,后来的请求需要等待进入任务队列排队,等待活跃线程来处理。
(2)NIO,同步非阻塞io模型 ,增加了管道【channel】和选择器[selector]的概念 , 需要做io操作时,对管道进行操作,内存于管道之间需要一个缓冲区buffer作为中间容器操作,一般是 字节buffer 【ByteBuffer】 ,然后管道对buffer进行读【read(buffer)】或写【write(buffer)】操作,
文件管道【FileChannel】不使用选择器,只有在socket io 才使用选择器 。
选择器其实是使用一个线程,做多路复用机制 ,其实就是一直循环,做轮询操作。
与管道做完io操作后,会将这个管道注册到选择器里面,并设置该管道的属性会对某个事件感兴趣,
一共有4种事件【
//
//SelectionKey.OP_CONNECT ——连接就绪事件,表示客户与服务器的连接已经建立成功,同通知服务端回应我
channel.register(selector, SelectionKey.OP_CONNECT);
//
//SelectionKey.OP_READ —— 读就绪事件,表示通道中已经有了可读的数据,可以执行读操作了(通道目前有数据,可以进行读操作了
channel.register(selector, SelectionKey.OP_READ);
//
//SelectionKey.OP_WRITE —— 写就绪事件,表示已经可以向通道写数据了(通道目前可以用于写操作,通知自己的选择器触发写事件)
channel.register(selector, SelectionKey.OP_WRITE);
//
//SelectionKey.OP_ACCEPT—— 接收连接就绪事件,表示准备好接收客户端的连接请求啦
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
】
nio虽然是同步,但不是阻塞,也就是说,由通道向选择器注册一个事件后,就可以去干其他事情了,不会卡死,但是还需要时不时的看一下有没有结果返回来
【也就是客户端的选择器遍历操作】
(3)AIO,是异步非阻塞io模型,当客户端发出请求时,系统接收请求后完全由系统处理,客户端可以去干其他事,同时也不需要关系结果是什么时候处理好,
等系统把结果处理好后,由系统通知客户端获取结果即可。类似于前端Ajax请求。
【猜测websocket就是使用 AIO模型做的,因为没有轮询操作,轮询操作是BIO的典型特征】
BIO、NIO、AIO --- 个人理解的更多相关文章
- JAVA 中BIO,NIO,AIO的理解
[转自]http://qindongliang.iteye.com/blog/2018539 ?????????????????????在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解 ...
- BIO,NIO,AIO的理解
在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解.具体如下: 序号 问题 1 什么是同步? 2 什么是异步? 3 什么是阻塞? 4 什么是非阻塞? 5 什么是同步阻塞? 6 什么是同步 ...
- JAVA 中BIO,NIO,AIO的理解以及 同步 异步 阻塞 非阻塞
在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解.具体如下: 序号 问题 1 什么是同步? 2 什么是异步? 3 什么是阻塞? 4 什么是非阻塞? 5 什么是同步阻塞? 6 什么是同步 ...
- JAVA 中BIO,NIO,AIO的理解 (转)
转自: http://qindongliang.iteye.com/blog/2018539 另外类似可参考资料 :http://www.360doc.com/content/13/1029/20/9 ...
- Java中BIO,NIO,AIO的理解
在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解.具体如下: 1 什么是同步? 2 什么是异步? 3 什么是阻塞? 4 什么是非阻塞? 5 什么是同步阻塞? 6 什么是同步非阻塞? 7 ...
- (转)也谈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,我们需要从两个 ...
- IO回忆录之怎样过目不忘(BIO/NIO/AIO/Netty)
有热心的网友加我微信,时不时问我一些技术的或者学习技术的问题.有时候我回微信的时候都是半夜了.但是我很乐意解答他们的问题.因为这些年轻人都是很有上进心的,所以在我心里他们就是很优秀的,我愿意多和努力的 ...
- Netty5序章之BIO NIO AIO演变
Netty5序章之BIO NIO AIO演变 Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能.高可靠的网络服务器和客户端程序.Netty简化了网络程序的开发,是很多框架和公司都在使 ...
随机推荐
- vue 项目如何使用animate.css
Animate.css是一款酷炫丰富的跨浏览器动画库,它在GitHub上的star数至今已有5.3万+. 在vue项目中我们可以借助于animate.css,用十分简单的代码来实现一个个炫酷的效果!( ...
- 用graphviz可视化决策树
1.安装graphviz. graphviz本身是一个绘图工具软件,下载地址在:http://www.graphviz.org/.如果你是linux,可以用apt-get或者yum的方法安装.如果是w ...
- 代码仓库gogs的基本配置使用
目录 一.基本功能介绍 主板说明 页面说明 用户设置 二.仓库 新建仓库 迁移仓库 仓库介绍 三.组织和团队 创建新组织 创建团队 一.基本功能介绍 主板说明 图中1表示自己个人账户下的仓库(所有权属 ...
- git 基本命令及idea集成使用
目录 git基本命令使用 设置签名 gitHub 服务配置秘钥 上传代码 更新代码 分支管理 bat脚本更新 idea集成git git基本命令使用 设置签名 签名和秘钥大多数是一起设置的,设置后一般 ...
- 自动化集成:Jenkins管理工具详解
前言:该系列文章,围绕持续集成:Jenkins+Docker+K8S相关组件,实现自动化管理源码编译.打包.镜像构建.部署等操作:本篇文章主要描述Jenkins基础用法. 一.Jenkins安装 1. ...
- 使用.NET 6开发TodoList应用(1)——系列背景
前言 想到要写这样一个系列博客,初衷有两个:一是希望通过一个实践项目,将.NET 6 WebAPI开发的基础知识串联起来,帮助那些想要入门.NET 6服务端开发的朋友们快速上手,对使用.NET 6开发 ...
- android jni-dlerror报undefined symbol: JNI_OnLoad
以下是很简单的一个官方的jni方法,在MainActivity的onCreate中调用 extern "C" JNIEXPORT jstring JNICALL Java_com_ ...
- Jquery监控audio单选框选中事件(实际通过click)
$('input:radio[name="pathType"]').click(function(){ var checkValue = $('input:radio[name=& ...
- Linux(centos7)设置docker服务开机自启动以及容器自启动
docker服务开机自启动 systemctl enable docker 设置容器自启动 可以在运行的时候通过设置--restart 参数 docker run --restart always - ...
- java源码——计算大于一个数的最小素数
根据输入数字,计算大于一个数的最小素数. 话不多说,直接贴码. package com.fuxuemingzhu.countprime.main; import java.util.Scanner; ...