Java BIO, NIO, AIO的一些粗浅认识

1. 阻塞与非阻塞

"阻塞"与“非阻塞”概念经常和“同步”、“异步”混淆。在Java程序中,很多线程通常处于阻塞(blocking)状态,而同步(并不是指多线程同步的Synchronized)并不是这样,同步通常是指步骤需要一步步来完成,就想常规的代码一条条地执行一样,但异步可以在没有执行完当前这行代码之前,就执行下一行代码,就像很多JS代码、UI控件、后台启动线程等。

相对于阻塞来讲,同步的程序线程应当是处于Running状态的。线程处于Blocking状态就差不多可以看成是睡眠的,也就是说它什么也没法做,只有一直等待一个信号的产生才能唤醒。处于Running状态下的线程是活跃的,在这种情况下可以去做很多其他的事情,可以一直去检测一些事情是否做好。

2. BIO (Blocking I/O)

Blocking I/O(阻塞I/O),这是最古老的Java通信机制,在这种模型中,应用程序首先会通过System Call发送请求给内核(Kernel),然后由内核去进行网络通信,应用程序如果发起的系统调用是读操作,在内核准备好数据以前,这个线程将会被挂起,一直等待下去,直到有返回的数据在内核中准备好位置,或者在设置SoTimeout后超时被唤醒。

假如抛开超时机制在网络等待机制中的作用,发起read()操作等待远程返回数据的过程由以下两个阶段组成。

阶段1:等待I/O返回数据,这取决于I/O请求的目标返回数据的速度。例如在网络I/O请求中,在远程返回数据前也需要经过一些处理才返回数据,远程输出数据后将取决于网络本身的速度及数据本身大小。

阶段2:返回数据首先被填充到内核(Kernel)的缓冲区里,然后再从内核区将数据向进程内部拷贝(copy data from kernel to user)。这个过程完成后,应用程序才会继续向下执行。

根据上面的过程,在BIO过程中,程序与内核交互的过程如下图所示:

2. NIO (New I/O)

Java从1.4版本开始支持NIO(New IO),可以实现非阻塞I/O的。非阻塞I/O和阻塞I/O有个很明显的区别是:当发生第一次System Call请求后,线程并没有被阻塞,但它没有做别的事情,而是在不断发起System Call请求。

这样操作似乎在空耗CPU,给人感觉还不如一直挂起等待返回,那样至少会让出CPU资源。其实,每次System Call只是看看数据准备好没有,通常它的时间是很短暂的,这样的动作完全只用一个线程来完成对很多事件的监听。换句话说,其它的线程可以去干别的事,只需要某个线程定期来做下检测即可,在设计上注意这个检测频率,就可以达到效率高且节约资源的目的。

3. AIO (Asynchronous I/O)

JDK 1.7引入了NIO 2.0,也就是AIO,又叫异步IO。下面用“物流送货”来比如Java中的IO模型:

① BIO:你需要到物流的中转站去等货且不能离开中转站,如果货没到,其他的事情就别想做。

② NIO:每天去检测一下货物是否到了,这个动作十分简单,可以让每个小区派1个人去看看有没有这个小区的货物,如果有就带回来,或者这个人通知你去物流中转站拿货。

③ AIO:货到的时候送货上门,换句话说,去拿货的路途虽然不长,但是由别人帮你承担了。

使用AIO读取文件并不代表读取更快,我们不能用AIO读取一个大文件与用BIO来对比速度,这样没有任何意义。因为AIO的目的在于I/O过程中程序去做别的事情,也就是在并发时,更少的资源可以做更多的事情,并不是看在I/O过程中谁更快,它也做不到这点,因为能做到I/O更快只有提高磁盘或者网络本身的速度,而这些I/O模型只是调度I/O的机制而已。

AIO相对NIO,在某种意义上讲更加提高了资源利用率,但这仅仅是相对进程本身而言,对于整个服务器来说,还得看实际情况,因为进程不想做的事情交给内核去做了。AIO应当更加适合运用在I/O密集型系统中,BIO也并非没有价值,它使得交互简化,而且在很多情况下本身没有必要使用异步和非阻塞。

时间: 2024-10-07 06:21:27

Java BIO, NIO, AIO的一些粗浅认识的相关文章

3. 彤哥说netty系列之Java BIO NIO AIO进化史.md

你好,我是彤哥,本篇是netty系列的第三篇. 欢迎来我的公从号彤哥读源码系统地学习源码&架构的知识. 先说两个事 (1)上周五的那篇文章发重复了,是定时任务设置错误导致,给大家带来干扰,这里说声抱歉. (2)之前的问卷调查结果出来了,认为先讲案例的票数较多,所以后面的文章都是先讲案例,再以案例展开讲解组件. 简介 上一章我们介绍了IO的五种模型,实际上Java只支持其中的三种,即BIO/NIO/AIO. 本文将介绍Java中这三种IO的进化史,并从使用的角度剖析它们背后的故事. Java BI

JAVA bio nio aio

[转自]http://qindongliang.iteye.com/blog/2018539 在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解.具体如下: 序号 问题 1 什么是同步? 2 什么是异步? 3 什么是阻塞? 4 什么是非阻塞? 5 什么是同步阻塞? 6 什么是同步非阻塞? 7 什么是异步阻塞? 8 什么是异步非阻塞? 散仙不才,在查了一部分资料后,愿试着以通俗易懂的方式解释下这几个名词.如有不足之处,还望告知. 在弄清楚上面的几个问题之前,我们首先得明白什么是同步,

JAVA 中BIO,NIO,AIO的理解

JAVA 中BIO,NIO,AIO的理解 博客分类: 网络编程 [转自]http://qindongliang.iteye.com/blog/2018539 在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解.具体如下: 序号 问题 1 什么是同步? 2 什么是异步? 3 什么是阻塞? 4 什么是非阻塞? 5 什么是同步阻塞? 6 什么是同步非阻塞? 7 什么是异步阻塞? 8 什么是异步非阻塞? 散仙不才,在查了一部分资料后,愿试着以通俗易懂的方式解释下这几个名词.如有不足之处,还

JAVA中的BIO,NIO,AIO

在了解BIO,NIO,AIO之前先了解一下IO的几个概念: 1.同步 用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪, 例如自己亲自出马持银行卡到银行取钱 2.异步 用户触发IO操作以后,可以干别的事,IO操作完成以后再通知当前线程,例如让小弟去银行帮你取钱,你可以干别的事 3.阻塞 当试图进读写文件的时候,发现不可读取或没东西读,则进入等待状态知道可读,ATM排队取钱 4.非阻塞 用户进程访问数据时,会马上返回一个状态值(可读不可读),比如在银行柜台办理业务,先取个号,然后坐在椅子

也谈BIO | NIO | AIO (Java版--转)

关于BIO | NIO | AIO的讨论一直存在,有时候也很容易让人混淆,就我的理解,给出一个解释: BIO | NIO | AIO,本身的描述都是在Java语言的基础上的.而描述IO,我们需要从两个层面: 编程语言 实现原理 底层基础 从编程语言层面 BIO | NIO | AIO 以Java的角度,理解,linux c里也有AIO的概念(库),这些概念不知道什么原因被炒火起来,这里只从Java角度入手. BIO,同步阻塞式IO,简单理解:一个连接一个线程 NIO,同步非阻塞IO,简单理解:一

一站式学习Java网络编程 全面理解BIO/NIO/AIO

第1章 [开宗明义]网络编程三剑客BIO.NIO.AIO网络编程是RPC的奠基,RPC编程贯穿了程序员生涯的始终.本章首先分析为什么要学网络编,本课为谁设计,然后介绍课程内容主线脉络,让大家清晰知道本课程并非光说不练的假把式,而是处处有实战,实战项目步步优化,最后通过综合项目巩固所学.... 第2章 网络层的解析与协议本章首先对网络中涉及的网络链路层的解析进行讲解,进一步引出网络基本协议知识.使学员了解分层思想,对三种协议的定位及作用有所了解. 第3章 解读java.io专业术语也可以变得生动精

初理解Java中的BIO,NIO,AIO

初识: java 中的 BIO.NIO和 AIO 理解为是 Java 语言对操作系统的各种 IO 模型的封装.程序员在使用这些 API 的时候,不需要关心操作系统层面的知识,也不需要根据不同操作系统编写不同的代码.只需要使用Java的API就可以了. 在讲 BIO,NIO,AIO 之前先来回顾一下这样几个概念:同步与异步,阻塞与非阻塞. 同步与异步: 同步: 同步就是发起一个调用后,被调用者未处理完请求之前,调用不返回. 异步: 异步就是发起一个调用后,立刻得到被调用者的回应表示已接收到请求,但

一站式学习Java网络编程 全面理解BIO/NIO/AIO完整版

一站式学习Java网络编程 全面理解BIO/NIO/AIO 资源获取链接:点击获取完整教程 网络层编程,是每一个开发者都要面对的技术.课程为解决大家学习网络层知识的难题,以创新性的“对比式学习”搭建网络编程课程,课程主线清晰(网络层基础铺垫-->java网络编程前置技术讲解-->阻塞式编程BIO-->非阻塞式编程NIO-->异步编程AIO-->综合实战)适合每一位需要理解网络编程的同学们学习.以“项目驱动”为导向的学习,与企业刚需灵魂契合. 适合人群 网络编程作为编程者的必备

JAVA 004 网络编程 BIO NIO AIO

目录(图片来自于网络) 多路复用Linux环境下底层机制 多路复用模式Reacotor和Proactor BIO,NIO,AIO的简单介绍 多路复用Linux环境下底层机制 多路复用模式Reacotor和Proactor Reactor和Proactor模式的主要区别就是真正的读取和写入操作是由谁来完成的 Reactor中需要应用程序自己读取或者写入数据 Proactor模式,应用程序不需要进行实际的读写过程,它只需要从缓存区读取或者写入即可,操作系统会读取缓存区或者写入缓存区到真正的IO的设备