专栏首页技术碎碎念同步/异步,阻塞/非阻塞

同步/异步,阻塞/非阻塞

什么是同步和异步

同步和异步是针对应用程序和内核的交互而言的,

同步指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪,而异步是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知。

什么是阻塞和非阻塞

阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,阻塞方式下读取或者写入函数将一直等待,而非阻塞方式下,读取或者写入函数会立即返回一个状态值。

同步/异步与阻塞/非阻塞的区别

同步与异步:针对数据访问的方式,程序是主动去询问操作系统数据准备好了么,还是操作系统在数据准备好的时候通知程序。

阻塞与非阻塞:针对函数(程序)运行的方式,在IO未就绪时,是等待就绪还是直接返回(执行别的操作)。

阻塞与非阻塞的区别:

阻塞是程序在调用系统函数IO时,在系统执行系统调用时由CPU通过轮询等方式来实现数据的IO。

非阻塞是在程序级别通过轮询/信号/事件的机制,去查看IO数据是否就绪。

二者的区别其实就是,把阻塞的位置从系统的CPU层面提到了程序层面。

非阻塞与异步的区别:

非阻塞可以通过轮询或者信号/事件机制来实现,其目的是由内核通知我们何时可以启动一个I/O操作 而异步I/O模型是在内核IO完成后,由内核通知我们I/O操作已经完成。

一个网络包从应用程序A发到另一台电脑上的应用程序B,需要经历:

  1. 从A的业务代码到A的软件框架
  2. 从A的软件框架到计算机的操作系统内核
  3. 从A所在计算机的内核到网卡
  4. 从网卡经过网线发到交换机等设备,层层转发,到达B所在计算机的网卡
  5. 从B所在计算机的网卡到B所在计算机的内核
  6. 从B所在计算机的内核到B的程序的用户空间
  7. 从B的软件框架到B的业务代码

网卡<---->网卡  同步执行。以太网是个同步时序逻辑,随信号传输时钟,必须两边设备同时就绪了才能开始传输数据,这是同步的。

网卡<---->内核  异步执行。内核一般通过缓冲区,使用DMA来传输数据。CPU通知DMA读取IO设备数据,然后就去做其他的事情,等DMA把数据从IO设备中读到内核内存中,去通知CPU已经完成IO操作。所以这一步是异步的。

内核<---->应用程序  同步执行,阻塞/非阻塞。用户进程/线程无法直接读写内核数据,需要数据在用户空间和内核空间搬来搬去。除非个别接口,否则一般是同步的。可以是阻塞或非阻塞,阻塞则一直在等待内核/应用程序把IO数据准备好,非阻塞则是直接返回内核/应用程序是否已经准备好数据。

应用程序框架:同步或异步。框架若使用异步IO,则通常需要应用程序<--->内核之间是非阻塞的。一旦内核<--->应用程序数据IO完成,则执行回调函数,执行一定的操作。

参考文章:

怎样理解阻塞非阻塞与同步异步的区别?

IO多路复用,同步,异步,阻塞和非阻塞 区别

关于异步,同步,阻塞与非阻塞

解读I/O多路复用技术

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Tomcat启动过程源码解读

    根据Tomcat源码来看一下Tomcat启动过程都做了什么 部分代码为主要流程代码,删去了try-catch以及一些校验逻辑,方便理解主流程 先来一张启动过程时...

    欠扁的小篮子
  • 浅谈Struts2

    学过SSH框架很长一段时间了,一直没有很系统的总结一下,这里先简单谈谈Struts2。 为什么要用Struts2? 这里列举一些Servlet的缺点: 1、每写...

    欠扁的小篮子
  • 大数据量下的集合过滤—Bloom Filter

    欠扁的小篮子
  • Java NIO之理解I/O模型

    自己以前在Java NIO这块儿,一直都是比较薄弱的,以前还因为这点知识而错失了一个机会。所以最近打算好好学习一下这部分内容,我想应该也会有朋友像我一样,一直想...

    纪莫
  • 迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章

    常规的误区 假设有一个展示用户详情的需求,分两步,先调用一个HTTP接口拿到详情数据,然后使用适合的视图展示详情数据。 如果网速很慢,代码发起一个HTTP...

    Java团长
  • 基于事件驱动的并发编程

    高广超
  • 关于Java的BIO,NIO和AIO的演进

    Java里面的IO模型种类较多,主要包括BIO,NIO和AIO,每个IO模型都有不一样的地方,那么这些IO模型是如何演变呢,底层的原理又是怎样的呢? 本文我们就...

    我是攻城师
  • Java NIO:浅析I/O模型

      也许很多朋友在学习NIO的时候都会感觉有点吃力,对里面的很多概念都感觉不是那么明朗。在进入Java NIO编程之前,我们今天先来讨论一些比较基础的知识:I/...

    Java团长
  • Java NIO入门之浅析I/O模型

    原文:http://www.cnblogs.com/dolphin0520/p/3916526.html

    黄泽杰
  • IO你了解了,NIO你会吗?

    Tanyboye

扫码关注云+社区

领取腾讯云代金券