首先来看一下同步与异步的概念:

  1.同步是指当前端发起一次操作请求时,只有后台执行完所有的代码操作才会给前端返回值。

  2.异步是将前端发回的消息加入消息队列,并且立刻给前端返回请求,告诉用户可以离开当前页面去做别的事情。当后台处理完成,操作系统会通知事件和回调机制等通知相应的县城进行后续操作。

 同步和异步最大的区别在于:一个需要等待,一个不需要等待。

接下来解释一下常见的IO模型:

  阻塞IO模型(最传统的IO模型):在读写数据过程中会发生阻塞现象。当用户线程发出IO请求之后,内核会去查看数据是否就绪,如果没有就绪就会等待数据就绪,而用户线程就会处于阻塞状态,用户线程交出CPU。当数据就绪之后,并返回结果给用户线程,用户线程才解除block状态。

  典型的阻塞IO模型的例子为:data=socket.read();如果数据没有就绪,就会一直阻塞在read方法。

  非阻塞IO模型:当用户线程发起read操作后,并不需要等待,而是马上就得到一个结果。如果结果是error时,它就知道数据还没有准备好,于是它可以再次发送read操作。一旦内核中的数据准备好了,并且又再次收到了用户线程的请求,那么它马上就将数据拷贝到用户线程,然后返回。

  在非阻塞IO模型中,用户线程需要不断地询问内核数据是否就绪,也就是说非阻塞IO不会交出CPU,而是一直占用CPU。

  典型的非阻塞IO模型一般如下:

 while(true){
data = socket.read();
if(data!= error){ //处理数据
break;
}
}

  多路复用IO模型:NIO实际上就是多路复用IO。在多路复用IO模型中,会有一个线程不断去轮询多个socket的状态,只有当socket真正有读写事件时,才会调用实际的IO读写操作。多路复用IO模式,通过一个线程就可以管理多个socket,不需要建立新的进程或线程,也不必维护这些线程和进程,只有当socket真正有读写事件发生时才会占用资源来进行实际的读写操作。所以他大大减少了资源占用。因此,多路复用IO适合连接数比较多的情况。

  在NIO中,通过selector.select()去查询每个通道是否有到达事件,如果没有则一直阻塞在那里,因此这种方式会导致线程阻塞。

  多路复用IO为何比非阻塞IO的效率高?

   答:是因为在非阻塞IO中,不断地去询问socket状态是通过用户线程去进行的,而在多路复用IO中,轮询每个socket状态是在内核进行的,效率比用户线程要高。不过要注意的是,多路复用IO模型是通过轮询的方式来检测是否有事件到达,并且对于到达的时间逐一进行响应。因此对于多路复用IO模型来说,一旦事件响应体很大,那么就会导致后续的事件迟迟得不到处理并且会影响新的事件轮询。

  信号驱动IO模型:在信号驱动IO中,当用户线程发起一个IO请求操作,会给对应的socket注册一个信号数,然后用户线程会继续执行,当内核数据就绪时会发送一个信号给用户线程,用户线程接收到信号后,便在信号函数中调用IO读写操作来进行实际的IO请求操作。

  异步IO模型:异步IO模型是理想的IO模型。在异步IO模型中,当用户线程发起read操作后,就可以开始去做别的事情。另一方面,从内核的角度,当它收到一个asynchronous read之后,它会立刻返回,说明read请求已经成功发起了,因此不会对用户线程产生任何block。然后内核会等待数据准备完成,将数据拷贝到用户线程,当这一切都完成后,内核会给用户线程发送一个信号,告诉它read操作完成了。

  在异步IO模型中,IO操作的两个阶段都不会阻塞用户线程,这两个阶段都是由内核自动完成,然后发送一个信号告知用户线程操作已经完成。用户线程中不需要再次调用IO函数进行具体的读写。

Java之IO模型的更多相关文章

  1. Java 网络 IO 模型

    在进入主题之前先看个 Java 网络编程的一个简单例子:代码很简单,客户端和服务端进行通信,对于客户端的每次输入,服务端回复 get.注意,服务端可以同时允许多个客户端连接. 服务端端代码: // 创 ...

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

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

  3. 通过实例理解Java网络IO模型

    网络IO模型及分类 网络IO模型是一个经常被提到的问题,不同的书或者博客说法可能都不一样,所以没必要死抠字眼,关键在于理解. Socket连接 不管是什么模型,所使用的socket连接都是一样的. 以 ...

  4. java nio io模型

    I/O模型 在开始NIO的学习之前,先对I/O的模型有一个理解,这对NIO的学习是绝对有好处的.我画一张图,简单表示一下数据从外部磁盘向运行中进程的内存区域移动的过程: 这张图片明显忽略了很多细节,只 ...

  5. IO模型之AIO代码及其实践详解

    一.AIO简介 AIO是java中IO模型的一种,作为NIO的改进和增强随JDK1.7版本更新被集成在JDK的nio包中,因此AIO也被称作是NIO2.0.区别于传统的BIO(Blocking IO, ...

  6. Netty学习(1):IO模型之BIO

    概述 Netty其实就是一个异步的.基于事件驱动的框架,其作用是用来开发高性能.高可靠的IO程序. 因此下面就让我们从Java的IO模型来逐步深入学习Netty. IO模型 IO模型简单来说,就是采用 ...

  7. 从春节送祝福谈谈 IO 模型(二)

    上期结合程序员小猿用温奶器给孩子热奶的故事,把面试中常聊的“同步.异步与阻塞.非阻塞有啥区别”简单进行普及. 不过,恰逢春节即将到来,应个景,不妨就通过实现新春送祝福的需求,深入了解一下 Java I ...

  8. 从养孩子谈谈 IO 模型(一)

    同步/异步.阻塞/非阻塞 说的是一回事儿吗? 同步/异步.阻塞/非阻塞 你能通俗易懂的讲清楚吗? Java 中的 BIO.NIO.AIO 你了解吗? Socket 编程你还会吗? Linux 操作系统 ...

  9. JAVA基础知识之网络编程——-网络通信模型(IO模型)

    <Unix网络编程:卷1>中介绍了5中I/O模型,JAVA作为运行在宿主机上的程序,底层也遵循这5中I/O模型规则.这5中I/O模型分别是: 阻塞式IO 非阻塞式IO I/O复用 信号驱动 ...

随机推荐

  1. NIO中Buffer的重要属性关系解析

    Buffer 是java NIO中三个核心概念之一 缓存, 在java的实现体系中Buffer作为顶级抽象类存在 简单说,Buffer在做什么? 我们知道,在java IO中体系中, 因为InputS ...

  2. Mysql数据基本操作(增、删、改、查)

    一.数据库配置 # 通过配置文件统一配置的目的: 统一管理 服务端(mysqld).客户端(client) 1.配置mysqld(服务端)的编码为utf-8,再创建数据库的时候,默认编码都采用了utf ...

  3. jQuery跳转到另一个页面以及原生js跳转到另一个页面

    1.原生js我们可以利用http的重定向来跳转 window.location.replace("https://www.cnblogs.com/pythonywy/"); 2.原 ...

  4. SSH框架之Hibernate第三篇

    1.1 多表关系分析和创建. 1.1.1 表关系分析和创建 表数据和表数据之间可以存在的关系? 一对多的关系 客户和联系人 建立关系原则: 在多的一方创建一个字段,这个字段作为外键指向一的一方的主键 ...

  5. Customize the View Items Layout 自定义视图项目布局

    In this lesson, you will learn how to customize the default editor layout in a Detail View. For this ...

  6. 应用InstallShield 2015打包软件打包C#程序

    大家都明白,程序员写出的程序与用户直接使用的程序之间还有一个简单的环节,就是打包.今天就简单介绍下用InstallShield 2015打包工具进行程序的打包, 有兴趣的可以看看! 首先前面安装打包工 ...

  7. adb 控制手机动作

    下载adb​​工具包,解压即可  https://download.csdn.net/download/kai402458953/10784310 各种事件说明:https://blog.csdn.n ...

  8. day91_11_13Local与偏函数

    一.local 在线程的处理中,常常遇到这样的问题.当一系列线程遇到io操作的时候,就会执行其他线程,这时候就会出现数据冲突,发生数据方面的问题: from threading import Thre ...

  9. 解决“QGtkStyle could not resolve GTK……”问题

    如果出现错误 QGtkStyle could not resolve GTK. Make sure you have installed the proper libraries 或者出现错误 err ...

  10. Statements、PreparedStatement及CallableStatement(三)

    当获得了与数据库的连接后,就可以与数据库进行交互了.JDBC Statement,CallableStatement和PreparedStatement接口定义了可用于发送SQL或PL/SQL命令,并 ...