<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          【底層原理】關(guān)于同步、異步與阻塞、非阻塞的理解

          共 969字,需瀏覽 2分鐘

           ·

          2020-06-21 23:50



          前言

          前一段時間出去面試,被問到同步、異步與阻塞、非阻塞的區(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

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

          5a9cece6225ee58858f5d4ce75f68b95.webp

          1cc22b91694c728a92b07bda886abe23.webp

          fcbadc6c72678f0c5236bdd5908e5d38.webp

          1ff247ad6b411ae11916170481b2698a.webp

          b1bdea7c044eca6680aba2546c602473.webp

          f4a8df7ec1a48127f29f37640796139f.webp



          總結(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ù)的操作,隔斷時間再來詢問之前的操作是否完成。這樣的過程其實也叫輪詢。

          b9edd1ec71315d13e263c455a71219c3.webp

          阻塞、非阻塞、多路IO復用,都是同步IO,異步必定是非阻塞的,所以不存在異步阻塞和異步非阻塞的說法。真正的異步IO需要CPU的深度參與。換句話說,只有用戶線程在操作IO的時候根本不去考慮IO的執(zhí)行全部都交給CPU去完成,而自己只等待一個完成信號的時候,才是真正的異步IO。所以,拉一個子線程去輪詢、去死循環(huán),或者使用select、poll、epool,都不是異步。

          歡迎關(guān)注交流探討!

          瀏覽 65
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲综合五月天婷婷丁香 | 久久3级片 | 美国五月天中文网 | 任你躁精品视频一区二区三区 | 欧美天天好逼 |