java IO 模型--快速分清 同步|阻塞
IO 介绍
IO 模型
IO请求 分为两个阶段:等待资源 和 使用资源;
IO请求:一般需要请求特殊资源(如 磁盘、RAM 或文件),当资源被上一个使用者使用没有释放的时候, IO请求会被阻塞,直到资源可用。
等待资源 阶段有两种策略:
- 阻塞:当IO请求资源没有准备好的时候,请求阻塞,直到得到资源的响应(有资源 或者 超时异常);
- 非阻塞:资源不可用时,IO请求直接返回,返回数据不可用标志。
使用资源 阶段,IO 分为 同步IO 和 异步IO
- 同步IO:应用阻塞在发送数据和接受数据阶段,直到数据发送或接收完毕 或 失败返回;
- 异步IO:应用发送或接受数据后,即返回,数据写入OS 缓存,由OS 完成数据的发送或接受,完成后,发送成功后失败标志给应用。
Unix IO 模型
- 阻塞IO:等待资源阻塞,使用资源同步;
- 非阻塞IO:等待资源轮询,使用资源同步;
- IO 复用:支持多路复用,等待阻塞在复用选择器上,使用资源同步的方式;
- 信号驱动 :等待资源通知,使用资源同步;
- 异步IO :等待 和 使用 采用通知的方式。
各种IO特点:
- 阻塞IO:使用简单,但是每个socket请求会新建一个线程处理,这些线程大多数是没有运算的,造成线程的膨胀;Java BIO 使用这种方式。
- 非阻塞IO:采用轮询的方式,因此不会造成线程的膨胀。java NIO 采用这种方式,大大减少了线程数,可以使用一个线程完成对所有socket 的监听。
另外,NIO 底层采用多路复用IO的方式(select阻塞,支持多路复用),但是java 的实现接口,采用了轮询的方式,貌似一种非阻塞的形态。 - 同步IO:IO 操作结束之后才返回,效率低些,但是编程方式简单。java BIONIO 都是采用这种方式。
- 异步IO:由于异步IO 只是写入了缓存,由缓存到磁盘成功与否未可知,因此异步IO 相当于把IO操作分成了两部分:发起请求,获取返回结果。因此对应用来说增加了编程复杂性。
但是异步IO的性能是非常好的,而异步的思想贯穿了IT系统的方方面面。
一些概念:
1、 IOPS:每秒处理的IO 数量。
2、多路复用技术:
信号通路的带宽大于单一信号的数据量大小,为了有效利用带宽,希望信号通路可以一次性传递多个信号数据,这就是多路复用技术。
nio中就是,一个线程可以监听多个通信信道(不同的socket),所以是多个通信信道复用一个监听|轮询线程,即多路复用
分类:频分多路复用 和 时分多路复用
IO 组合方式:

java IO 模型--快速分清 同步|阻塞的更多相关文章
- Java IO模型:BIO、NIO、AIO
Java IO模型:BIO.NIO.AIO 本来是打算直接学习网络框架Netty的,但是先补充了一下自己对Java 几种IO模型的学习和理解.分别是 BIO.NIO.AIO三种IO模型. IO模型的基 ...
- java io 模型重点讲述
java io 模型重点讲述 bio(阻塞) 同步IO 接受请求与处理请求用同一条线程 aio 应用程序线程会向系统注册一个socket请求,以及一个回调方法,继续执行下去.socket接受区的数据监 ...
- IO模型介绍 以及同步异步阻塞非阻塞的区别
阻塞:用户进程访问数据时,如果未完成IO,等待IO操作完成或者进行系统调用来判断IO是否完成非阻塞:用户进程访问数据时,会马上返回一个状态值,无论是否完成 同步:用户进程发起IO(就绪判断)后,轮 ...
- IO模型对比:同步、异步、阻塞、非阻塞
最近工作接触到了网络服务同步和异步,所以学习了下<UNIX网络编程>,在此作下总结. 一.I/O模型 输入/输出(I/O)是在主存和外部设备(如磁盘驱动器.终端和网络)之间拷贝数据的过程. ...
- Java IO模型
Linux的内核将所有外部设备都看做一个文件来操作,对一个文件的读写操作会调用内核提供的系统命令,返回一个file descriptor(fd,文件描述符).而对一个Socket的读写也会有相应的描述 ...
- 深入浅出java IO模型
一.同步和异步 同步:一个事件或者任务的执行,会使整个流程暂时等待,也就是说如果有多个任务要执行,必须要逐个进行. 异步:一个事件或者任务的执行,不会使整个流程暂时等待,也就是说如果有多个任务要执行, ...
- Java IO(3)非阻塞式输入输出(NIO)
在上篇<Java IO(2)阻塞式输入输出(BIO)>的末尾谈到了什么是阻塞式输入输出,通过Socket编程对其有了大致了解.现在再重新回顾梳理一下,对于只有一个“客户端”和一个“服务器端 ...
- IO模型《二》阻塞IO
阻塞IO(blocking IO) 在linux中,默认情况下所有的socket都是blocking,一个典型的读操作流程大概是这样: 当用户进程调用了recvfrom这个系统调用,kernel就开始 ...
- 谈IO中的阻塞和非阻塞,同步和异步及三种IO模型
什么是同步和异步? 烧水,我们都是通过热水壶来烧水的.在很久之前,科技还没有这么发达的时候,如果我们要烧水,需要把水壶放到火炉上,我们通过观察水壶内的水的沸腾程度来判断水有没有烧开.随着科技的发展,现 ...
随机推荐
- Mybatis入门及第一个Mybatis程序
Mybatis笔记整理 所需要的基础知识 JDBC Mysql Java基础 Maven Junit 框架:是有配置文件的.最好的方式:看官网文档 1.简介 1.1.什么是MyBatis 简介 什么是 ...
- 【证书】curl 和 java 请求报证书错误
1. 说明: 以下:例子的域名因为工作环境的问题,被我拿自己的博客域名替代了,所以无法进行模拟测试,请珍重,哈哈! 2. 环境: centos:7.5 java jdk:1.8.0_74 3. cur ...
- ModelSim入门
verilog设计进阶 时间:2014年5月5日星期一 主要收获: 1. 安装了ModelSim ALTERA 6.4a; 2. 熟悉基本流程,仿真成功: 3. 了解testbench语法基本. 为什 ...
- PyQt(Python+Qt)学习随笔:纯文本编辑器QPlainTextEdit功能详解
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 一.概述 QPlainTextEdit是用于纯文本的一个高级文档编辑器 ...
- 第14.12节 Python中使用BeautifulSoup解析http报文:使用select方法快速定位内容
一. 引言 在<第14.10节 Python中使用BeautifulSoup解析http报文:html标签相关属性的访问>和<第14.11节 Python中使用BeautifulSo ...
- PyQt学习随笔:Qt中tem Views(Model-Based)和Item Widgets(Item-Based)控件的用途和关系
在界面程序开发中,数据的展示主要包括表格.简单列表.树状列表以及纯文本等多种方式,在Qt中将界面表格.简单列表.树状列表称为"表项视图类(item view class)",并提供 ...
- DeepFM——tensorflow代码改编
本人代码库: https://github.com/beathahahaha/tensorflow-DeepFM-master-original DeepFM原作者代码库: https://githu ...
- 团队作业6——Alpha阶段项目复审
复审人:利国铭 复审人看什么: 软件的质量:解决原计划解决的问题了么,软件运行质量如何?用户有多少,用户反馈如何? 软件工程的质量:代码在哪里? 代码能在新的机器上构建成功么? 代码可维护性如何?每日 ...
- 深入理解Java虚拟机(十)——线程安全与锁优化
什么是线程安全 当多个线程同时访问一个对象的时候,不需要考虑什么额外的操作就能获取正确的值,就是线程安全的. 线程安全的程度 1.不可变 不可变的对象一定是线程安全的,因为值始终只有一个. final ...
- rocketMq指定broker ip地址,适合解决云主机部署问题
在工作中遇到了一个这个问题,就是我们rocketmq是部署在云主机上的 但是我们的开发同事在自己的电脑连接rocketmq链接不上 报错显示Caused by: org.apache.rocket ...