zoukankan      html  css  js  c++  java
  • 对阻塞,非阻塞,同步,异步的深入理解

    以前写过一篇对于这几个概念的粗略解释,现在再深入一些。

    同步和异步的区别:

    同步是调用协议中结果在调用完成时返回,调用过程中参与双方处于一种状态同步的过程。

    异步是指调用方发出请求就立即返回

    请求甚至可能还没有到达接收方。比如放到了某个缓冲区,等待对方取走或者第三方转交。

    结果由接收方主动推送,或者调用方轮询而得到。

    阻塞与非阻塞的区别:

    影响调用接口的结果(在特定条件下是否提前返回结果),而不是调用方式

    举个例子:

    对于系统调用函数read(socket, buf, len),这个API核心是读出socket缓冲区里的数据并返回,类似于从缓存区中memcpy到buf。

    如果缓冲区是空的,那么有三种选择:

    1.阻塞住,等缓冲区有数据的时候再memcpy。这是阻塞同步

    2.立即返回,什么也不做,让调用者在稍后的某个时候再read,这是非阻塞同步(这种情况下buf属于调用者,可以释放,下次调用的时候可以再使用另一个buf)

    3.buf的处理权转移到系统,调用者立即返回,等到缓冲区中有数据的时候再调用memcpy到buf,再把这个buf返回给调用者。

    (或者内核直接把数据拷贝到调用者的内存,而不通过缓冲区),这是异步(没有异步阻塞这种说法)

     从不同层次上,当一个网络包从应用程序a发到另一台电脑上的应用程序b,需要经历这些过程

    1 从a的业务代码到a的软件框架

    2 从a的软件框架到计算机的操作系统内核

    3 从a所在计算机的内核到网卡

    4 从网卡经过网线发到交换机等设备,层层转发,到达b所在计算机的网卡

    5 从b所在计算机的网卡到达b所在计算机的内核

    6 从b所在计算机的内核到达b的程序用户空间

    7 从b的软件框架到达b的业务代码

    关于同步异步的问题,需要一层一层地看:

    1,7 取决于软件框架的设计,比如协程模型,调用接口后马上切换到其他协程继续执行,完成之后由框架切换到协程中,这是一种异步接口设计

    2,6,需要调用方自己把数据在内核和用户空间里搬来搬去,都是同步接口(IOCP不是)

    3,5 内核一般通过缓冲区,使用DMA传输数据,这一步为异步

    4 以太网是同步时序逻辑,必须两边都同时就绪了才能开始传输数据,这是同步的

    整理自:

    https://www.zhihu.com/question/65519203/answer/233433548

    怎样理解阻塞非阻塞与同步异步的区别? - 灵剑的回答 - 知乎 https://www.zhihu.com/question/19732473/answer/117012135

  • 相关阅读:
    python
    【转载】【CPU】关于x86、x86_64/x64、amd64和arm64/aarch64
    【百思不得其解1】诡异的速度差异
    LeakCanary 与 鹅场Matrix ResourceCanary对比分析
    android 插件化框架VitualAPK
    android高级篇收录
    滴滴Booster移动APP质量优化框架 学习之旅 三
    滴滴Booster移动APP质量优化框架 学习之旅 二
    滴滴Booster移动APP质量优化框架 学习之旅
    不一样视角的Glide剖析
  • 原文地址:https://www.cnblogs.com/geeklove01/p/8467726.html
Copyright © 2011-2022 走看看