Java I/O模型的简单说明
1、同步和异步
同步:如果有多个任务或者事件要发生,这些任务或者事件必须逐个地进行,一个事件或者任务的执行会导致整个流程的暂时等待,这些事件没有办法并发地执行,最简单的例子就是顺序的执行两个方法,当第一个方法正在执行时,那么第二个方法需要等待第一个方法执行完毕后才能继续执行
异步:如果有多个任务或者事件发生,这些事件可以并发地执行,一个事件或者任务的执行不会导致整个流程的暂时等待,在Java中最常见的就是多线程来实现异步,执行一个方法的同时,开另外一个线程同时执行其他事情
2、阻塞和非阻塞
阻塞:当某个事件或者任务在执行过程中,它发出一个请求操作,但是由于该请求操作需要的条件不满足,那么就会一直在那等待,直至条件满足,比如实现一个功能是读取指定目录下的文件的内容,如果文件不存在,那么程序将无限循环的进行读取,比如每隔3s继续读一次,就好像服务器一样一直在后台以服务形式运行着
非阻塞:当某个事件或者任务在执行过程中,它发出一个请求操作,如果该请求操作需要的条件不满足,会立即返回一个标志信息告知条件不满足,不会一直在那等待,比如也是读取一个目录下指定文件,如果文件读取到,则返回文件的内容给程序,如果不存在则返回相应的状态,这段程序到这里就执行完毕了
同步、异步和阻塞、非阻塞之间没有必然联系,更不能划等号,
3、阻塞IO和非阻塞IO
IO操作包括对硬盘的文件读写,对socket的读写和对外部输入输出设备的操作
当用户调用程序发起一个IO的操作,比如通过socket接收请求的数据,内核会去查看要读取的数据是否就绪,对于阻塞IO,如果没有就绪,读取进程会一直等待,直到数据就绪;对于非阻塞IO,如果数据没有就绪,则会返回标志信息告知用户线程当前要读的数据没有就绪;当数据就绪后内核会将数据拷贝到用户线程
4、同步IO和异步IO
同步IO:当用户发出IO请求操作之后,如果数据没有就绪,需要通过用户线程或者内核不断地去轮询数据是否就绪,当数据就绪时,再将数据从内核拷贝到用户线程;
异步IO:只有IO请求操作的发出是由用户线程来进行的,IO操作的两个阶段都是由内核自动完成,然后发送通知告知用户线程IO操作已经完成。也就是说在异步IO中,不会对用户线程产生任何阻塞。
从上面来看,同步IO和异步IO是针对用户线程和内核的交互来区分的,关键所在就是数据拷贝阶段是内核完成,还是用户线程完成,异步IO必须依靠操作系统支持才可以
常用的5种IO模型有:阻塞IO模型、非阻塞IO模型、多路复用IO模型、信号驱动IO模型、异步IO模型
阻塞IO模型:最传统的IO模型,简单说来就是:数据没有就绪,线程一直处于阻塞状态,其他线程无法进行
非阻塞IO模型:无需等待,数据未就绪,返回一个错误的标识,让用户知道数据还没有准备好,还可以适时发送下一个请求
多路复用IO模型:目前使用的比较多,Java NIO就是多路复用的,线程会不断轮询读取socket状态,只有当socket有读写事件时,才真正调用实际的IO读写操作,只需要一个线程就可以管理多个socket,资源占用非常小;但是如果响应的信息量非常大,那么事件处理延时较长,会对性能有一定影响
信号驱动IO模型:当用户发起一个IO请求,会给socket注册一个信号函数,然后用户线程继续向下执行另外的操作,当内核就绪时会发送一个信号给线程,线程收到之后,就可以使用信号函数调用IO进行实际的读写操作
异步IO模型:这个算是最理想的IO模型,当用户线程发起IO请求操作之后,立刻就开始做其他事,内核收到asynchronous操作之后,会等待数据准备完成,然后将数据拷贝到用户线程,当这些操作完成之后,内核会给线程发送一个信号,告诉他请求操作完成了,用户线程完全不必关心整个IO操作是如何进行的,只需要发送一个请求,这些事就交给内核来做了,当线程收到内核返回的成功信号时,直接使用数据就可以了;整个过程是完全并行进行的,两个阶段都不会阻塞用户线程,异步IO需要操作系统底层的支持,从Java 7开始就支持Asynchronous IO了
上面5种模型中,前四种模型本质上都会对用户线程产生阻塞,实际上都属于同步IO,只有最后一种是真正的异步IO,因为用户线程不必要读取数据所以不会产生阻塞,线程和内核两个任务是并发的,这样才是理想的异步操作
基于以上的IO模型,在网络服务设计模式中,有两种比较经典的模式就是多线程和线程池,网络编程中的Reactor和Proactor实际上就是同步IO和异步IO的多路复用模式
Java I/O模型的简单说明的更多相关文章
- Java进阶(五)Java I/O模型从BIO到NIO和Reactor模式
原创文章,同步发自作者个人博客,http://www.jasongj.com/java/nio_reactor/ Java I/O模型 同步 vs. 异步 同步I/O 每个请求必须逐个地被处理,一个请 ...
- java线程内存模型,线程、工作内存、主内存
转自:http://rainyear.iteye.com/blog/1734311 java线程内存模型 线程.工作内存.主内存三者之间的交互关系图: key edeas 所有线程共享主内存 每个线程 ...
- spring 第一篇(1-1):让java开发变得更简单(下)转
spring 第一篇(1-1):让java开发变得更简单(下) 这个波主虽然只发了几篇,但是写的很好 上面一篇文章写的很好,其中提及到了Spring的jdbcTemplate,templet方式我之前 ...
- Java虚拟机内存模型及垃圾回收监控调优
Java虚拟机内存模型及垃圾回收监控调优 如果你想理解Java垃圾回收如果工作,那么理解JVM的内存模型就显的非常重要.今天我们就来看看JVM内存的各不同部分及如果监控和实现垃圾回收调优. JVM内存 ...
- Java I/O 模型的演进
什么是同步?什么是异步?阻塞和非阻塞又有什么区别?本文先从 Unix 的 I/O 模型讲起,介绍了5种常见的 I/O 模型.而后再引出 Java 的 I/O 模型的演进过程,并用实例说明如何选择合适的 ...
- Java 网络 IO 模型
在进入主题之前先看个 Java 网络编程的一个简单例子:代码很简单,客户端和服务端进行通信,对于客户端的每次输入,服务端回复 get.注意,服务端可以同时允许多个客户端连接. 服务端端代码: // 创 ...
- Java网络编程和NIO详解3:IO模型与Java网络编程模型
Java网络编程和NIO详解3:IO模型与Java网络编程模型 基本概念说明 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32 ...
- OSGI 面向Java的动态模型系统
OSGI (面向Java的动态模型系统) OSGi(Open Service Gateway Initiative)技术是Java动态化模块化系统的一系列规范.OSGi一方面指维护OSGi规范的OSG ...
- Java I/O模型从BIO到NIO和Reactor模式(转)
原创文章,转载请务必将下面这段话置于文章开头处(保留超链接).本文转发自技术世界,原文链接 http://www.jasongj.com/java/nio_reactor/ Java I/O模型 同步 ...
随机推荐
- singleton和prototype
public class testScope { @Test public void test() { //默任singleton ApplicationContext ctx= new ClassP ...
- Linux基本使用(1)-使用GCC编译C语言程序
- 快速理解C#高级概念(一) Delegate委托
做.NET开发很久,最近重新温习<C#高级编程>一书.发现很多曾经似懂非懂的问题,其实也是能够慢慢钻研慢慢理解的. 所以,打算开写<C#高级编程系列>博文.其中会借鉴<C ...
- emlog在nginx中添加rewrite规则
rewrite ^/(post|record|sort|author|page)-([-]+)\.html$ /index.php?$=$; rewrite ^/tag-(.+)\.html$ /in ...
- django学习<二>:连接数据库
发现假如没有很迫切的实际需求或者外界的压力的话,我这种人就很容易偷懒,之前看了一篇比较权威的谈django的文章,里面列举支持的数据库只有四种, 可是我熟悉的数据库只有sqlserver,然后就又怠工 ...
- 利用PHP从淘宝采集评论和成交数据
如果不想通过淘宝开放平台API获取数据,那么另外一个很好的办法就是采集了.一般来说,采集一个网页上的内容,只需要用CURL获取源代码,然后用正则表达式取出需要的内容就可以,不过如果这样载入一个淘宝的页 ...
- thinkphp伪静态(url重写)
1. 服务器开启url_rewrite功能,linux空间的php虚拟主机只需要开启apache的mod_rewriet,如果是iis6.0就要安装ISAPI Rewrite模块,apache只要开启 ...
- 如何设计PHP业务模块(函数/方法)返回结果的结构?
如题:如何设计业务模块返回结果的结构? 一个业务函数/方法执行后,对外输出数据的结构通常有以下几种: 1.返回数字,如 成功时返回 0,失败时返回 -1,有的还会用一个全局变量输出错误信息: < ...
- Swift-打开其它Storyboard中的自定义模态窗口
本文的方法针对OS X应用开发. 如果想在某个ViewController中,用模态窗口的方式,打开某个Storyboard中定义的WindowController.可用以下方式. let story ...
- 利用loadrunner代理方式,录制手机APP脚本
利用loadrunner代理方式录制手机(iPhone.android)应用程序HTTP脚本 工具/原料 loadrunner 智能手机 方法/步骤 利用笔记本网卡或者类似360随身wifi,在安 ...