1. 什么是IO?

 在计算机中无时无刻不存在着对数据的访问和读取(数据都存储在物理的媒介上,例如寄存器,高速缓存,内存,磁盘,网卡等等),这些操作被称为IO。

2. 阻塞IO

 

  (1)当用户线程发起IO请求后,会进行系统调用(system call)来让内核(Kernel)进行IO操作

   (2)此时用户线程阻塞,等待内核将数据准备好

   (3)内核将数据准备好后会将数据从内核空间拷贝到用户空间,并返回给用户线程结束阻塞。

3. 非阻塞IO

  

   (1) 由用户线程发起IO请求, 进行系统调用来让内核进行IO操作

(2) 此时如果内核没有准备好数据则会直接返回error,并不会阻塞用户线程,用户线程可以重复的发起IO请求

    (3)当用户线程发起请求并且内核已经将数据准备好后,会将数据从内核空间拷贝到用户空间(这个过程是需要阻塞用户线程的),返回给用户

4. 多路复用IO

  

  (1)用户线程调用select后进行系统调用(内核会监视所有select负责的socket),此时用户线程被阻塞

   (2)当内核将数据准备好后就会返回,并通知用户线程进行读取操作,此时内核将数据拷贝到用户空间并返回

5. 异步IO

  

  (1)用户线程进行aio_read,进行系统调用切换到内核

   (2)内核立即返回,并不会阻塞用户线程

   (3)内核准备好数据后会将数据从内核空间拷贝到用户空间并通知用户线程操作已完成

6. 阻塞IO与非阻塞IO?

    阻塞IO:用户线程发起IO操作,紧接着由内核线程来执行IO操作,在阻塞IO中内核线程并不会立即返回而是等待数据拷贝到内存空间时才返回,在此期间用户线程处于阻塞状态。

 非阻塞IO: 与阻塞IO不同,内核线程在执行IO操作后会立即返回,若结果为error则用户线程可以重新发起请求而不会被阻塞,一旦内核将数据准备好了且用户线程发起了IO请求那么将数据拷贝到用户空间。

  我们看上面的图可以知道IO操作大致分为两个部分:

  (1)用户线程发起IO请求时,内核未准备好数据

  (2)用户线程发起IO请求时,内核以准备好数据

通过对比两个图中流程我们可以发现,(2)这个流程在阻塞IO与非阻塞IO流程是相同的区别在于(1)这个步骤。因此阻塞IO与非阻塞IO的区别在于内核线程在执行IO操作时是否立即返回结果,若立即返

回则为非阻塞IO,反之则为阻塞IO。

7. 同步与异步IO?

 异步IO:  用户线程发起IO操作后,可以立即去做其他事情,另一方面,对于内核线程当它收到异步读取之后会立即返回,不会对用户线程造成阻塞。当内核将数据准备好之后会将数据从内核空间拷贝到用户空间,内核会发送    给用户一个信号通知用户IO操作已完成。

同步IO: 同步IO的关键在于在真正读取数据(也就是上面提到的(2)这个步骤)的时候用户线程是否被阻塞。非阻塞IO虽然在用户发起请求时会立即返回,但是当内核准备好数据之后,任然需要用户线程发起请求才会将数据   从内核空间拷贝到用户空间,因此非阻塞IO属于同步IO。

8. 异步IO与非阻塞IO的区别?

 异步IO与非阻塞IO的区别在于,当用户线程发起一次IO操作不需要再次去确认内核是否准备好数据。异步IO中内核准备好数据后会将数据从内核空间自动拷贝到用户空间。

9. 总结

  最后统一的总结一下:

  用户进程发起请求从内核中获取数据那么这时候有两种情况:

    (1)操作系统还没有准备后数据,那么这时候怎么办,有两种方法:

        a. 让用于进程等着(这种情况就是阻塞)

        b. 如果没有数据就返回一个ERROR,不需要用户进程干等(这种情况就是非阻塞)

    (2)过了一会儿操作系统准备好数据了,这时候又有两种方法:

        a. 啥也不管,等着用户进程再次来请求才把数据给它(这种情况就是同步)

        b. 负责到底,数据准备好,直接给到用户进程,并且还发出一个信号,告诉用户进程数据已经准备好(这种情况就是异步)

 因此,我们可以发现:不管是阻塞IO,还是非阻塞IO都是同步IO。

   

    

   

   

 

同步IO, 异步IO的理解的更多相关文章

  1. 阻塞IO, 非阻塞IO, 同步IO,异步IO

    阻塞IO, 非阻塞IO, 同步IO,异步IO 介绍 先说明几个概念 用户空间与内核空间 为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操心系统将虚拟空间(内存)划分为两部分,一部分 ...

  2. Python学习-day10(番外篇) 阻塞IO 非阻塞IO 同步IO 异步IO

    这个章节的内容是关于IO的概念,谈一谈什么是 阻塞IO 非阻塞IO 同步IO 异步IO.以下摘要是我对这四种IO的一个形象理解. 场景是去去银行办理业务.节点有三个,1)到银行提交申请:2)取号:3) ...

  3. 一文读懂阻塞、非阻塞、同步、异步IO

    介绍 在谈及网络IO的时候总避不开阻塞.非阻塞.同步.异步.IO多路复用.select.poll.epoll等这几个词语.在面试的时候也会被经常问到这几个的区别.本文就来讲一下这几个词语的含义.区别以 ...

  4. IO复用\阻塞IO\非阻塞IO\同步IO\异步IO

    转载:IO复用\阻塞IO\非阻塞IO\同步IO\异步IO 一. 什么是IO复用? 它是内核提供的一种同时监控多个文件描述符状态改变的一种能力:例如当进程需要操作多个IO相关描述符时(例如服务器程序要同 ...

  5. 【python】-- 事件驱动介绍、阻塞IO, 非阻塞IO, 同步IO,异步IO介绍

    事件驱动介绍 一.前言 通常,我们写服务器处理模型的程序时,有以下几种模型: (1)每收到一个请求,创建一个新的进程,来处理该请求: (2)每收到一个请求,创建一个新的线程,来处理该请求: (3)每收 ...

  6. 阻塞、非阻塞、同步、异步IO

    阻塞.非阻塞.同步.异步IO http://www.cnblogs.com/yunxitalk/p/9031306.html 介绍 在谈及网络IO的时候总避不开阻塞.非阻塞.同步.异步.IO多路复用. ...

  7. 网络编程----堵塞、非堵塞和同步、异步IO

    我是学渣.但我想进步. 本文是面试我的牛人问我的.你知道什么是堵塞.非堵塞和同步.异步IO么?自觉得是分布式系统程序猿的我居然不知道.学习吧. 首先介绍堵塞IO和非堵塞IO: 堵塞IO:是指说程序等待 ...

  8. python 全栈开发,Day44(IO模型介绍,阻塞IO,非阻塞IO,多路复用IO,异步IO,IO模型比较分析,selectors模块,垃圾回收机制)

    昨日内容回顾 协程实际上是一个线程,执行了多个任务,遇到IO就切换 切换,可以使用yield,greenlet 遇到IO gevent: 检测到IO,能够使用greenlet实现自动切换,规避了IO阻 ...

  9. (IO模型介绍,阻塞IO,非阻塞IO,多路复用IO,异步IO,IO模型比较分析,selectors模块,垃圾回收机制)

    参考博客: https://www.cnblogs.com/xiao987334176/p/9056511.html 内容回顾 协程实际上是一个线程,执行了多个任务,遇到IO就切换 切换,可以使用yi ...

随机推荐

  1. polygon()函数

    polygon():draw the polygons where vertices are given in x and y. polygon(x,y=NULL,density=NULL,angle ...

  2. 工作中的开发过程(Javaweb路线,写给刚刚实习或者马上就要工作的朋友)

    工作中的开发过程(Javaweb路线,写给刚刚实习或者马上就要工作的朋友) 当我还没开始工作的时候,我是对实际项目开发流程充满未知和向往的,当时很希望能够有一个过来人,给我介绍一下实际工作起来是什么样 ...

  3. 顺序队列与链式队列--C语言实现

    关于队列,因为我自己在平时使用不多,所以在这里直接将队列的两种存储方式放在一起,作为一篇随笔,这两份代码均可直接运行,亲测.注释写的应该也算比较详细了,就不过多的解释了 顺序队列 #include&l ...

  4. 使用echarts常用问题总结

    1,echarts配合element ui的抽屉插件出现报错,上次解决方法是使用element ui 抽屉的open事件,让在打开事件重新加载,我们项目的需求是点击某个数据,要传递这条数据包含的其他值 ...

  5. springcloud-Eureka组件

    一.简介 Eureka 是 Netflix 开发的服务发现框架,本身是一个基于 REST 的服务,主要用于定位运行在 AWS 域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的.SpringC ...

  6. Reveal分析工具的使用

    首先:在reveal官网http://revealapp.com/下载适用版本.试用版本是30天免费,可以选择破解.破解链接http://pan.baidu.com/s/1bnc5wwn?errno= ...

  7. iOS textView的使用总结

    转自:http://blog.csdn.net/zhaopenghhhhhh/article/details/11597887 在.h文件中声明: @interface ProtocolViewCon ...

  8. git 使用详解(9)-- 分支的新建与合并 git branch -d、merge、 --merged/--no-merged/-v

    现在让我们来看一个简单的分支与合并的例子,实际工作中大体也会用到这样的工作流程: 开发某个网站. 为实现某个新的需求,创建一个分支. 在这个分支上开展工作. 假设此时,你突然接到一个电话说有个很严重的 ...

  9. 纯css实现下雪特效

    //------------------ css ------------------- /*Keyframes*/ @keyframes snow { 0% { background-positio ...

  10. ARTS-S centos修改hostname

    hostnamectl set-hostname newhostname 重启