深入浅出java IO模型
一、同步和异步
同步:一个事件或者任务的执行,会使整个流程暂时等待,也就是说如果有多个任务要执行,必须要逐个进行。
异步:一个事件或者任务的执行,不会使整个流程暂时等待,也就是说如果有多个任务要执行,可以并发去执行。
同步和异步的关键在于一个事件或者任务的执行是否会导致整个流程暂时等待。也就是任务是逐个完成的吗
二、阻塞和非阻塞
阻塞:在某个事件或者任务执行的过程中,它发出了一个请求,但是由于该操作能够执行所需要的条件还没有达到,就会一直等待在那里,直到条件满足。
非阻塞:在某个事件或者任务执行的过程中,它发出了一个请求,如果请求条件不满足,会返回一个标志信息告知不满足,不需要一直在那里等待。
阻塞和非阻塞的关键在于,当发出请求时,如果不满足请求时是一直等待还是不需要等待。
三、阻塞IO和非阻塞IO
IO操作通常包括:对硬盘的读写、对socket的读写以及外围设备的读写
一个完整的IO请求读写操作包括
(1)查看数据是否就绪;
(2)进行数据拷贝;
当线程发出一个IO请求操作的时候,内核会查看所需要读写的数据是否已经准备就绪,
阻塞IO:如果数据没有准备就绪,就一直等待,直到数据准备就绪;
非阻塞IO:如果没有准备就绪会返回一个标志信息,不需要等待,等到数据准备就绪以后,内核会把数据拷贝到线程中去。
阻塞IO和非阻塞IO关键在于数据没有准备好时是否会等待;
四、同步IO和异步IO
同步IO:当一个线程请求进行IO操作时,当IO操作完成之前,该线程会被阻塞;
当线程发送IO请求操作时,数据没有准备就绪,就会使用线程或者内核不停地去询问数据有没有准备好,当数据准备就绪后将数据从内核拷贝到线程。
异步IO:当一个线程请求进行IO操作时,当IO操作完成之前,该线程会不会被阻塞;
异步IO只有IO操作请求是线程发出的,查看数据是否准备和对数据的拷贝都是通过内核来完成的,发送通知告知线程IO操作已经完成,在异步IO中,不会对线程产生任何阻塞。
同步IO和异步IO都是的关键区别在于数据拷贝阶段是由线程完成还是内核完成。所以异步IO必须要有底层操作系统的支持。
五、5种IO模型
同步IO
(1)阻塞IO
如果数据没有准备就绪,就一直等待,直到数据准备就绪;就是传统的IO模型。
(2)非阻塞IO
如果没有准备就绪会返回一个标志信息,不需要等待,等到数据准备就绪以后,内核会把数据拷贝到线程中去。但是需要不断询问内核是否已经准备好数据,非阻塞虽然不用等待但是一直占用CPU。
(3)多路复用IO
Java NIO就是多路复用IO模型
多路复用IO,会有一个线程不断地去轮询多个socket的状态,当socket有读写事件的时候才会调用IO 读写操作。
用一个线程管理多个socket,是通过selector.select()查询每个通道是否有事件到达,如果没有事件到达,则会一直阻塞在那里,因此也会带来线程阻塞问题。
(4)信号驱动IO模型
在信号驱动IO模型中,当用户发起一个IO请求操作时,会给对应的socket注册一个信号函数,线程会继续执行,当数据准备就绪的时候会给线程发送一个信号,线程接受到信号时,会在信号函数中进行IO操作。
非阻塞IO、多路复用IO、信号驱动IO都不会造成IO操作的第一步,查看数据是否准备就绪而带来的线程阻塞,但是在第二步,对数据进行拷贝都会使线程阻塞。
异步IO
异步IO是最理想的IO模型,当线程发出一个IO请求操作时,接着就去做自己的事情了,内核去查看数据是否准备就绪和准备就绪后对数据的拷贝,拷贝完以后内核会给线程发送一个通知说整个IO操作已经完成了,数据可以直接使用了。
同步的IO操作在第二个阶段,对数据的拷贝阶段,都会造成线程的阻塞,异步IO则不会。
异步IO在IO操作的两个阶段,都不会使线程阻塞。
版权声明:本文转载自: https://blog.csdn.net/snow_7/article/details/51952796
深入浅出java IO模型的更多相关文章
- java io 模型重点讲述
java io 模型重点讲述 bio(阻塞) 同步IO 接受请求与处理请求用同一条线程 aio 应用程序线程会向系统注册一个socket请求,以及一个回调方法,继续执行下去.socket接受区的数据监 ...
- Java IO模型:BIO、NIO、AIO
Java IO模型:BIO.NIO.AIO 本来是打算直接学习网络框架Netty的,但是先补充了一下自己对Java 几种IO模型的学习和理解.分别是 BIO.NIO.AIO三种IO模型. IO模型的基 ...
- Java IO模型
Linux的内核将所有外部设备都看做一个文件来操作,对一个文件的读写操作会调用内核提供的系统命令,返回一个file descriptor(fd,文件描述符).而对一个Socket的读写也会有相应的描述 ...
- java IO 模型--快速分清 同步|阻塞
IO 介绍 IO 模型 IO请求 分为两个阶段:等待资源 和 使用资源: IO请求:一般需要请求特殊资源(如 磁盘.RAM 或文件),当资源被上一个使用者使用没有释放的时候, IO请求会被阻塞,直到资 ...
- 深入浅出Java内存模型
面试官:我记得上一次已经问过了为什么要有Java内存模型 面试官:我记得你的最终答案是:Java为了屏蔽硬件和操作系统访问内存的各种差异,提出了「Java内存模型」的规范,保证了Java程序在各种平台 ...
- 阿里、腾讯热门面试题:聊聊Unix与Java的IO模型?(含详细解析)
众所周知 如果去百度.腾讯等一线大厂面试,一定会深入考候选人的基础技术功底,其中尤为关键和重视的就是IO相关的技术和知识. 而要搞明白IO相关的概念,首先就得弄清楚同步与异步,阻塞与非阻塞到底是什么意 ...
- java IO流 总结
[-] 1什么是IO 2数据流的基本概念 1 数据流 2 输入流Input Stream 3 输出流 数据流分类 3 标准IO 命令行参数 标准输入输出数据流 4javaIO层次体系结构 5 非流式 ...
- Java IO学习--输入输出流
一.Java IO的定义 I/O:输入输出系统,由输入输出控制系统和外围设备两部分组成. Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输 ...
- Java IO体系综述
Java IO体系综述 一.流的概念 在Java API中,可以从其中读入一个字节序列的对象称作输入流,而可以向其中写入一个字节序列的对象称作输出流.这些字节序列的来源地和目的地可以是文件,而且通常都 ...
随机推荐
- SpringBoot DataSource 配置说明
DataSource 配置说明 属性 说明 spring.dao.exceptiontranslation.enabled 是否开启PersistenceExceptionTranslationPos ...
- API - 使用数据仓库 - 基础篇
数据仓库是集成在Spider Studio中的一个重要功能, 利用它可以非常方便的保存采集到的数据, 然后导出或者在其他脚本中再利用. 数据仓库的全部功能都集成在DataManager这个静态类里面, ...
- 使用js事件机制进行通用操作&特定业务处理的协调
背景:提供一个通用的功能工具条,工具条会在特定的事件响应时进行一些通用处理:第三方系统使用iframe嵌入这个工具条中,在工具条的特定的事件响应时进行通用处理的时候,有可能第三方系统会有一些自己的业务 ...
- error: No implicit Ordering defined for Any
scala中经常遇到最头疼的问题,就是类型不匹配或者带Any,Option的提示错误信息. 最近碰到的是取最大值,但是明明已经Long类型的,却提示下面这个错误信息. 相关的源程序如下: // 获取o ...
- sql 追踪 神器
http://www.thinkphp.cn/download/690.html 一个中国人开发的php工具箱此工具能几秒钟追踪出sql 数据库操作, 能分析出 Thinkphp3.2 的任意sql ...
- 对于try catch放在能够很好地处理例外的位置
Exception有一个message属性.在使用catch的时候可以调用: Catch(IOException e){System.out.println(e.message())}; Catch( ...
- 异常之*** buffer overflow detected ***
*** buffer overflow detected *** 是sprintf()超出buff大小
- 判断站点访问的终端类型(移动端还是pc端)的方法(转)
要了解某个网站是在移动设备上打开的还是在pc web浏览器中打开的,我们可以有以下综合的几种方式来搞定: 通过判断Request.UserAgent中的具体信息来分析判断,因为UserAgent包含了 ...
- mysql -- 创建存储过程 往数据表中新增字段
需求: 往某数据库的某个表中新增一个字段(若该字段已存在,则不做操作:若该字段不存在,则新增) 百度了n久,没有符合要求的例子,只有参考加自己琢磨,最终终于给弄出来了,以下是几个版本的更迭 第一版: ...
- 小结:线段树 & 主席树 & 树状数组
概要: 就是用来维护区间信息,然后各种秀智商游戏. 技巧及注意: 一定要注意标记的下放的顺序及影响!考虑是否有叠加或相互影响的可能! 和平衡树相同,在操作每一个节点时,必须保证祖先的tag已经完全下放 ...