1. 程式人生 > >關於同步、非同步與阻塞、非阻塞的理解

關於同步、非同步與阻塞、非阻塞的理解

1、前言

  前一段時間出去面試,被問到同步、非同步與阻塞、非阻塞的區別。我一時半會沒有想出來,作為一個工作三年的人來說,實在很慚愧。我當時理解同步、非同步屬於兩個程序中間的協作關係,例如使用瀏覽器訪問一個網站,需要多次請求服務端,才能載入完整個頁面的內容。同步的操作如下:瀏覽器首先發送第一個請求,等待伺服器回覆後,再發送第二個請求,依次類推,直到所有請求完成。非同步的操作如下:瀏覽器傳送第一個請求,可以不用等待伺服器返回,可以繼續傳送第二個請求。阻塞與非阻塞屬於程序的API執行動作的方式,例如進行需要read資料,阻塞方式操作流程是:如果沒有資料,則read會一直等著資料到來,才能進行後續的動作;而非阻塞則是read沒有到資料後,則可以進行後續的動作,當有資料的時候再回來讀取。通常linux網路API預設都是阻塞的,例如connect、send、recv等。回答後感覺自己心裡沒有底,底層的關係到底是什麼樣的,比較虛,沒能深入理解。

2、深入理解分析  

  回來以後,趕緊上網好好查查,加深學習一下。這兩個概念在工作中經常用到這些,例如在linux網路IO中涉及到如下模型:

(1)阻塞式IO

(2)非阻塞式IO

(3)IO多路複用

(4)訊號驅動IO

(5)非同步IO

在知乎上面看到一些解釋如下:

截圖如下:

3、總結

  

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

同步:執行一個操作之後,等待結果,然後才繼續執行後續的操作。

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

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

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

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

參考網址:

冷靜思考,勇敢面對,把握未來!