阻塞式IO/非阻塞IO
阻塞式IO(blocking-IO)
默認情況下,所有的套接字socket連接都是阻塞式的,在和操作系統交互的過程之中。比如說一個讀操作:
1.因為涉及到網絡數據交換network io,等待所有的分組報到達之后這時候數據才算在操作系統內部為就緒狀態。
2.然后操作系統在從系統空間將數據拷貝到用戶空間。
首先進行IO數據交換的時候是由兩個進程交互的,一個是用戶的application進程另外一個是操作系統的內核進程,阻塞強調的是在用戶進程發起數據調用請求到操作系統kernal之后,需要等待操作系統(准備數據+拷貝數據)在這個過程中用戶進程是被鎖定的或者說成阻塞的(blocking),也就是什么也不能做,兩個步驟結束之后,kernal才會告訴application應用,你請求的數據已經為你准備好了,這時候用戶進程才可以進行下面的操作。
非阻塞式IO(No blocking-IO)
同樣的對於客戶端的一個read操作,當客戶端發起read request的時候,如果kernal這時候還沒有將待拷貝的數據准備好,那么則會直接返回系統錯誤的狀態,用戶端判斷這個狀態之后就知道了,現在kernal並沒有准備好數據,我並不能立馬讀取數據,那么什么時候才能讀取呢?只有再次向kernal發起同樣的請求這時候(這個過程因為每次請求會立即得到返回,所以對於客戶端來說並不是非阻塞的或者說鎖定的,客戶端可以在這個過程中做其他事情),看看kernal有沒有准備好,若是准備好了那么則將數據從系統空間拷貝到用戶內存當中去(這個階段是阻塞的)。
同步IO/異步IO
A synchronous I/O operation causes the requesting process to be blocked until that I/O operation completes;
An asynchronous I/O operation does not cause the requesting process to be blocked;
I/O operation= wait for data + copy data from kernal to user
異步IO(asynchronous IO)
去考慮進行IO交互的那兩個應用,user application和kernal application,同步IO每次IO請求都是由user主動發起,被動的等待kernal的返回結果,當獲悉kernal明確的處理狀態之后才可以進行后續操作。而異步IO則是每次user application發起調用請求之后,kernal會立即返回,好似每次請求到kernal只后kernal就會告訴你,好了我知道你需要數據,等我准備好了我就會告訴你,你先去忙吧。
可以看出來同步和異步的區別就是在於,客戶端請求完成之后到kernal的IO operation完成這個過程中客戶端是不是阻塞或者鎖定狀態,如果是則是同步,否則則是異步。
比較: