同步/異步,阻塞/非阻塞
什麽是同步和異步
同步和異步是針對應用程序和內核的交互而言的,
同步指的是用戶進程觸發IO操作並等待或者輪詢的去查看IO操作是否就緒,而異步是指用戶進程觸發IO操作以後便開始做自己的事情,而當IO操作已經完成的時候會得到IO完成的通知。
什麽是阻塞和非阻塞
阻塞和非阻塞是針對於進程在訪問數據的時候,根據IO操作的就緒狀態來采取的不同方式,阻塞方式下讀取或者寫入函數將一直等待,而非阻塞方式下,讀取或者寫入函數會立即返回一個狀態值。
同步/異步與阻塞/非阻塞的區別
同步與異步:針對數據訪問的方式,程序是主動去詢問操作系統數據準備好了麽,還是操作系統在數據準備好的時候通知程序。
阻塞與非阻塞:針對函數(程序)運行的方式,在IO未就緒時,是等待就緒還是直接返回(執行別的操作)。
阻塞與非阻塞的區別:
阻塞是程序在調用系統函數IO時,在系統執行系統調用時由CPU通過輪詢等方式來實現數據的IO。
非阻塞是在程序級別通過輪詢/信號/事件的機制,去查看IO數據是否就緒。
二者的區別其實就是,把阻塞的位置從系統的CPU層面提到了程序層面。
非阻塞與異步的區別:
非阻塞可以通過輪詢或者信號/事件機制來實現,其目的是由內核通知我們何時可以啟動一個I/O操作
而異步I/O模型是在內核IO完成後,由內核通知我們I/O操作已經完成。
一個網絡包從應用程序A發到另一臺電腦上的應用程序B,需要經歷:
- 從A的業務代碼到A的軟件框架
- 從A的軟件框架到計算機的操作系統內核
- 從A所在計算機的內核到網卡
- 從網卡經過網線發到交換機等設備,層層轉發,到達B所在計算機的網卡
- 從B所在計算機的網卡到B所在計算機的內核
- 從B所在計算機的內核到B的程序的用戶空間
- 從B的軟件框架到B的業務代碼
網卡<---->網卡 同步執行。以太網是個同步時序邏輯,隨信號傳輸時鐘,必須兩邊設備同時就緒了才能開始傳輸數據,這是同步的。
網卡<---->內核 異步執行。內核一般通過緩沖區,使用DMA來傳輸數據。CPU通知DMA讀取IO設備數據,然後就去做其他的事情,等DMA把數據從IO設備中讀到內核內存中,去通知CPU已經完成IO操作。所以這一步是異步的。
內核<---->應用程序 同步執行,阻塞/非阻塞。用戶進程/線程無法直接讀寫內核數據,需要數據在用戶空間和內核空間搬來搬去。除非個別接口,否則一般是同步的。可以是阻塞或非阻塞,阻塞則一直在等待內核/應用程序把IO數據準備好,非阻塞則是直接返回內核/應用程序是否已經準備好數據。
應用程序框架:同步或異步。框架若使用異步IO,則通常需要應用程序<--->內核之間是非阻塞的。一旦內核<--->應用程序數據IO完成,則執行回調函數,執行一定的操作。
參考文章:
怎樣理解阻塞非阻塞與同步異步的區別?
IO多路復用,同步,異步,阻塞和非阻塞 區別
關於異步,同步,阻塞與非阻塞
解讀I/O多路復用技術
同步/異步,阻塞/非阻塞