Java之IO模型
首先来看一下同步与异步的概念:
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模型的更多相关文章
- Java 网络 IO 模型
在进入主题之前先看个 Java 网络编程的一个简单例子:代码很简单,客户端和服务端进行通信,对于客户端的每次输入,服务端回复 get.注意,服务端可以同时允许多个客户端连接. 服务端端代码: // 创 ...
- 阿里、腾讯热门面试题:聊聊Unix与Java的IO模型?(含详细解析)
众所周知 如果去百度.腾讯等一线大厂面试,一定会深入考候选人的基础技术功底,其中尤为关键和重视的就是IO相关的技术和知识. 而要搞明白IO相关的概念,首先就得弄清楚同步与异步,阻塞与非阻塞到底是什么意 ...
- 通过实例理解Java网络IO模型
网络IO模型及分类 网络IO模型是一个经常被提到的问题,不同的书或者博客说法可能都不一样,所以没必要死抠字眼,关键在于理解. Socket连接 不管是什么模型,所使用的socket连接都是一样的. 以 ...
- java nio io模型
I/O模型 在开始NIO的学习之前,先对I/O的模型有一个理解,这对NIO的学习是绝对有好处的.我画一张图,简单表示一下数据从外部磁盘向运行中进程的内存区域移动的过程: 这张图片明显忽略了很多细节,只 ...
- IO模型之AIO代码及其实践详解
一.AIO简介 AIO是java中IO模型的一种,作为NIO的改进和增强随JDK1.7版本更新被集成在JDK的nio包中,因此AIO也被称作是NIO2.0.区别于传统的BIO(Blocking IO, ...
- Netty学习(1):IO模型之BIO
概述 Netty其实就是一个异步的.基于事件驱动的框架,其作用是用来开发高性能.高可靠的IO程序. 因此下面就让我们从Java的IO模型来逐步深入学习Netty. IO模型 IO模型简单来说,就是采用 ...
- 从春节送祝福谈谈 IO 模型(二)
上期结合程序员小猿用温奶器给孩子热奶的故事,把面试中常聊的“同步.异步与阻塞.非阻塞有啥区别”简单进行普及. 不过,恰逢春节即将到来,应个景,不妨就通过实现新春送祝福的需求,深入了解一下 Java I ...
- 从养孩子谈谈 IO 模型(一)
同步/异步.阻塞/非阻塞 说的是一回事儿吗? 同步/异步.阻塞/非阻塞 你能通俗易懂的讲清楚吗? Java 中的 BIO.NIO.AIO 你了解吗? Socket 编程你还会吗? Linux 操作系统 ...
- JAVA基础知识之网络编程——-网络通信模型(IO模型)
<Unix网络编程:卷1>中介绍了5中I/O模型,JAVA作为运行在宿主机上的程序,底层也遵循这5中I/O模型规则.这5中I/O模型分别是: 阻塞式IO 非阻塞式IO I/O复用 信号驱动 ...
随机推荐
- NIO中Buffer的重要属性关系解析
Buffer 是java NIO中三个核心概念之一 缓存, 在java的实现体系中Buffer作为顶级抽象类存在 简单说,Buffer在做什么? 我们知道,在java IO中体系中, 因为InputS ...
- Mysql数据基本操作(增、删、改、查)
一.数据库配置 # 通过配置文件统一配置的目的: 统一管理 服务端(mysqld).客户端(client) 1.配置mysqld(服务端)的编码为utf-8,再创建数据库的时候,默认编码都采用了utf ...
- jQuery跳转到另一个页面以及原生js跳转到另一个页面
1.原生js我们可以利用http的重定向来跳转 window.location.replace("https://www.cnblogs.com/pythonywy/"); 2.原 ...
- SSH框架之Hibernate第三篇
1.1 多表关系分析和创建. 1.1.1 表关系分析和创建 表数据和表数据之间可以存在的关系? 一对多的关系 客户和联系人 建立关系原则: 在多的一方创建一个字段,这个字段作为外键指向一的一方的主键 ...
- Customize the View Items Layout 自定义视图项目布局
In this lesson, you will learn how to customize the default editor layout in a Detail View. For this ...
- 应用InstallShield 2015打包软件打包C#程序
大家都明白,程序员写出的程序与用户直接使用的程序之间还有一个简单的环节,就是打包.今天就简单介绍下用InstallShield 2015打包工具进行程序的打包, 有兴趣的可以看看! 首先前面安装打包工 ...
- adb 控制手机动作
下载adb工具包,解压即可 https://download.csdn.net/download/kai402458953/10784310 各种事件说明:https://blog.csdn.n ...
- day91_11_13Local与偏函数
一.local 在线程的处理中,常常遇到这样的问题.当一系列线程遇到io操作的时候,就会执行其他线程,这时候就会出现数据冲突,发生数据方面的问题: from threading import Thre ...
- 解决“QGtkStyle could not resolve GTK……”问题
如果出现错误 QGtkStyle could not resolve GTK. Make sure you have installed the proper libraries 或者出现错误 err ...
- Statements、PreparedStatement及CallableStatement(三)
当获得了与数据库的连接后,就可以与数据库进行交互了.JDBC Statement,CallableStatement和PreparedStatement接口定义了可用于发送SQL或PL/SQL命令,并 ...