同步和异步,阻塞和非阻塞,这两组概念出如今IO操做中经常让人混淆不清。这里根据本身看到的,想到的,整理下本身的理解,权当交流。异步
IO操做其实能够分红两个步骤,请求IO操做和执行IO操做。
通常的IO调用过程是这样的:发起IO操做的请求,执行IO操做,获得IO操做的结果,将结果返回给IO操做请求。同步
同步和异步
同步和异步是一种通讯机制,涉及到调用方和被调用方,关注的是IO操做的执行过程及结果的返回方式,不一样点在于双方在这两个方面的行为方式。
若是调用方须要保持等待直到IO操做完成进而经过返回得到结果,则是同步的;若是调用方在IO操做的执行过程当中不须要保持等待,而是在操做完成后被动的接受(经过消息或回调)被调用方推送的结果,则是异步的。
同步和异步,适合描述执行IO操做的情境。请求
阻塞和非阻塞
阻塞和非阻塞是一种调用机制,只涉及到调用方,关注的是IO操做的执行状态,不一样点在于请求IO操做后,针对IO操做的状态,调用方的行为方式。
若是调用方等待IO操做完成后返回,则是阻塞的;若是调用方不须要等待IO操做完成就当即返回,则是非阻塞的,非阻塞的状况下,经常须要屡次调用去check,才能得到IO操做的结果。
阻塞和非阻塞,适合描述发起IO操做请求的情境。通信
阻塞与非阻塞,和同步异步无关,能够阻塞等待同步执行过程完成,也能够阻塞等待异步执行过程完成。
根据以上理解,同步和异步,阻塞和非阻塞,是能够互相组合的。推送
同步阻塞
调用者发起IO操做请求,等待IO操做完成再返回。IO操做的过程须要等待,操做执行完成后返回结果。阻塞
同步非阻塞
调用者发起IO操做请求,询问IO操做的状态,若是未完成,则当即返回;若是完成,则返回结果。IO操做的过程须要等待执行完成才返回结果。回调
异步阻塞
调用者发起IO操做请求,等待IO操做完成再返回。IO操做的过程不须要等待,操做完成后经过通知或回调得到结果。非阻塞
异步非阻塞
调用者发起IO操做请求,询问IO操做的状态,若是未完成,则当即返回;若是完成,则返回结果。IO操做的过程不须要等待,操做完成后经过通知或回调得到结果。消息