一、同步和异步

同步:一个事件或者任务的执行,会使整个流程暂时等待,也就是说如果有多个任务要执行,必须要逐个进行。

异步:一个事件或者任务的执行,不会使整个流程暂时等待,也就是说如果有多个任务要执行,可以并发去执行。

同步和异步的关键在于一个事件或者任务的执行是否会导致整个流程暂时等待。也就是任务是逐个完成的吗

二、阻塞和非阻塞

阻塞:在某个事件或者任务执行的过程中,它发出了一个请求,但是由于该操作能够执行所需要的条件还没有达到,就会一直等待在那里,直到条件满足。

非阻塞:在某个事件或者任务执行的过程中,它发出了一个请求,如果请求条件不满足,会返回一个标志信息告知不满足,不需要一直在那里等待。

阻塞和非阻塞的关键在于,当发出请求时,如果不满足请求时是一直等待还是不需要等待。

三、阻塞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模型的更多相关文章

  1. java io 模型重点讲述

    java io 模型重点讲述 bio(阻塞) 同步IO 接受请求与处理请求用同一条线程 aio 应用程序线程会向系统注册一个socket请求,以及一个回调方法,继续执行下去.socket接受区的数据监 ...

  2. Java IO模型:BIO、NIO、AIO

    Java IO模型:BIO.NIO.AIO 本来是打算直接学习网络框架Netty的,但是先补充了一下自己对Java 几种IO模型的学习和理解.分别是 BIO.NIO.AIO三种IO模型. IO模型的基 ...

  3. Java IO模型

    Linux的内核将所有外部设备都看做一个文件来操作,对一个文件的读写操作会调用内核提供的系统命令,返回一个file descriptor(fd,文件描述符).而对一个Socket的读写也会有相应的描述 ...

  4. java IO 模型--快速分清 同步|阻塞

    IO 介绍 IO 模型 IO请求 分为两个阶段:等待资源 和 使用资源: IO请求:一般需要请求特殊资源(如 磁盘.RAM 或文件),当资源被上一个使用者使用没有释放的时候, IO请求会被阻塞,直到资 ...

  5. 深入浅出Java内存模型

    面试官:我记得上一次已经问过了为什么要有Java内存模型 面试官:我记得你的最终答案是:Java为了屏蔽硬件和操作系统访问内存的各种差异,提出了「Java内存模型」的规范,保证了Java程序在各种平台 ...

  6. 阿里、腾讯热门面试题:聊聊Unix与Java的IO模型?(含详细解析)

    众所周知 如果去百度.腾讯等一线大厂面试,一定会深入考候选人的基础技术功底,其中尤为关键和重视的就是IO相关的技术和知识. 而要搞明白IO相关的概念,首先就得弄清楚同步与异步,阻塞与非阻塞到底是什么意 ...

  7. java IO流 总结

    [-] 1什么是IO 2数据流的基本概念 1 数据流 2 输入流Input  Stream 3 输出流 数据流分类 3 标准IO 命令行参数 标准输入输出数据流 4javaIO层次体系结构 5 非流式 ...

  8. Java IO学习--输入输出流

    一.Java IO的定义 I/O:输入输出系统,由输入输出控制系统和外围设备两部分组成. Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输 ...

  9. Java IO体系综述

    Java IO体系综述 一.流的概念 在Java API中,可以从其中读入一个字节序列的对象称作输入流,而可以向其中写入一个字节序列的对象称作输出流.这些字节序列的来源地和目的地可以是文件,而且通常都 ...

随机推荐

  1. Okra框架(二) 搭建Socket服务器

    本文将介绍使用Okra框架帮助开发者快速搭建高性能应用程序Socket服务端. 博主接触的网络游戏(包含但不限于网页, 手机)的服务端通信使用的协议基本上就Socket,Http或是WebSocket ...

  2. /proc/interrupts 和 /proc/stat 查看中断的情况

    在/proc文件系统下,又两个文件提供了中断的信息. /proc/interrupts 文件中列出当前系统使用的中断的情况,所以某个中断处理没有安装,是不会显示的.哪怕之前安装过,被卸载了. 从左到右 ...

  3. kettle两表内链接的查询结果与sql语句的查询结果不符合?

    1.教师表输入 2.学生表 查 3.学生表中查出的教师id进行排序 5.教师表中查出的同样也对教师的id进行排序 6.进行左连接 总结: 进行连接的时候的关键是同样对教师的id进行先排序

  4. LRU算法 - LRU Cache

    这个是比较经典的LRU(Least recently used,最近最少使用)算法,算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”. 一般应 ...

  5. Linux 串口编程

    今天对应用层串口编程进行了验证.程序来源于以下参考链接,自己进行了一些注释和更改,记录于此. Tony Liu, 2016-6-17, Shenzhen 参考链接 https://www.ibm.co ...

  6. 一个简单的AJAX示例(转)

    转载自:http://www.cnblogs.com/rubylouvre/archive/2013/01/08/2851051.html,为了防备面试,备份一份吧!! 虽然现在有了框架,许多AJAX ...

  7. 【SPOJ】8222. Substrings(后缀自动机)

    http://www.spoj.com/problems/NSUBSTR/ 题意:给一个字符串S,令F(x)表示S的所有长度为x的子串中,出现次数的最大值.求F(1)..F(Length(S)) 这题 ...

  8. 【wikioi】3160 最长公共子串(后缀自动机)

    http://codevs.cn/problem/3160/ sam的裸题...(之前写了spoj上另一题sam的题目,但是spoj被卡评测现在还没评测完QAQ打算写那题题解时再来详细介绍sam的.. ...

  9. hdu 1026:Ignatius and the Princess I(优先队列 + bfs广搜。ps:广搜AC,深搜超时,求助攻!)

    Ignatius and the Princess I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J ...

  10. Spring中Adivisor和Aspect的差别(自我理解)

    在AOP中有几个概念: - 方/切 面(Aspect):一个关注点的模块化,这个关注点实现可能另外横切多个对象.事务管理是J2EE应用中一个非常好的横切关注点样例. 方面用Spring的Advisor ...