深入浅出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中,可以从其中读入一个字节序列的对象称作输入流,而可以向其中写入一个字节序列的对象称作输出流.这些字节序列的来源地和目的地可以是文件,而且通常都 ...
随机推荐
- catch signal
捕抓信号 如果信号的处理动作是用户自定义函数,在信号递达时就调用这个函数,称为捕抓信号. 除了SIGSTOP和SIGKILL进程能够忽略或捕获其他的全部信号. 注:信号可从两个不同分类角度对信号进行分 ...
- 轻量级分布式 RPC 框架(转)
RPC,即 Remote Procedure Call(远程过程调用),说得通俗一点就是:调用远程计算机上的服务,就像调用本地服务一样. RPC 可基于 HTTP 或 TCP 协议,Web Servi ...
- hmacSHA1
import javax.crypto.Mac; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; publ ...
- PPT如何一页多张打印且铺满整个页面
最近由于工作需要,有些ppt材料想打印出来学习,但是ppt页数较多,ppt单页打印有些浪费纸张,而且也不能拿到外面打印店去打印,所以只能自己动手设置一页多张打印,并且最后双面打印,这样就做够节省纸张了 ...
- Python爬虫(八)
源码: import requests import re from my_mysql import MysqlConnect import time,random # 获取招聘详情链接 def ge ...
- Effective C++ Item 10,11 Have assignment operators return a reference to *this Handle assignment to self in operator =
If you want to concatenate assignment like this int x, y, z; x = y = z = 15; The convention is to ma ...
- iOS开发之--实现倒计时显示时分秒
这段时间写公司的一个外包项目,需要用到倒计时:需要显示时分秒,通过在网上搜集资料,找到了2中方法,我把这两种方法结合起来,可以很好的满足这个需求: 1.创建一个类继承自UIlabel,用来展示时分秒的 ...
- 'not all arguments converted during string formatting'错误告警信息解决办法
问题描述:
- 说说M451例程之PWM的寄存器讲解
M451提供了两路PWM发生器.每路PWM支持6通道PWM输出或输入捕捉.有一个12位的预分频器把时钟源分频后输入给16位的计数器,另外还有一个16位的比较器.PWM计数器支持向上,向下,上下计数方式 ...
- tomcat下载与安装..使用和配置环境变量
操作环境: xp, myEclipse6.5 tomcat6.0 正文: 一.下载 tomcat官方网站 http://tomcat.apache.org 在左边Download树形菜单中 点击最新版 ...