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

本文探讨了阻塞与非阻塞I/O的基本概念及其在操作系统进程调度中的应用,通过socket通信的例子,详细解释了两种模式下线程的行为差异。此外,还介绍了同步与异步调用的区别,并探讨了如何利用设计模式提高服务效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

阻塞&非阻塞

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


同步&异步

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值