同步对应异步,阻塞对应非阻塞,两对概念的根本区别在于:所修饰的对象不同。
阻塞和非阻塞是指进程访问的数据尚未准备就绪,进程是否要等待,还是直接返回。
同步异步是指访问数据的机制。同步是指主动请求并等待 IO 操作完毕的方式,当数据就绪后在读写的时候必须阻塞。异步则是在主动请求数据后开始其他任务随后等待 IO 操作完毕的通知,进程在进行数据读写时不阻塞。
拿书上举的例子来说明。
你在逛商场的时候,肚子饿了,于是进入一家面馆叫了一份面,这叫主动请求数据。随后老板开始做面。
如果你一直在店里等,一直到老板把面端上来,这叫阻塞。
如果你不选择等待,而是继续逛街,等面做好了你再回来吃,这叫非阻塞;至于你如何获得面有没有做好的方式,多种多样,就是 select/poll/epoll/kqueue 等等。
如果你选择在店里吃面,吃完之后再去逛街,这叫同步。这个时候你先吃了面后逛了街。
如果你灵魂出窍,肉体在吃面,灵魂在逛街,等面吃完了,肉体召唤灵魂归位继续逛街,这个叫异步。这时候你又逛了街又吃了面。
所以可以看出,阻塞非阻塞修饰的是吃面前询问面有没有做好的阶段;同步异步修饰的是面已经端到你面前,你如何吃面的阶段。
这就分别对应询问数据是否就绪和如何读写数据的过程。