【底層原理】關(guān)于同步、異步與阻塞、非阻塞的理解
前言
前一段時間出去面試,被問到同步、異步與阻塞、非阻塞的區(qū)別。我一時半會沒有想出來,作為一個工作三年的人來說,實在很慚愧。我當時理解同步、異步屬于兩個進程中間的協(xié)作關(guān)系,例如使用瀏覽器訪問一個網(wǎng)站,需要多次請求服務(wù)端,才能加載完整個頁面的內(nèi)容。同步的操作如下:瀏覽器首先發(fā)送第一個請求,等待服務(wù)器回復后,再發(fā)送第二個請求,依次類推,直到所有請求完成。異步的操作如下:瀏覽器發(fā)送第一個請求,可以不用等待服務(wù)器返回,可以繼續(xù)發(fā)送第二個請求。阻塞與非阻塞屬于進程的API執(zhí)行動作的方式,例如進行需要read數(shù)據(jù),阻塞方式操作流程是:如果沒有數(shù)據(jù),則read會一直等著數(shù)據(jù)到來,才能進行后續(xù)的動作;而非阻塞則是read沒有到數(shù)據(jù)后,則可以進行后續(xù)的動作,當有數(shù)據(jù)的時候再回來讀取。通常linux網(wǎng)絡(luò)API默認都是阻塞的,例如connect、send、recv等。回答后感覺自己心里沒有底,底層的關(guān)系到底是什么樣的,比較虛,沒能深入理解。
深入理解分析
回來以后,趕緊上網(wǎng)好好查查,加深學習一下。這兩個概念在工作中經(jīng)常用到這些,例如在linux網(wǎng)絡(luò)IO中涉及到如下模型:
(1)阻塞式IO
(2)非阻塞式IO
(3)IO多路復用
(4)信號驅(qū)動IO
(5)異步IO
在知乎上面看到一些解釋如下:截圖如下:





總結(jié)
同步和異步針對應用程序來,關(guān)注的是程序中間的協(xié)作關(guān)系;阻塞與非阻塞更關(guān)注的是單個進程的執(zhí)行狀態(tài)。
同步:執(zhí)行一個操作之后,等待結(jié)果,然后才繼續(xù)執(zhí)行后續(xù)的操作。異步:執(zhí)行一個操作后,可以去執(zhí)行其他的操作,然后等待通知再回來執(zhí)行剛才沒執(zhí)行完的操作。阻塞:進程給CPU傳達一個任務(wù)之后,一直等待CPU處理完成,然后才執(zhí)行后面的操作。非阻塞:進程給CPU傳達任我后,繼續(xù)處理后續(xù)的操作,隔斷時間再來詢問之前的操作是否完成。這樣的過程其實也叫輪詢。
阻塞、非阻塞、多路IO復用,都是同步IO,異步必定是非阻塞的,所以不存在異步阻塞和異步非阻塞的說法。真正的異步IO需要CPU的深度參與。換句話說,只有用戶線程在操作IO的時候根本不去考慮IO的執(zhí)行全部都交給CPU去完成,而自己只等待一個完成信號的時候,才是真正的異步IO。所以,拉一個子線程去輪詢、去死循環(huán),或者使用select、poll、epool,都不是異步。
歡迎關(guān)注交流探討!
