同步 异步 阻塞 非阻塞

1.同步与异步

这里的同步不是指进程之间的两种制约关系(同步互斥)

消息通信机制
同步与异步的重点在消息通知的方式上,也就是调用结果通知的方式。

同步: 同步就是发起一个调用后,被调用者未处理完请求之前,调用不返回。
异步: 异步就是发起一个调用后,立刻得到被调用者的回应表示已接收到请求,但是被调用者并没有返回结果,此时我们可以处理其他的请求,被调用者通常依靠事件,回调等机制来通知调用者其返回结果。

同步和异步的区别最大在于异步的话调用者不需要等待处理结果,被调用者会通过回调等机制来通知调用者其返回结果。

2.阻塞和非阻塞

阻塞与非阻塞的重点在于进/线程等待消息时候的状态,也就是在等待消息的时候,当前进/线程是挂起状态,还是非挂起状态。

阻塞: 阻塞就是发起一个请求,调用者一直等待请求结果返回,也就是当前线程会被挂起,无法从事其他任务,只有当条件就绪才能继续。
非阻塞: 非阻塞就是发起一个请求,调用者不用一直等着结果返回,可以先去干其他事情。

同步与异步,重点在于消息通知的方式;
阻塞与非阻塞,重点在于等消息时候的行为。

3.四种组合

同步阻塞方式: 发送方发送请求之后一直等待响应。 接收方处理请求时进行的IO操作如果不能马上等到返回结果,就一直等到返回结果后,才响应发送方,期间不能进行其他工作。

同步非阻塞方式: 发送方发送请求之后,一直等待响应。 接受方处理请求时进行的IO操作如果不能马上的得到结果,就立即返回,取做其他事情。 但是由于没有得到请求处理结果,不响应发送方,发送方一直等待。 当IO操作完成以后,将完成状态和结果通知接收方,接收方再响应发送方,发送方才进入下一次请求过程。

异步阻塞方式: 发送方向接收方请求后,不等待响应,可以继续其他工作。 接收方处理请求时进行IO操作如果不能马上得到结果,就一直等到返回结果后,才响应发送方,期间不能进行其他操作。

异步非阻塞方式: 发送方向接收方请求后,不等待响应,可以继续其他工作。 接收方处理请求时进行IO操作如果不能马上得到结果,也不等待,而是马上返回去做其他事情。 当IO操作完成以后,将完成状态和结果通知接收方,接收方再响应发送方。(效率最高)

知乎银月游侠的回答
同步、异步、阻塞、非阻塞,是分3个层次的:

  • CPU层次;
  • 线程层次;
  • 程序员感知层次。

这几个概念之所以容易混淆,是因为没有分清楚是在哪个层次进行讨论。CPU层次在CPU层次,或者说操作系统进行IO和任务调度的层次,现代操作系统通常使用异步非阻塞方式进行IO(有少部分IO可能会使用同步非阻塞轮询),即发出IO请求之后,并不等待IO操作完成,而是继续执行下面的指令(非阻塞),IO操作和CPU指令互不干扰(异步),最后通过中断的方式来通知IO操作完成结果。线程层次在线程层次,或者说操作系统调度单元的层次,操作系统为了减轻程序员的思考负担,将底层的异步非阻塞的IO方式进行封装,把相关系统调用(如read,write等)以同步的方式展现出来。然而,同步阻塞的IO会使线程挂起,同步非阻塞的IO会消耗CPU资源在轮询上。为了解决这一问题,就有3种思路:多线程(同步阻塞);IO多路复用(select,poll,epoll)(同步非阻塞,严格地来讲,是把阻塞点改变了位置);直接暴露出异步的IO接口,如kernel-aio和IOCP(异步非阻塞)。程序员感知层次在Linux中,上面提到的第2种思路用得比较广泛,也是比较理想的解决方案。然而,直接使用select之类的接口,依然比较复杂,所以各种库和框架百花齐放,都试图对IO多路复用进行封装。此时,库和框架提供的API又可以选择是以同步的方式还是异步的方式来展现。如python的asyncio库中,就通过协程,提供了同步阻塞式的API;如node.js中,就通过回调函数,提供了异步非阻塞式的API。总结因此,我们在讨论同步、异步、阻塞、非阻塞时,必须先明确是在哪个层次进行讨论。比如node.js,我们可以说她在程序员感知层次提供了异步非阻塞的API,也可以说在Linux下,她在线程层次以同步非阻塞的epoll来实现。
参考链接

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值