以下是IO的一个基本过程

先理解一下用户空间和内核空间,系统为了保护内核数据,会将寻址空间分为用户空间和内核空间,32位机器为例,高1G字节作为内核空间,低3G字节作为用户空间。当用户程序读取数据的时候,会经历两个过程:磁盘到内核空间(这块消耗性能,下面简称内核数据准备),内核空间拷贝到用户空间(下面简称用户空间拷贝)。

内核数据准备这部分是由DMA芯片实现的,而用户空间拷贝的实现则是由CPU实现的,后者非常快,能到1G以上,所以,所谓的阻塞基本是内核数据准备的过程,这块消耗时间。为啥呢?简单的理解就是,磁盘和内核缓存的速度本身就存在很大的差距。

基于这个前提,聊一下同步异步IO,阻塞非阻塞IO

同步异步是基于任务序列可靠性的角度区分,当一个任务依赖另外一个任务时,

同步就是,只有等被依赖的任务完成之后,依赖任务才算完成,是一种可靠任务序列。比如打电话。

异步就是,只是通知被依赖任务去做某件事情,由被依赖任务完成之后通知依赖任务,但是不能保证被依赖任务完成,是一个不可靠任务序列。比如发短信。

同步异步的选择其实就是可靠性和性能之前的取舍和平衡。

而阻塞非阻塞则是从CPU消耗的角度去区分

阻塞就是让CPU闲置,等IO等慢操作完成之后再继续。

非阻塞则是在等IO等慢操作的完成的同时,CPU去做一些其他事情。存在上下文切换。

阻塞非阻塞的选择就是在CPU利用率和系统切换成本之间的平衡。

上面四者两两组合情况如下

接下来了解一下linux下的几种IO模型

当我们进行IO操作的时候,如果被调用者将任务全部执行完返回,称为同步/阻塞 IO

如果被调用者,不管没有操作成功,直接返回一个结果码,但是不再主动通知后续结果,称为非阻塞IO;这种情况下需要重复调用查询状态。

如果被调用者,不管有没有操作成功,直接返回个结果码,等到全部操作完成之后再发一个信号通知调用者,称为异步IO

举个例子:

家里有个专门帮忙做饭的阿姨,有一天我想喝水了,我让阿姨帮忙烧一壶水。

我看着她去烧水,灌水,给我倒水,期间没有做其他任何事情,这就是同步。

我想着也不用一直等,可以先看会儿电视,我就隔一会儿来看一次,隔一会儿来看一次,这叫非阻塞。

再想想,这也烦,我索性跟阿姨说,好了叫我一声,然后就去看电视去了,这叫异步。

而IO多路复用,信号驱动IO则是基于前面四个模型的衍生。

IO多路复用是基于阻塞IO的衍生,主要是为了提高内核空间数据准备这一块的功能复用,即阻塞的同时监听多个端口,有一个端口有数据就进行处理,提高性能。

信号驱动IO则是在内核空间数据准备这一块采用异步,在用户空间拷贝这一块采用同步。

Java中的IO则分为以下几种

同步阻塞IO(Java IO)

l  用户进程发起一个IO操作之后,必须等待IO操作完成。

同步非阻塞IO(Java NIO)

l  用户发起一个IO操作之后,返回做其他事情,时不时的去询问IO是否就绪。

多路复用IO

l  用户发起一个IO操作之后,返回,等内核完成IO之后通知应用程序,这里的阻塞是指返回之后并没有做其他是,而是一并监听多个文件句柄,在select函数中,提高系统并发性。

异步非阻塞IO(Java NIO2)

l  用户发起一个IO操作之后,返回,等待 内核数据准备 和 用户空间拷贝都完成之后通知应用进程,中有实现。

NIO中的概念

Buffer:高效的数据容器,除了布尔类型,所有数据类型都有相应的Buffer实现。

Channel:作用类似Linux系统中的文件描述符,是用于支持抽象批量IO的一种抽象。相对于File/Socket:Channel是更加接近操作系统底层的一种抽象。

Selector:是NIO中多路复用的基础,可以同时检测注册在Selector上的多个Channel,进而对准备好的任一Channel进行处理。(这部分在linux中依赖epoll,windows上依赖iocp)

Charset,提供了字符编解码器,可以实现字符到ByteBuffer的转换。

内存映射:可以将内核空间地址和用户空间地址映射到同一物理地址

零拷贝技术:数据只在内核空间流转,没有经过用户空间。

理解同步,异步,阻塞,非阻塞,多路复用,事件驱动IO的更多相关文章

  1. 谈谈对不同I/O模型的理解 (阻塞/非阻塞IO,同步/异步IO)

    一.关于I/O模型的问题 最近通过对ucore操作系统的学习,让我打开了操作系统内核这一黑盒子,与之前所学知识结合起来,解答了长久以来困扰我的关于I/O的一些问题. 1. 为什么redis能以单工作线 ...

  2. 阻塞I/O、非阻塞I/O和I/O多路复用、怎样理解阻塞非阻塞与同步异步的区别?

    “阻塞”与"非阻塞"与"同步"与“异步"不能简单的从字面理解,提供一个从分布式系统角度的回答.1.同步与异步 同步和异步关注的是消息通信机制 (syn ...

  3. JAVA 中BIO,NIO,AIO的理解以及 同步 异步 阻塞 非阻塞

    在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解.具体如下: 序号 问题 1 什么是同步? 2 什么是异步? 3 什么是阻塞? 4 什么是非阻塞? 5 什么是同步阻塞? 6 什么是同步 ...

  4. 同步&异步+阻塞&非阻塞(理解)

    0 - 同步&异步 同步和异步关注的是消息通信机制. 0.1 - 同步 由“调用者”主动等待这个“调用”结果.即是,发出一个“调用”时,在没有得到结果之前,该“调用”不返回,一旦调用返回,则得 ...

  5. linux基础编程:IO模型:阻塞/非阻塞/IO复用 同步/异步 Select/Epoll/AIO(转载)

      IO概念 Linux的内核将所有外部设备都可以看做一个文件来操作.那么我们对与外部设备的操作都可以看做对文件进行操作.我们对一个文件的读写,都通过调用内核提供的系统调用:内核给我们返回一个file ...

  6. 哪5种IO模型?什么是select/poll/epoll?同步异步阻塞非阻塞有啥区别?全在这讲明白了!

    系统中有哪5种IO模型?什么是 select/poll/epoll?同步异步阻塞非阻塞有啥区别? 本文地址http://yangjianyong.cn/?p=84转载无需经过作者本人授权 先解开第一个 ...

  7. 【转载】高性能IO设计 & Java NIO & 同步/异步 阻塞/非阻塞 Reactor/Proactor

    开始准备看Java NIO的,这篇文章:http://xly1981.iteye.com/blog/1735862 里面提到了这篇文章 http://xmuzyq.iteye.com/blog/783 ...

  8. Python之路(第三十六篇)并发编程:进程、同步异步、阻塞非阻塞

    一.理论基础 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所有内容都是围绕进程的概念展开的. 即使可以利用的cpu只有一个(早期的 ...

  9. {Python之进程} 背景知识 什么是进程 进程调度 并发与并行 同步\异步\阻塞\非阻塞 进程的创建与结束 multiprocess模块 进程池和mutiprocess.Poll

    Python之进程 进程 本节目录 一 背景知识 二 什么是进程 三 进程调度 四 并发与并行 五 同步\异步\阻塞\非阻塞 六 进程的创建与结束 七 multiprocess模块 八 进程池和mut ...

随机推荐

  1. ESS控制台发布新功能:创建多实例规格的伸缩配置

    背景 原弹性伸缩ESS服务限定,生效的伸缩配置中只能对应一种实例规格,这样就会存在如果生效的配置中的实例规格的库存不足(高配实例规格通常更容易出现库存不足的情况)时, 用户配置好的伸缩规则以及伸缩组对 ...

  2. Chapter 2 Secondary Sorting:Detailed Example

    2.1 Introduction MapReduce framework sorts input to reducers by key, but values of reducers are arbi ...

  3. 前端工程师使用 Deepin 笔记

    笔者是一枚前端开发,在学习 Linux 的时候碰到了一个问题 —— 怎么练手?因为自己电脑上面装的是 Windows 系统,所以学习 Linux 的时候没办法进行练习,而敲指令是学习 Linux 最高 ...

  4. 粒子群优化算法PSO及matlab实现

    算法学习自:MATLAB与机器学习教学视频 1.粒子群优化算法概述 粒子群优化(PSO, particle swarm optimization)算法是计算智能领域,除了蚁群算法,鱼群算法之外的一种群 ...

  5. 【NOI2008】假面舞会

    题目描述 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会. 今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具.每个面具都有一个编号,主办方会把此编号 ...

  6. [TJOI2018]智力竞赛

    题目 发现我们需要最大化最小值,基本是二分了 那么我们二分出来一个值我们将小于等于这个值的都删去,现在的问题变成了如何用\(n+1\)条路径覆盖这张图 这不最小路径覆盖吗 于是我就忘了最小路径覆盖怎么 ...

  7. 【[HAOI2012]高速公路】

    披着期望外衣的数据结构? 非常毒瘤 我们要求得期望其实就是 \[\frac{\sum_{i=l}^{r}\sum_{j=i+1}^{r}dis(i,j)}{\binom{r-l+1}{2}}\] 好像 ...

  8. HttpURLConnection与HttpClient学习

    转载HttpURLConnection与HttpClient浅析 一.HttpURLConnection的使用 import org.slf4j.Logger; import org.slf4j.Lo ...

  9. 知乎TensorFlow入门学习记录

    知乎地址:https://zhuanlan.zhihu.com/p/30487008 import tensorflow as tf a=tf.placeholder(tf.int16) # 接受的数 ...

  10. 升级到 OS EI 后 cocoa pods

    安装: sudo gem install -n /usr/local/bin cocoapods 如果出现:pod :command not found 解决办法 S1:cd /Library/Rub ...