关于同步IO与阻塞IO的误解

本文详细解析了同步IO与异步IO的工作原理,阻塞与非阻塞IO的执行过程,并讨论了它们之间的性能差异。通过实例解释了在不同场景下选择合适IO模式的重要性。

        我们知道,同步IO是指线程在发起一笔IO调用之后,仅当该调用所请求的数据成功到达指定的内存区域之后,才会继续发起下一笔IO调用。而异步IO是指线程在发起一笔IO调用之后不等数据返回就又发送一笔或者多笔IO调用。至于这两者的执行过程和性能差异,冬瓜哥不做过多描述。

        默认方式下,线程发起IO调用之后,后续执行过程便陷入OS内核态,内核会将该线程的状态改为“Suspend”,也就是挂起(阻塞)该线程,在IO数据返回之前,该线程的用户态部分将不会被执行,直到内核返回数据之后,内核将该线程改为“Ready”,以便后续继续调度执行。这种方式就被称为阻塞IO,其一定是同步IO。

        如果线程发起IO调用时给出了async参数,向内核声明采用异步的方式,那么当IO请求下发到内核之后,内核并不会将该线程置为挂起状态,该线程可以继续执行,而此时,该线程可以选择继续下发多笔IO,也可以选择不下发IO而做其他事情。此时,该线程并未处于阻塞状态,所以这种IO调用方式就不是阻塞IO,而属于异步IO调用。即便如此,如果该线程选择在上一笔IO数据返回之后再发起下一笔IO,那么其对外表现依然是同步IO的方式,只不过是主观故意的;而在阻塞IO调用模式下,线程只能发出一笔IO然后被内核强制挂起,此时该线程不管是主观上想批量下发多笔IO还是一去一回的同步IO方式,其对外表现只能是同步IO。

        所以,阻塞IO一定是同步IO,非阻塞IO(调用时给出async参数)可以是异步IO也可以是同步IO,取决于线程自身的逻辑。至于非阻塞IO调用时给出的参数叫做“async”,其实叫做“suspended”更好。        

        相关阅读:

《【冬瓜哥手绘】关于IO时延你被骗了多久?》

《【冬瓜哥手绘】并发IO—系统性能的根本!》

《如何测得IO路径上的等效并发度?




评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值