理解同步/異步和阻塞/非阻塞的區別

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

一、前言html

  前一段時間出去面試,被問到同步、異步與阻塞、非阻塞的區別。我一時半會沒有想出來,做爲一個工做三年的人來講,實在很慚愧。我當時理解同步、異步屬於兩個進程中間的協做關係,例如使用瀏覽器訪問一個網站,須要屢次請求服務端,才能加載完整個頁面的內容。同步的操做以下:瀏覽器首先發送第一個請求,等待服務器回覆後,再發送第二個請求,依次類推,直到全部請求完成。異步的操做以下:瀏覽器發送第一個請求,能夠不用等待服務器返回,能夠繼續發送第二個請求。阻塞與非阻塞屬於進程的API執行動做的方式,例如進行須要read數據,阻塞方式操做流程是:若是沒有數據,則read會一直等着數據到來,才能進行後續的動做;而非阻塞則是read沒有到數據後,則能夠進行後續的動做,當有數據的時候再回來讀取。一般linux網絡API默認都是阻塞的,例如connect、send、recv等。回答後感受本身內心沒有底,底層的關係究竟是什麼樣的,比較虛,沒能深刻理解。linux

二、深刻理解分析  面試

  回來之後,趕忙上網好好查查,加深學習一下。這兩個概念在工做中常常用到這些,例如在linux網絡IO中涉及到以下模型:瀏覽器

(1)阻塞式IO服務器

(2)非阻塞式IO網絡

(3)IO多路複用異步

(4)信號驅動IO學習

(5)異步IO網站

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

截圖以下:

三、總結

  

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

同步:執行一個操做以後,等待結果,而後才繼續執行後續的操做。

異步:執行一個操做後,能夠去執行其餘的操做,而後等待通知再回來執行剛纔沒執行完的操做。

阻塞:進程給CPU傳達一個任務以後,一直等待CPU處理完成,而後才執行後面的操做。

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

   阻塞、非阻塞、多路IO複用,都是同步IO,異步一定是非阻塞的,因此不存在異步阻塞和異步非阻塞的說法。真正的異步IO須要CPU的深度參與。換句話說,只有用戶線程在操做IO的時候根本不去考慮IO的執行所有都交給CPU去完成,而本身只等待一個完成信號的時候,纔是真正的異步IO。因此,拉一個子線程去輪詢、去死循環,或者使用select、poll、epool,都不是異步。

參考網址:

https://www.zhihu.com/question/19732473

https://www.zhihu.com/question/27965282

http://www.smithfox.com/?e=191

https://zhuanlan.zhihu.com/p/21416728

http://blog.csdn.net/dinglang_2009/article/details/50461697

相關文章
相關標籤/搜索