以下是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. maven将依赖的包一起打包

    把以下内容输入到pom中即可 <build> <plugins> <!-- 将项目的依赖包复制到 target/lib --> <plugin> < ...

  2. LAMP配置NFS页面共享,autofs实现挂载,DNS实现名称解析,纯手动操作

    0.实验架构: 共6台服务器 分工如下: 服务器 职责 IP地址 Centos版本 描述 A DNS 172.18.7.70 7 B Apache 172.18.7.71 7 httpd+php-fp ...

  3. ZT I Believe I Can Fly(我相信我能飞)

    I Believe I Can Fly(我相信我能飞) 歌手:R. Kelly(罗 凯利) 歌词部分 I used to think that I could not go on 我原以为我无法坚持下 ...

  4. linux man指令问题

    linux man指令问题 2010-1-13 13:33 提问者: 钟离伊轩 man命令执行时,可加入数值,来限制帮助级别. 这句话对不对啊???? 我记得man page是分章节的..好像可以加数 ...

  5. 原生JS写了一个小demo,根据输入的数字生成不同背景颜色的小方块儿~

    昨天练习写了这个小demo,个人觉得通过设置定位元素left和top的值,来实现换行的功能,这种方法很巧妙~ 另外,如下代码中的随机颜色的获取,还请各位前辈多多指教:需要改进的地方:或者有没有更好的方 ...

  6. IOS XMPP(即时通讯的框架)

    #import "AppDelegate.h" #import "XMPPFramework.h" /* * 在AppDelegate实现登录 1. 初始化XM ...

  7. SpringMvc+Spring+MyBatis+Maven

    使用Maven构建项目 1) 创建一个Maven的war工程 2) 在webapp/WEB-INF下创建一个web.xml文件 <?xml version="1.0" enc ...

  8. Vuex、Flux、Redux、Redux-saga、Dva、MobX

    https://www.jqhtml.com/23003.html 这篇文章试着聊明白这一堆看起来挺复杂的东西.在聊之前,大家要始终记得一句话:一切前端概念,都是纸老虎. 不管是Vue,还是 Reac ...

  9. Autorelease 性能测试

    __weak NSString *string_weak_ = nil; - (void)viewDidLoad { [super viewDidLoad]; // 场景 1 NSString *st ...

  10. nowcoder模拟赛

    R1 D1 普及组... T1/T2 咕 T3 链接:C 小A有一个只包含左右括号的字符串S.但他觉得这个字符串不够美观,因为它不是一个合法的括号串.一个合法的括号串是这样定义的: ()是合法的括号串 ...