1. 程式人生 > >同步非同步,阻塞非阻塞區別聯絡

同步非同步,阻塞非阻塞區別聯絡

  實際上同步與非同步是針對應用程式與核心的互動而言的。同步過程中程序觸發IO操作並等待(也就是我們說的阻塞)或者輪詢的去檢視IO操作(也就是我們說的非阻塞)是否完成。 非同步過程中程序觸發IO操作以後,直接返回,做自己的事情,IO交給核心來處理,完成後核心通知程序IO完成。

同步和非同步針對應用程式來,關注的是程式中間的協作關係;阻塞與非阻塞更關注的是單個程序的執行狀態。

同步有阻塞和非阻塞之分,非同步沒有,它一定是非阻塞的。

阻塞、非阻塞、多路IO複用,都是同步IO,非同步必定是非阻塞的,所以不存在非同步阻塞和非同步非阻塞的說法。真正的非同步IO需要CPU的深度參與。換句話說,只有使用者執行緒在操作IO的時候根本不去考慮IO的執行全部都交給CPU去完成,而自己只等待一個完成訊號的時候,才是真正的非同步IO。所以,拉一個子執行緒去輪詢、去死迴圈,或者使用select、poll、epool,都不是非同步。

同步:執行一個操作之後,程序觸發IO操作並等待(也就是我們說的阻塞)或者輪詢的去檢視IO操作(也就是我們說的非阻塞)是否完成,等待結果,然後才繼續執行後續的操作。

非同步:執行一個操作後,可以去執行其他的操作,然後等待通知再回來執行剛才沒執行完的操作。

阻塞:程序給CPU傳達一個任務之後,一直等待CPU處理完成,然後才執行後面的操作。

非阻塞:程序給CPU傳達任我後,繼續處理後續的操作,隔斷時間再來詢問之前的操作是否完成。這樣的過程其實也叫輪詢。