聊聊同步异步、阻塞非阻塞

背景

很多人在同步异步、阻塞非阻塞这2组概念上不能讲的很清楚,而且网络上也有几种完全不同的看法,总之这个部分有不少争议。

笔者也在这部分困惑过,花了一些时间去弄透这个问题,以下是个人理解的一些总结。希望能帮到大家。

1. 通用概念

例子:”我”烧水(注意:这里的主语是”我”,也就是我们讨论的who)

1.1. 同步异步

1.1.1. 例子

关注点:是否需要”我主动”去看水烧开没(注意,”我”和”主动”这两个词)

  • 同步:“我”要主动看水烧开没
  • 异步:不需要”我”主动去看水烧开,水壶响了通知”我”

1.1.2. 概念

抽象概念:事情执行者对事情结果的获取机制(who:事情执行者)

  • 同步:事情执行者主动获取事情结果
  • 异步:事情执行者被动获取事情结果

1.2. 阻塞非阻塞

1.2.1. 例子

关注点:水烧开前,”我”能不能去做其他事情

  • 阻塞: 
    1. 水没烧开,我一直等着(全程阻塞)
    2. 我去干其他事情了,但是隔一会儿来看一次水烧开没(来看的时候阻塞)
  • 非阻塞: 
    水没烧开,”我”去拖地了,拖完地又看了会儿电视

1.2.2. 概念

抽象概念:事情执行者得到事情结果前能不能去做其他事情(who:事情执行者

  • 阻塞:事情执行者得到结果前不能去做其他事情
  • 非阻塞:事情执行者得到结果前可以去做其他事情

1.3. 总结

  1. 同步一定是会发生阻塞的,只是阻塞的时间长短问题。 
    • 我主动看水烧开(同步),水烧开前我一直等着(阻塞):全程阻塞
    • 我主动看水烧开(同步),隔一会儿来看水烧开(看的过程是阻塞):局部阻塞
  2. 异步一定是非阻塞的: 
    • 不需要我主动去看水烧开(异步),烧水过程中我可以去做任何事情(非阻塞)。

2. 网络编程层面

网络编程层面主要涉及的就是IO,所以,这里主要讲IO。这块儿其实在《UNIX网络编程卷1 第6章 IO复用》中讲的非常清楚了,建议大家看一下,我引用其中的一些关键点。具体的可以找书去看。

2.1. POSIX定义

  • 同步I/O操作:导致请求进程阻塞,直到I/O操作完成;
  • 异步I/O操作:不导致请求进程阻塞。

2.2. IO模型

根据POXIX的定义,下面图中的五种IO模型,其实前四种都是同步IO。 
 

2.3. 总结

注意:这里的who是进程

2.3.1. 同步IO

  1. 进程主动查看关心的IO事件是否就绪,就绪时再执行相关操作 
    • 注意:进程的阻塞发生在select/epoll/poll等待事件时
  2. 进程主动执行读写 
    • 注意:进程的阻塞发生在数据未到达(设备未收到数据),或者未就绪(内核空间和用户空间的数据copy未完成)

2.3.2. 异步IO

异步IO是需要底层操作系统内核做支持的,比如linux的AIO, windows的IOCP。

  1. 进程不用主动去查看关心的IO事件,只需要把关心的IO事件、数据buffer以及要绑定的回调函数或者signal直接告诉内核,内核发现IO时间就绪时,直接调用回调函数或者发送绑定的signal 
    • 注意:IO事件相关的数据,由内核直接将数据copy到用户空间(异步读),或者从用户空间copy至内核空间(异步写)
  2. 进程被动执行数据操作 
    • 注意:进程收到内核通知后,在1中绑定的数据buffer里就已经有数据了,进程直接对数据进行相关处理即可。
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
同步非阻塞异步非阻塞是两种不同的函数调用方式。 同步非阻塞是指在发起函数调用后,调用方不会等待函数的结果返回,而是立即继续执行后续的代码。这意味着调用方无需等待函数的执行结果,可以继续处理其他任务。当函数执行完毕后,调用方可以通过轮询或者回调等方式来获取函数的结果。同步非阻塞的优点是能够提高系统的并发性和响应性。 异步非阻塞是指在发起函数调用后,调用方也不会等待函数的结果返回,但是与同步非阻塞不同的是,异步非阻塞会通过回调、事件通知等方式来通知调用方函数的执行结果。调用方可以继续执行其他任务,并在合适的时机处理函数的返回结果。异步非阻塞的优点是能够提高系统的并发性和性能,减少资源的浪费。 总结来说,同步非阻塞异步非阻塞都是在函数调用时不会发生线程阻塞的情况下继续执行后续代码,但区别在于同步非阻塞需要主动轮询或回调来获取函数的结果,而异步非阻塞则通过回调或事件通知等方式传递函数的执行结果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [深入理解同步阻塞同步非阻塞异步阻塞异步非阻塞](https://blog.csdn.net/wangpaiblog/article/details/117236684)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值