同步/異步/阻塞/非阻塞
同步和異步:
同步和異步對應於調用者與被調用者,它們是線程之間的關係,兩個線程之間要麼是同步的,要麼是異步的。
-
同步操作時,調用者需要等待被調用者返回結果,纔會進行下一步操作。
-
異步操作時,調用者不需要等待被調用者返回調用即可進行下一步操作,被調用者通常依靠事件、回調等機制來通知調用者結果。
同步和異步 IO:
同步 IO 是用戶線程發起 I/O 請求後需要等待或者輪詢內核 I/O 操作完成後才能繼續執行。
異步 IO 是用戶線程發起 I/O 請求後仍可以繼續執行,當內核 I/O 操作完成後會通知用戶線程,或者調用用戶線程註冊的回調函數。
阻塞和非阻塞:
阻塞與非阻塞是對同一個線程來說的,在某個時刻線程要麼處於阻塞,要麼處於非阻塞 。阻塞和非阻塞關注的是程序在等待調用結果(消息,返回值)時的狀態:
-
阻塞調用是指調用結果返回之前,當前線程會被掛起,調用線程只有在得到結果之後纔會返回。
-
非阻塞調用指在不能立刻得到結果之前,該調用不會阻塞當前線程。
阻塞和非阻塞 IO:
-
阻塞 IO 是指 I/O 操作需要徹底完成後才能返回用戶空間 。
-
非阻塞 IO 是指 I/O 操作被調用後立即返回一個狀態值,無需等 I/O 操作徹底完成。
同步阻塞:
發送方發送請求之後一直等待響應。
接收方處理請求時進行的IO操作如果不能馬上等到返回結果,就一直等到返回結果後,才響應發送方,期間不能進行其他工作。
例子:男生向女生表白後,男生一直在等待結果,女生一直在思考結果。
同步非阻塞:
發送方發送請求之後一直等待響應。
接收方處理請求時進行 IO 操作如果不能馬上得到結果直接返回一個狀態值,去做其他事情。當IO操作完成後將完成狀態和結果通知接收方,接收方再響應發送方,發送方纔進入下一次請求過程。
例子:男生向女生表白後,男生一直在等待結果,女生決定先想想以後再說。
異步阻塞:
發送方向接收方請求後,不等待響應,可以繼續其他工作。
接收方處理請求時進行IO操作如果不能馬上得到結果,就一直等到返回結果後,才響應發送方,期間不能進行其他操作。
例子:男生向女生表白後,男生打籃球去了,女生一直在思考結果。
異步非阻塞:
發送方向接收方請求後,不等待響應,可以繼續其他工作。
接收方處理請求時進行 IO 操作如果不能馬上得到結果直接返回一個狀態值,去做其他事情。 當IO操作完成後將完成狀態和結果通知接收方,接收方再響應發送方,發送方纔進入下一次請求過程。
例子:男生向女生表白後,男生打籃球去了,女生玩瑤去了。