Java世界里的BIO,NIO,AIO

作为一名程序员,io知识是必不可少,其实一直在和io打交道,要么显示要么隐含给了操作系统,故做下关于io的记录。说io之前呢,先介绍什么叫同步异步丶阻塞非阻塞

1.  同步异步丶阻塞非阻塞

1.1 同步是指发出一个请求,在没有得到结果之前该请求就不返回结果,请求返回时,也就得到结果了。比如我经常用烧水壶烧水,没烧开前一直盯着水壶(等水开)。

1.2 异步是指发出一个请求后,立刻得到了回应,但没有返回结果,这时我们可以再处理别的事情(发送其他请求),所以这种方式需要我们通过状态主动查看是否有了结果, 或者可以设置一个回调来通知调用者。比如烧水时,不需要盯着水壶等水开,也可以做别的事:玩电脑,每两三分钟(类似轮询任务)看看水开了没有,也可以给水壶设置响铃(信号通知,发邮件发短信),水开了通知了我(don’t call me,I call you)。

1.3  阻塞是指请求结果返回之前,当前线程会被挂起(被阻塞),线程什么也做不了了,而非阻塞是指请求结果返回之前,当前线程没有被阻塞,仍然可以做其他事情。

2.  IO模型

一个io请求读操作,数据会先被拷贝到操作系统内核的缓冲区中,然后从操作系统内核的缓冲区拷贝到应用程序的地址空间,所以整个过程可分为两个阶段:等待I/O数据准备好,这取决于IO目标返回数据的速度, 如网络IO时看网速和数据本身的大小;数据从内核缓冲区拷贝到进程内。

模型分类可分为以下几种:BIO,NIO,IO多路复用,AIO,我就一一简单介绍下

2.1  BIO

BIO,全称是Blocking I/O,中文名叫:阻塞 I/O,整个过程如图:

应用程序发送请求给内核,然后由内核去进行通信,在内核准备好数据之前这个线程是被挂起的,所以在两个阶段程序都处于挂起状态, 其 特点就是在IO执行的两个阶段都被block了 。

2.2 NIO

NIO,全称是Non-Blocking    IO,中文名字叫非阻塞IO,过程如图示:

发起第一次请求后,线程并没有被阻塞,它反复检查数据是否准备好,把原来大块不能用的阻塞时间分成了许多“小阻塞”(检查),所以进程不断有机会被执行。这个检查有没有准备好数据的过程有点类似于“轮询”。其特点就是程序需要不断的主动询问内核数据是否准备好。第一个阶段非阻塞,第二个阶段阻塞。

2.3  IO多路复用(重点,此模型不少中间件都用到了)

IO多路复用(I/O Multiplexing)有selectpollepoll等不同方式,它的优点在于单个线程可以同时处理多个网络IO。不同于NIO中轮询操作是用户线程进行的,而IO多路复用调用操作系统级别的selectpoll或epoll模型,由系统进行监控IO状态。select轮询可以监控许多socket的IO请求,当有一个socket的数据准备好时就可以返回。多路复用IO过程图:

与NIO不同的是,select不是等到所有数据准备好才返回,而是只要有一个准备好就返回,它的强项在于可以同时处理多个连接。 其 特点是用户进程能同时等待多个IO请求,系统来监控IO状态,其中的任意一个进入读就绪状态,select函数就可以返回。 nio在java1.4才引入

2.4  AIO

AIO全称是Asynchronous I/O,中文名叫:异步 I/O,它是Java1.7 才引入。整个过程中,用户线程发起一个系统调用之后无须等待,可以处理别的事情。由操作系统等待接收内容,接收后把数据拷贝到用户进程中,最后通知用户程序已经可以使用数据了,两个阶段都是非阻塞的。整个过程如下图

Java中可通过以下两种方式实现:

一种是基于”回调”,我们可以实现CompletionHandler接口,在调用时把回调函数传递给对应的API即可;

一种是返回一个Future。处理完别的事情,可以通过isDone()可查看是否已经准备好数据,通过get()方法等待返回数据。

好了,暂且就写这么多,多多交流探讨

参考:

1.  OReilly.Java.I.O.2nd.Edition.May.2006

2.   Unix网络编程卷1(几种io模型)

原文地址:https://www.cnblogs.com/dongguangming/p/12630162.html

时间: 2024-10-03 23:04:36

Java世界里的BIO,NIO,AIO的相关文章

JAVA 004 网络编程 BIO NIO AIO

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

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 之前先来回顾一下这样几个概念:同步与异步,阻塞与非阻塞. 同步与异步: 同步: 同步就是发起一个调用后,被调用者未处理完请求之前,调用不返回. 异步: 异步就是发起一个调用后,立刻得到被调用者的回应表示已接收到请求,但

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

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

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

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

BIO NIO AIO区别

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