同步IO, 異步IO的理解

1. 什麼是IO?

 在計算機中無時無刻不存在着對數據的訪問和讀取(數據都存儲在物理的媒介上,例如寄存器,高速緩存,內存,磁盤,網卡等等),這些操做被稱爲IO。緩存

2. 阻塞IO

 

  (1)當用戶線程發起IO請求後,會進行系統調用(system call)來讓內核(Kernel)進行IO操做異步

   (2)此時用戶線程阻塞,等待內核將數據準備好socket

   (3)內核將數據準備好後會將數據從內核空間拷貝到用戶空間,並返回給用戶線程結束阻塞。
spa

3. 非阻塞IO

  

   (1) 由用戶線程發起IO請求, 進行系統調用來讓內核進行IO操做線程

      (2) 此時若是內核沒有準備好數據則會直接返回error,並不會阻塞用戶線程,用戶線程能夠重複的發起IO請求blog

    (3)當用戶線程發起請求而且內核已經將數據準備好後,會將數據從內核空間拷貝到用戶空間(這個過程是須要阻塞用戶線程的),返回給用戶內存

4. 多路複用IO

  

  (1)用戶線程調用select後進行系統調用(內核會監視全部select負責的socket),此時用戶線程被阻塞
同步

   (2)當內核將數據準備好後就會返回,並通知用戶線程進行讀取操做,此時內核將數據拷貝到用戶空間並返回select

5. 阻塞IO與非阻塞IO?

    阻塞IO:用戶線程發起IO操做,緊接着由內核線程來執行IO操做,在阻塞IO中內核線程並不會當即返回而是等待數據拷貝到內存空間時才返回,在此期間用戶線程處於阻塞狀態。請求

 非阻塞IO: 與阻塞IO不一樣,內核線程在執行IO操做後會當即返回,若結果爲error則用戶線程能夠從新發起請求而不會被阻塞,一旦內核將數據準備好了且用戶線程發起了IO請求那麼將數據拷貝到用戶空間。

  咱們看上面的圖能夠知道IO操做大體分爲兩個部分:

  (1)用戶線程發起IO請求時,內核未準備好數據

  (2)用戶線程發起IO請求時,內核以準備好數據

    經過對比兩個圖中流程咱們能夠發現,(2)這個流程在阻塞IO與非阻塞IO流程是相同的區別在於(1)這個步驟。所以阻塞IO與非阻塞IO的區別在於內核線程在執行IO操做時是否當即返回結果,若當即返

    回則爲非阻塞IO,反之則爲阻塞IO。

6. 同步與異步IO?

 異步IO:  用戶線程發起IO操做後,能夠當即去作其餘事情,另外一方面,對於內核線程當它收到異步讀取以後會當即返回,不會對用戶線程形成阻塞。當內核將數據準備好以後會將數據從內核空間拷貝到用戶空間,內核會發送    給用戶一個信號通知用戶IO操做已完成。

    同步IO: 同步IO的關鍵在於在真正讀取數據(也就是上面提到的(2)這個步驟)的時候用戶線程是否被阻塞。非阻塞IO雖然在用戶發起請求時會當即返回,可是當內核準備好數據以後,任然須要用戶線程發起請求才會將數據   從內核空間拷貝到用戶空間,所以非阻塞IO屬於同步IO。

相關文章
相關標籤/搜索