IO模型及JAVA中的(B)IO/NIO/AIO

本文详细介绍了Java中的IO模型,包括阻塞IO(BIO)、非阻塞IO(NIO)和异步非阻塞IO(AIO)。解释了同步与异步、阻塞与非阻塞的概念,分析了各种IO模型的工作原理,如多路复用IO(select、poll、epoll)和信号驱动IO。文章还对比了BIO、NIO和AIO在不同场景下的适用性,以及各自的优势和限制。
摘要由CSDN通过智能技术生成

IO有内存IO、网络IO和磁盘IO三种,通常我们说的IO指的是后两者。网络IO的本质是socket的读取,socket在linux系统被抽象为流,IO可以理解为对流的操作。对于一次IO访问(以read举例)当一个read操作发生时,它会经历两个阶段:

第一阶段:等待数据准备,数据从磁盘拷贝到内核空间 (Waiting for the data to be ready)。

第二阶段:将数据从内核空间拷贝到进程空间 (Copying the data from the kernel to the process)。

同时,上面两个阶段都是在内核中进行的,由内核进程来实现。

网络IO的模型大致有如下几种:

阻塞IO(bloking IO)

非阻塞IO(non-blocking IO)

多路复用IO(multiplexing IO) select,poll,epoll

信号驱动式IO(signal-driven IO)

异步IO(asynchronous IO)

(一)同步与异步,阻塞与非阻塞

在学习IO之前,先了解一下同步,异步,阻塞,非阻塞的区别。

阻塞和非阻塞强调的是线程在等待调用结果(消息,返回值)时的状态。 阻塞调用是指调用结果返回之前,当前线程会被挂起,调用线程只有在得到结果之后才会返回。非阻塞调用指在在得到结果之前,该调用不会阻塞当前线程,线程可以继续执行。

同步和异步强调的是线程之间的消息通信机制。所谓同步,就是在发出一个"调用"时,在没有得到结果之前,该“调用”就不返回。但是一旦调用返回,就得到返回值了。换句话说,就是由“调用者”主动等待这个“调用”的结果。而异步则是相反,"调用"在发出之后,就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在"调用"发出后,"被调用者"通过状态、通知来通知调用者,或通过回调函数处理这个调用


接下来,可以看看在IO中,阻塞和非阻塞,同步和异步的具体实现方式。

阻塞式IO模型(blocking I/O

很多时候数据在一开始还没有到达(比如,还没有收到一个完整的UDP包),这个时候内核就要等待足够的数据到来。而在用户进程这边,整个进程会被阻塞。当内核一直等到数据准备好了,就会将数据从内核中拷贝到用户内存,然后内核返回结果,用户进程才解除block的状态,重新运行起来。

所以,blocking IO的特点就是在IO执行的两个阶段(等待数据和拷贝数据两个阶段)都被block了。

非阻塞IO模型(noblocking I/O

当用户进程发出read操作时,如果内核中的数据还没有准备好,那么它并不会block用户进程,而是立刻返回一个error。从用户进程角度讲,它发起一个read操作后,并不需要等待,而是马上就得到了一个结果。用户进程判断结果是一个error时,它就知道数据还没有准备好,于是它可以再次发送read操作。一旦内核中的数据准备好了,并且又再次收到了用户进程的system call,那么它马上就将数据拷贝到了用户内存,然后返回。

所以,noblocking IO的特点就是-等待数据-阶段不会被阻塞,-拷贝数据-阶段会被阻塞。

多路复用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值