在IO和網絡編程中,我們經常看到幾個概念:同步、異步、阻塞、非阻塞。
同步和異步
同步和異步是針對應用程序和內核的交互而言的,同步指的是用戶進程觸發IO 操作並等待或者輪詢的去查看IO 操作是否就緒,而異步是指用戶進程觸發IO 操作以后便開始做自己的事情,而當IO 操作已經完成的時候會得到IO 完成的通知。
阻塞和非阻塞
阻塞和非阻塞是針對於進程在訪問數據的時候,根據IO操作的就緒狀態來采取的不同方式,說白了是一種讀取或者寫入操作方法的實現方式,阻塞方式下讀取或者寫入函數將一直等待,而非阻塞方式下,讀取或者寫入方法會立即返回一個狀態值。
理解方式
乍一看這四個概念的解釋會瞬間感到頭大,也經常講同步異步等同於阻塞非阻塞,其實,區分他們非常簡單。
同步異步與阻塞非阻塞的主要區別是針對對象不同。
同步異步是針對調用者來說的,調用者發起一個請求后,一直干等被調用者的反饋就是同步,不必等去做別的事就是異步。
阻塞非阻塞是針對被調用者來說的,被調用者收到一個請求后,做完請求任務后才給出反饋就是阻塞,收到請求直接給出反饋再去做任務就是非阻塞。
在公交站等公交
對調用者-乘客而言:
1,一直干望着公交來的方向,就是同步。
2,不望着公交來的方向,掏出筆記本改bug,聽公交站廣播是否到車,就是異步。
對被動用者-公交系統而言:
1,公交站有廣播的就是非阻塞的。
2,公交站沒有廣播的就是阻塞的。