BIO AIO NIO(转)

2024-03-23 14:58
文章标签 nio aio bio

本文主要是介绍BIO AIO NIO(转),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

同步非阻塞IO (NIO)

 

NIO是基于事件驱动思想的,实现上通常采用Reactor(http://en.wikipedia.org/wiki/Reactor_pattern) 模式,从程序角度而言,当发起IO的读或写操作时,是非阻塞的;当socket有流可读或可写入socket时,操作系统会相应的通知引用程序进行处理, 应用再将流读取到缓冲区或写入操作系统。对于网络IO而言,主要有连接建立、流读取及流写入三种事件、linux2.6以后的版本使用epoll(http://lse.sourceforge.net/epoll/index.html)方式实现NIO。

 

select/epoll的好处就在于单个process就可以同时处理多个网络连接的IO。它的基本原理就是select/epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程。它的流程如图:

 

当用户进程调用了select,那么整个进程会被block,而同时,kernel会“监视”所有select负责的socket,当任何一个 socket中的数据准备好了,select就会返回。这个时候用户进程再调用read操作,将数据从kernel拷贝到用户进程。

这个图和blocking IO的图其实并没有太大的不同,事实上,还更差一些。因为这里需要使用两个system call (select 和 recvfrom),而blocking IO只调用了一个system call (recvfrom)。但是,用select的优势在于它可以同时处理多个connection。(多说一句。所以,如果处理的连接数不是很高的话,使用 select/epoll的web server不一定比使用multi-threading + blocking IO的web server性能更好,可能延迟还更大。select/epoll的优势并不是对于单个连接能处理得更快,而是在于能处理更多的连接。)

在IOmultiplexing Model中,实际中,对于每一个socket,一般都设置成为non-blocking,但是,如上图所示,整个用户的process其实是一直被 block的。只不过process是被select这个函数block,而不是被socket IO给block。

 

AIO,异步IO方式

 

AIO为异步IO方式,同样基于事件驱动思想,实现上通常采用Proactor模式(http://en.wikipedia.org/wiki/Proactor_pattern)

 

从程序的角度而言,与NIO不同,当进行读写操作时,只须直接调用API的read或write方法即可。这两种方法均 为异步的,对于读操作而言,当有流可读取时,操作系统会将可读的流传入read方法的缓冲区,并通知应用程序;对于写操作而言,当操作系统将write方 法传递的流写入完毕时,操作系统主动通知应用程序。较之NIO而言,AIO一方面简化了程序出的编写,流的读取和写入都由操作系统来代替完成;另一方面省 去了NIO中程序要遍历事件通知队列(selector)的代价。Windows基于IOCP(http://en.wikipedia.org/wiki/Input/output_completion_port)实现了AIO,Linux目前只有基于epoll实现的AIO。

 

 

原址(http://www.cnblogs.com/focusj/articles/2404634.html)

      (http://furturestrategist.iteye.com/blog/1463369)

关键字部分

 

 

AIO

对于读操作而言,

当有流可读取时,操作系统会将可读的流传入read方法的缓冲区,并通知应用程序;

对于写操作而言,当操作系统将write方 法传递的流写入完毕时,操作系统主动通知应用程序。

较之NIO而言,AIO一方面简化了程序出的编写,流的读取和写入都由操作系统来代替完成;另一方面省 去了NIO中程序要遍历事件通知队列(selector)的代价


NIO

当发起IO的读或写操作时,是非阻塞的;

当socket有流可读或可写入socket时,操作系统会相应的通知引用程序进行处理,

应用再将流读取到缓冲区或写入操作系统。对于网络IO而言,主要有连接建立、流读取及流写入三种事件


IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO


BIO是一个连接一个线程。

NIO是一个请求一个线程。

AIO是一个有效请求一个线程。


AIO 是先读或写到系统内存缓冲区后,在通知应用程序。

NIO 是遍历要读取的应用程序,在用应用程序本身来读或写到系统内存缓冲区,

 

这篇关于BIO AIO NIO(转)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/838662

相关文章

springboot体会BIO(阻塞式IO)

使用springboot体会阻塞式IO 大致的思路为: 创建一个socket服务端,监听socket通道,并打印出socket通道中的内容。 创建两个socket客户端,向socket服务端写入消息。 1.创建服务端 public class RedisServer {public static void main(String[] args) throws IOException {

【虚拟化】AIO主机安装PVE8,配置网络,安装win11(virtio,qcow2,scsi,oobe,adk)

【虚拟化】AIO主机安装PVE8,配置网络,安装win11(virtio,qcow2,scsi,oobe,adk) 文章目录 1、ESXI vs PVE,AIO主机系统二选一2、PVE网络配置(DNS,换源,网卡,https,概览)3、win11虚拟化配置(virtio,raw,qcow2)附,域名解析,rocky9.4,黑群晖 1、ESXI vs PVE,AIO主机系统二选

还不懂BIO,NIO,AIO吗

BIO(Blocking I/O)、NIO(Non-blocking I/O)和 AIO(Asynchronous I/O)是 Java 中三种不同的 I/O 模型,主要用于处理输入 / 输出操作。 一、BIO(Blocking I/O) 定义与工作原理: BIO 即阻塞式 I/O(同步阻塞,传统IO)。在这种模型下,当一个线程发起一个 I/O 操作(如读取文件或网络数据)时,此线

JAVA NIO的笔记

Java中的NIO IO-文件的读写 NIO是Java4开始提供的用来解决IO问题的API。 Channel(通道)  Buffer(缓存区)  Selector(选择器) inputStream outPutStream 都是以Stream为观点看的 所以input为读 output为写 两个对象文件盒stream Channel读写操作都能做 Channel是执行读写操作这个工作的东西 而读写

Java高级特性增强-NIO

GitHub:https://github.com/wangzhiwubigdata/God-Of-BigData 关注公众号,内推,面试,资源下载,关注更多大数据技术~大数据成神之路~预计更新500+篇文章,已经更新50+篇~ **Java高级特性增强-NIO 本部分网络上有大量的资源可以参考,在这里做了部分整理并做了部分勘误,感谢前辈的付出,每

Java - NIO之Channel(FileChannel)

一、关于Channel     Java NIO的通道(Channel)类似流,但又有些不同:         既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的。         通道可以异步地读写。         通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入。       Java NIO中最重要的通道的实现:

Error:Artifact com.*******:war exploded: java.nio.file.InvalidPathException: Illeg

由于一次电脑蓝屏,Idea启动tomcat报错: Error:Artifact ':war exploded’: java.nio.file.InvalidPathException: Illegal char < > at index 71: K:\COMPANY_CODE_IDEA\FLOW_CODE*\target\activ : Illegal char < > at index 71:

Java 输入与输出之 NIO.2【AIO】【Path、Paths、Files】【walkFileTree接口】探索之【三】

在JDK 1.7 版本中对NIO进行了完善,推出了NIO.2,也称为AIO(异步IO),在处理大量并发请求时具有优势,特别是在网络编程和高并发场景下,表现得更为出色。 对于输出流和输入流而言,操作的对象可以是文件,大多数情况下是文件,也可以是网络连接,当然也可以是内存数据。我们今天主要讨论的是文件和目录处理。 本博客我们将探讨NIO.2中最基础的Path、Paths和Files的用法。 Path

Java NIO 核心知识总结

Java NIO 核心知识总结 NIO简介 在传统的I/O模型中,是以阻塞的方式进行的也就是当一个线程执行的时候线程会一直阻塞到完成工作为止。这种模型的缺点就是在并发比较大的时候性能就会比较低,并且在每次都要给一个新的任务(连接)创建一个新的线程,这个新的线程的创建和从上一个切换到这一个线程都会都性能有影响。 为了优化这个传统的io模型,在jdk1.4新引入了一个全新的new io包,在原有

Linux实现异步IO的方法:epoll,posix aio,libaio,io_uring

Linux中异步IO的实现方式大概有以下几种: 1. epoll 熟悉网络编程的人可能会想到select,poll,epoll这些异步IO的方式,但实际上这些方式叫做非阻塞IO,用于把网络读写的阻塞变成非阻塞,并不是实际意义上的异步IO。因此Epoll这些只能用于实现非阻塞的Socket IO,无法用于异步的Storage IO。 因为只有网络IO才存在阻塞的情况(也即,这个网络文件描述符是否