在計算機中無時無刻不存在着對數據的訪問和讀取(數據都存儲在物理的媒介上,例如寄存器,高速緩存,內存,磁盤,網卡等等),這些操做被稱爲IO。緩存
(1)當用戶線程發起IO請求後,會進行系統調用(system call)來讓內核(Kernel)進行IO操做異步
(2)此時用戶線程阻塞,等待內核將數據準備好socket
(3)內核將數據準備好後會將數據從內核空間拷貝到用戶空間,並返回給用戶線程結束阻塞。
spa
(1) 由用戶線程發起IO請求, 進行系統調用來讓內核進行IO操做線程
(2) 此時若是內核沒有準備好數據則會直接返回error,並不會阻塞用戶線程,用戶線程能夠重複的發起IO請求blog
(3)當用戶線程發起請求而且內核已經將數據準備好後,會將數據從內核空間拷貝到用戶空間(這個過程是須要阻塞用戶線程的),返回給用戶內存
(1)用戶線程調用select後進行系統調用(內核會監視全部select負責的socket),此時用戶線程被阻塞
同步
(2)當內核將數據準備好後就會返回,並通知用戶線程進行讀取操做,此時內核將數據拷貝到用戶空間並返回select
阻塞IO:用戶線程發起IO操做,緊接着由內核線程來執行IO操做,在阻塞IO中內核線程並不會當即返回而是等待數據拷貝到內存空間時才返回,在此期間用戶線程處於阻塞狀態。請求
非阻塞IO: 與阻塞IO不一樣,內核線程在執行IO操做後會當即返回,若結果爲error則用戶線程能夠從新發起請求而不會被阻塞,一旦內核將數據準備好了且用戶線程發起了IO請求那麼將數據拷貝到用戶空間。
咱們看上面的圖能夠知道IO操做大體分爲兩個部分:
(1)用戶線程發起IO請求時,內核未準備好數據
(2)用戶線程發起IO請求時,內核以準備好數據
經過對比兩個圖中流程咱們能夠發現,(2)這個流程在阻塞IO與非阻塞IO流程是相同的區別在於(1)這個步驟。所以阻塞IO與非阻塞IO的區別在於內核線程在執行IO操做時是否當即返回結果,若當即返
回則爲非阻塞IO,反之則爲阻塞IO。
異步IO: 用戶線程發起IO操做後,能夠當即去作其餘事情,另外一方面,對於內核線程當它收到異步讀取以後會當即返回,不會對用戶線程形成阻塞。當內核將數據準備好以後會將數據從內核空間拷貝到用戶空間,內核會發送 給用戶一個信號通知用戶IO操做已完成。
同步IO: 同步IO的關鍵在於在真正讀取數據(也就是上面提到的(2)這個步驟)的時候用戶線程是否被阻塞。非阻塞IO雖然在用戶發起請求時會當即返回,可是當內核準備好數據以後,任然須要用戶線程發起請求才會將數據 從內核空間拷貝到用戶空間,所以非阻塞IO屬於同步IO。