同步和异步,阻塞和非阻塞,这两对概念混淆好久了,今天下午终于狠心研究了研究,终于明白点儿了。
io操作分成两步,首先是应用程序向操作系统发起读写请求,然后是数据传输。
阻塞/非阻塞,关注的是提交io操作请求能不能立即返回;同步/异步,关注的是数据传输的时候,应用程序能不能干别的事情。
如果从更高的角度来说,io操作只分两种,要么同步,要么异步。只要io操作中,应用程序执行受到影响(包括执行被挂起,轮询或者显式地调用读写函数),都属于同步io;真正的异步io,对应用程序来说是透明的,应用程序只需要准备好数据,告诉操作系统我需要读还是写,剩下的全部交由操作系统来完成,io操作执行完了操作系统再通过回调函数告诉应用程序执行结果即可。