关于IO的同步,异步,阻塞,非阻塞

上次写了一篇文章:Unix IO 模型学习。恰巧在这次周会的时候,@fp1203 (goldendoc成员之一) 正好在讲解poll和epoll的底层实现。中途正好讨论了网络IO的同步、异步、阻塞、非阻塞的概念,当时讲下来,大家的理解各不相同,各执己见。搜索了网络上的一些文章,观点也各不相同,甚至连wiki也将异步和非阻塞当成一个概念在解释。

    虽然网络上充斥了大量关于同步、异步、阻塞、非阻塞的文章,但大都是抄来抄去,没有一个权威的说法。但我找到了这一篇文章,该文章引用了《UNIX网络编程 卷1》的介绍,这本书的作者是Richard Stevens。如果有Richard Stevens在这方面的定义或者结论,那么我想,这应该是比较有说服力的了。

    关于《UNIX网络编程 卷1》这本书,我特意找了英文原版,也共享出来了:大家可以下载《UNIX网络编程 卷1》的英文原版?HM格式)。

    我看了6.2这节内容,这节内容就是讲IO模型的。刚刚提到的那篇文章,几乎就是翻译这个6.2节的。应该说,这个6.2节,对同步和异步的讲解,算是很清楚的。

    下面是我自己理解的重点。

IO模型

    目前unix存在五种IO模型(这也和上一篇文章:Unix IO 模型 中提到的一致),分别是:

  1. 阻塞型 IO(blocking I/O)

  2. 非阻塞性IO(nonblocking I/O)

  3. IO多路复用(I/O multiplexing)

  4. 信号驱动IO(signal driven I/O)

  5. 异步IO(asynchronous I/O)

    IO的两个阶段

  1. 等待数据准备好

  2. 将数据从内核缓冲区复制到用户进程缓冲区

    同步,异步的区别

        那么究竟什么是同步和异步的区别呢?请重点读一下原文6.2节中的信号驱动IO和异步IO中的比较。最后总结出来是:

  1. 同步IO,需要用户进程主动将存放在内核缓冲区中的数据拷贝到用户进程中。

  2. 异步IO,内核会自动将数据从内核缓冲区拷贝到用户缓冲区,然后再通知用户。

        这样,同步和异步的概念就非常明显了。以上的五种IO模型,前面四种都是同步的,只有第五种IO模型才是异步的IO。

    阻塞和非阻塞

        那么阻塞和非阻塞呢?注意到以上五个模型。阻塞IO,非阻塞IO,只是上面的五个模型中的两个。阻塞,非阻塞,是针对单个进程而言的。

        当对多路复用IO进行调用时,比如使用poll。需注意的是,poll是系统调用,当调用poll的时候,其实已经是陷入了内核,是内核线程在跑了。因此对于调用poll的用户进程来讲,此时是阻塞的。

        因为poll的底层实现,是去扫描每个文件描述符(fd),而如果要对感兴趣的fd进行扫描,那么只能将每个描述符设置成非阻塞的形式(对
    于用户进程来讲,设置fd是阻塞还是非阻塞,可以使用系统调用fcntl),这样才有可能进行扫描。如果扫描当中,发现有可读(如果可读是用户感兴趣的)
    的fd,那么select就在用户进程层面就会返回,并且告知用户进程哪些fd是可读的。

        这时候,用户进程仍然需要使用read的系统调用,将fd的数据,从内核缓冲区拷贝到用户进程缓冲区(这也是poll为同步IO的原因)。

        那么此时的read是阻塞还是非阻塞呢?这就要看fd的状态了,如果fd被设置成了非阻塞,那么此时的read就是非阻塞的;如果fd被设置成了阻塞,那么此时的read就是阻塞的。

        不过程序已经执行到了这时候,不管fd是阻塞还是非阻塞,都没有任何区别,因为之前的poll,就是知道有数据准备好了才返回的,也就是说内核缓冲区已经有了数据,此时进行read,是肯定能够将数据拷贝到用户进程缓冲区的。

        但如果换种想法,如果poll是因为超时返回的,而我们又对一个fd(此fd是被poll轮询过的)进行read调用,那么此时是阻塞还是非阻塞,就非常有意义了,对吧!

    结论

  1. 判断IO是同步还是异步,是看谁主动将数据拷贝到用户进程。

  2. select或者poll,epoll,是同步调用,进行此调用的用户进程也处于阻塞状态。

  3. javaScript或者nodejs中的读取网络(文件)数据,然后提供回调函数进行处理,是异步IO。

原文链接:http://blogread.cn/it/article/4108?f=wb

原创文章,作者:追马,如若转载,请注明出处:http://www.178linux.com/2333

(0)
追马追马
上一篇 2015-04-02
下一篇 2015-04-02

相关推荐

  • bash的工作特性之命令执行状态返回值和命令行展开

    bash特性之一:命令别名 将一个命令用其他名字来代替,可以用别名来简化操作。 获取当前用户可用的别名的定义: ~]#alias NAME=’COMMAND’ bash的特性之二:命令历史 shell进程会保存其会话中用户曾经执行过的命令;命令通过其“历史文件”来持久保存此前执行过的命令;每个用户都有其自己专用的历史文件; HISTSIZE:shell进程的…

    Linux干货 2016-11-06
  • 文件查找与压缩-1

       1、 locate命令(非实时查找即数据库查找) 1)、查询系统上预建的文件索引数据库/var/lib/mlocate/mlocate.db      依赖于事先构建的索引;索引的构建是在系统较为空闲时自动进行( 周期性任务) 或者管理员手动更新数据库即是执行#updatedb命令;引构建过程…

    Linux干货 2016-08-15
  • N22-℡浮生.若夢 ╮第一周作业

    1.描述计算机的组成及其功能  组成:     硬件       (1).CPU: 是计算机的主要设备之一,功能主要是解释计算机指令以及处理计算机软件中的数据.       (2).存储器:内存,硬盘,存储器的功能是存储程序、数据和各种信号…

    Linux干货 2016-09-19
  • 磁盘管理

    上图sda disk information中对 255 heads,63 sectors/track,1958 cylinders的解析: sda磁盘总共有1958个cylinder(柱面),每个cylinder(柱面)有63个sectors(扇区),每个sectors(扇区)有255个heads(磁头) 那么这块sda的总的磁头数量为:255*63*19…

    2017-08-20
  • 学习宣言

    人所缺乏的不是才干而是志向,不是成功的能力而是勤劳的意志。

    Linux干货 2016-10-30
  • 什么是网站流量、UV、PV、IP

    什么是网站流量,什么叫网站流量?     通常说的网站流量(traffic)是指网站的访问量,是用来描述访问一个网站的用户数量以及用户所浏览的网页数量等指标,常用的统计指标包括网站的独立用户数量、总用户数量(含重复访问者)、网页浏览数量、每个用户的页面浏览数量、用户在网站的平均停留时间等。     …

    Linux干货 2015-03-20