同步IO:导致请求进程阻塞,直到IO操作完成;

是内核通知我们何时进行启动IO操作,而实际的IO操作需要当前进程本身阻塞完成;

包括:阻塞式IO模型,非阻塞式IO模型,IO复用模型,信号驱动式IO模型

异步IO:不导致请求进程阻塞;

是告知内核,内核将IO操作完成之后,通知当前进程,整个过程不需要阻塞;

POSIX的aio_系列函数,目前支持POSIX异步IO的系统比较少见;

如下图(UNP),我们从纵向看,分为两个过程:(1) 等待数据 (2) 将数据从内核复制到用户空间

可以看到前面4种同步IO虽然第一个步骤方式不尽相同,但是在第(2)步的时候均是阻塞的完成数据从内核到用户空间的复制;

而异步IO是内核来完成这两个步骤,并通知当前进程,整个过程不需要阻塞,如图最后一种方式;

下面在结合上图说明下同步IO中的这4种有什么区别,主要是体现在上述过程的第(1)阶段,即等待数据的过程;

阻塞IO:发起操作,如果数据尚未准备就绪,则一直处于阻塞状态,直到数据准备好,完成数据的复制;如上图,阻塞IO的第(1)阶段也是一个阻塞过程;

非阻塞IO:发起操作,检查数据是否准备就绪,未准备就绪立即返回,然后不断检查,直到数据准备继续,阻塞完成数据复制;如上图,非阻塞IO的第(1)阶段是一个反复检查的过程;

IO复用:自己等不如大家一起等,多个描述符添加到epoll/select中一起阻塞等待数据准备就绪,当有数据准备就绪之后,触发事件,对应阻塞完成数据复制;如上图,IO复用的第(1)阶段是阻塞在IO复用的系统调用上的过程;

信号驱动IO:注册一个SIGIO的信号处理函数,当有数据准备好的时候,产生SIGIO信号,触发信号处理函数,阻塞完成数据复制;如上图,信号驱动IO第(1)阶段不需要任何操作,只需要等待信号触发;

Linux IO 同步/异步 阻塞/非阻塞的更多相关文章

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

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

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

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

  3. 操作系统介绍-操作系统历史,IO,进程的三态,同步异步阻塞非阻塞

    1.操作系统历史 2.进程,IO,同步异步阻塞非阻塞 操作系统历史: 手工操作: 1946年第一台计算机诞生--20世纪50年代中期,计算机工作还在采用手工操作方式.此时还没有操作系统的概念. 手工操 ...

  4. 理解同步,异步,阻塞,非阻塞,多路复用,事件驱动IO

    以下是IO的一个基本过程 先理解一下用户空间和内核空间,系统为了保护内核数据,会将寻址空间分为用户空间和内核空间,32位机器为例,高1G字节作为内核空间,低3G字节作为用户空间.当用户程序读取数据的时 ...

  5. (转)同步异步,阻塞非阻塞 和nginx的IO模型

    同步异步,阻塞非阻塞 和nginx的IO模型  原文:https://www.cnblogs.com/wxl-dede/p/5134636.html 同步与异步 同步和异步关注的是消息通信机制 (sy ...

  6. Java IO 学习(一)同步/异步/阻塞/非阻塞

    关于IO,同步/异步/阻塞/非阻塞,这几个关键词是经常听到的,譬如: “Java oio是阻塞的,nio是非阻塞的” “NodeJS的IO是异步的” 但是这些东西听多了就容易迷糊,比方说同步是否就是阻 ...

  7. python并发编程之IO模型 同步 异步 阻塞 非阻塞

    IO浅谈 首先 我们在谈及IO模型的时候,就必须要引入一个“操作系统”级别的调度者-系统内核(kernel),而阻塞非阻塞是跟进程/线程严密相关的,而进程/线程又是依赖于操作系统存在的,所以自然不能脱 ...

  8. 转:IO模型-- 同步和阻塞,异步和非阻塞的区别

    源地址 http://hi.baidu.com/deep_pro/item/db0c581af1c1f17e7b5f2534 这些词之间的区别难倒了很多人,还有什么同步阻塞, 同步非阻塞, 异步阻塞, ...

  9. 深入了解几种IO模型(阻塞非阻塞,同步异步)

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/zk3326312/article/details/79400805一般来说,Linux下系统IO主要 ...

随机推荐

  1. 自动化测试--封装getDriver的方法

    在自动化测试的时候,通常都会把最常用的功能封装起来,实现通用性. 该篇博客是实现了getDriver方法的封装. 第一次封装的时候,是使用的传参. @Parameters(value = {" ...

  2. Leetcode代码补全——二叉树

    在刷leetcode的过程中发现,在原网页输入答案是不需要自己构筑树和链表的,虽然便于直接思考算法,但是久而久之类似过于依赖编辑器,反而不知道如何创建树和链表,因此总结了该网页省略的部分,以其中题为例 ...

  3. pyinstaller加密打包

    pyinstaller -F -w --key=keys --clean --icon=imgs/xxx.ico xxx.py

  4. web3无法安装的额解决方案-----yarn命令安装web3

    凡是可以用 JavaScript 来写的应用,最终都会用 JavaScript 来写. --Atwood定律(Jeff Atwood在2007年提出) yarn命令详解 https://yarnpkg ...

  5. Go基础篇【第2篇】: 内置库模块 fmt

    fmt官方文档说明:https://studygolang.com/pkgdoc import "fmt" mt包实现了类似C语言printf和scanf的格式化I/O.格式化动作 ...

  6. winform 不同语言(中文,英文等)

    Visual Studio 对于.NET 程序的本地化提供了完整的支持,这里仅介绍实现多语言版本本地化程序的简单步骤.注意黑体处为关键点.一. 窗体本地化    对于Windows 窗体,你需要做的第 ...

  7. Java基础——IO

    一.概述 I/O,Input/Output输入输出.输入机制比如读取文件数据.用户键盘输入等,输出,比如将数据输出到磁盘等. Java的IO是以流(Stream)为基础的. 流的叫法十分形象,你可以想 ...

  8. can be found for element 'tx:annotation-driven'

    错误描述: ERROR [ContainerBackgroundProcessor[StandardEngine[Catalina]]] (ContextLoader.java:308) - Cont ...

  9. [C/C++] C++中new的语法规则

    int *x = new int; //开辟一个存放整数的存储空间,返回一个指向该存储空间的地址(即指针) ); //开辟一个存放整数的空间,并指定该整数的初值为100,返回一个指向该存储空间的地址 ...

  10. tomcat 路径"/"表示根目录