zoukankan      html  css  js  c++  java
  • 阻塞式/非阻塞式与同步/异步的区别

    阻塞式IO/非阻塞IO

    阻塞式IO(blocking-IO)

    默认情况下,所有的套接字socket连接都是阻塞式的,在和操作系统交互的过程之中。比如说一个读操作:

    1.因为涉及到网络数据交换network io,等待所有的分组报到达之后这时候数据才算在操作系统内部为就绪状态。

    2.然后操作系统在从系统空间将数据拷贝到用户空间。

     

    首先进行IO数据交换的时候是由两个进程交互的,一个是用户的application进程另外一个是操作系统的内核进程,阻塞强调的是在用户进程发起数据调用请求到操作系统kernal之后,需要等待操作系统(准备数据+拷贝数据)在这个过程中用户进程是被锁定的或者说成阻塞的(blocking),也就是什么也不能做,两个步骤结束之后,kernal才会告诉application应用,你请求的数据已经为你准备好了,这时候用户进程才可以进行下面的操作。

    非阻塞式IO(No blocking-IO)

    同样的对于客户端的一个read操作,当客户端发起read request的时候,如果kernal这时候还没有将待拷贝的数据准备好,那么则会直接返回系统错误的状态,用户端判断这个状态之后就知道了,现在kernal并没有准备好数据,我并不能立马读取数据,那么什么时候才能读取呢?只有再次向kernal发起同样的请求这时候(这个过程因为每次请求会立即得到返回,所以对于客户端来说并不是非阻塞的或者说锁定的,客户端可以在这个过程中做其他事情),看看kernal有没有准备好,若是准备好了那么则将数据从系统空间拷贝到用户内存当中去(这个阶段是阻塞的)。

    同步IO/异步IO

     A synchronous I/O operation causes the requesting process to be blocked until that I/O operation completes;
     An asynchronous I/O operation does not cause the requesting process to be blocked;
     

     I/O operation= wait for data + copy data from kernal to user

    异步IO(asynchronous IO)

     

    去考虑进行IO交互的那两个应用,user application和kernal application,同步IO每次IO请求都是由user主动发起,被动的等待kernal的返回结果,当获悉kernal明确的处理状态之后才可以进行后续操作。而异步IO则是每次user application发起调用请求之后,kernal会立即返回,好似每次请求到kernal只后kernal就会告诉你,好了我知道你需要数据,等我准备好了我就会告诉你,你先去忙吧。

    可以看出来同步和异步的区别就是在于,客户端请求完成之后到kernal的IO operation完成这个过程中客户端是不是阻塞或者锁定状态,如果是则是同步,否则则是异步。

    比较:

  • 相关阅读:
    webapi 发布swagger
    如何在发布项目,并发布在iis上
    17.Github分支管理-解决冲突
    18.Git分支管理策略
    15.回撤操作
    16.Github分支管理-创建与合并分支
    14.查看信息深入讲解
    13.git commit深入讲解
    12.add-commit命令深入讲解
    11.几个Git新命令
  • 原文地址:https://www.cnblogs.com/lingyejun/p/7898646.html
Copyright © 2011-2022 走看看