两组概念的理解: 阻塞&非阻塞VS 同步&异步

xiaoxiao2021-02-28  43

阻塞&非阻塞

这一组概念并偏向于系统底层的实现,常与OS进程调度相关。 以socket为例,在阻塞模式下线程A调用recv函数,若此时接收缓冲区有数据,则立即返回,否则将进入”阻塞状态“(主动释放CPU控制权,由OS CPU调度程序重新调度并运行其它进程),直到”等待条件”为真,再由OS将此进程调度并重新投入运行。非阻塞模式则另辟蹊径,无论有无数据均立即返回(有数据则返回数据,无数据则返回错误值), 不会影响当前线程的状态。 从某种意义上讲,阻塞模式下,一个线程关联一个文件fd, 常引起线程切换与重新调度,对于高并发环境,这种代价太大。而非阻塞模式则解耦了“1线程关联1文件fd"。

同步&异步

调用与执行的分离即为异步,否则为同步。其实包括两个层面,其一为请求方(客户方),其二为执行方(服务方),抛开这两个概念单独讨论同步或异步是片面的。若请求方调用执行方的服务并等待服务结果,则为同步过程。但对于一些耗时或IO服务,服务执行时间往往较长或不可控,并可能导致降低整体服务质量,此时需要将调用与执行解耦。 有些经典设计模式常用于解决此问题: 1 command(命令模式)-- 将请求封装成命令对象,实现请求方对命令执行的透明化, 2 Active Object(主动对象)--  对象内部驻留一个线程或线程池,用于执行具体服务,同时,对象对外提供服务接口,供请求方发起调用(可能获得Future对象)。

转载请注明原文地址: https://www.6miu.com/read-2621099.html

最新回复(0)