知识卡片
同步与异步的区别
内容
同步和异步这对概念,关注的是”消息的通知机制”。用一个银行办事的类比理解:一个人要去银行办业务,可以自己去排队办理,也可以委托别人代办、办完再来告知结果——对要办理业务的这个人而言,自己去办理是同步方式,委托别人代办、事后被通知结果则是异步方式。两者的关键区别在于:同步方式下,是操作者本人主动、直接完成了整件事情;异步方式下,调用指令一发出,操作马上就返回了,操作者当下并不知道结果,而是要等被委托的异步过程(例子里帮忙代办的人)处理完毕之后,再通过某种通知手段(代码里通常是回调函数)来告诉操作者最终结果。这个区分可以直接对应到异步I/O模型上:应用程序调用aio_read之后,不管当前是否有数据可读,这个调用都会立刻返回——这个过程相当于例子里”委托另一个人去帮忙代办银行业务”;等到数据真正被读完并拷贝到用户内存后,系统会发一个信号通知原进程,告诉它”读数据操作已经完成”(注意是”完成”,而不仅仅是”有数据可读”这个中间状态)——这条区分(”可以做了”vs”已经做完了”)后续会成为理解多路复用I/O到底算同步还是异步的关键。
参考来源
- 位置:《高可用架构(第1卷)》第1章《高可用架构案例精选》"1.9 深入理解同步/异步与阻塞/非阻塞区别"节,"1.9.1 同步与异步"(源文件:_epub-src/OEBPS/Text/Chapter1_9_2.xhtml)
- 结论依据:原文说明"对于要办理这个银行业务的人而言,自己去办理是同步方式,而别人代办完毕再告知则是异步方式……在异步方式下,调用指令发出后,操作马上就返回了,操作者并不能马上知道结果,而是等待所调用的异步过程处理完毕之后,再通过通知手段……来告诉操作者结果",直接支撑本卡片结论。
- 原始内容:应用程序调用完aio_read之后,不论是否有数据可读,这个操作都会马上返回,这个过程相当于这个例子中委托另一个人去帮忙代办银行业务的过程,当数据读完拷贝到用户内存之后,会发一个信号通知原进程告诉读数据操作已经完成。