同步、異步、阻塞、非阻塞

一般情況下,一次網絡IO讀操作會涉及兩個系統對象:(1) 用戶進程(線程)Process;(2)內核對象kernel,兩個處理階段:

[1] Waiting for the data to be ready - 等待數據準備好

[2] Copying the data from the kernel to the process - 將數據從內核空間的buffer拷貝到用戶空間進程的buffer

1 同步阻塞IO

IO - 同步、異步、阻塞、非阻塞

用戶進程process在Blocking IO讀recvfrom操作的兩個階段都是等待的。在數據沒準備好時,process原地等待kernel準備數據。kernel準備好數據後,process繼續等待kernel將數據copy到自己的buffer。在kernel完成數據的copy後process才會從recvfrom系統調用中返回

2 同步非阻塞IO

IO - 同步、異步、阻塞、非阻塞

process在NonBlocking IO讀recvfrom操作的第一個階段是不會block等待的,如果kernel數據還沒準備好,那麼recvfrom會立刻返回一個EWOULDBLOCK錯誤。當kernel準備好數據後,進入處理的第二階段的時候,process會等待kernel將數據copy到自己的buffer,在kernel完成數據的copy後process才會從recvfrom系統調用中返回

3 同步IO之多路複用

IO - 同步、異步、阻塞、非阻塞

IO多路複用,就是熟知的select、poll、epoll模型。從圖上可見,在IO多路複用的時候,process在兩個處理階段都是block等待。初看好像IO多路複用沒什麼用,其實select、poll、epoll的優勢在於可以以較少的代價來同時監聽處理多個IO

4 異步IO

IO - 同步、異步、阻塞、非阻塞

異步IO要求process在recvfrom操作的兩個處理階段上都不能等待,也就是process調用recvfrom後立刻返回,kernel自行去準備好數據並將數據從kernel的buffer中copy到process的buffer在通知process讀操作完成,然後process在去處理。遺憾的是,linux的網絡IO中是不存在異步IO的,linux的網絡IO處理的第二階段總是阻塞等待數據copy完成的。真正意義上的網絡異步IO是Windows下的IOCP(IO完成端口)模型


同步與異步,關注的是消息通信機制(或應答模式),是對響應本身而言

阻塞與非阻塞,關注的是接口調用(發出請求)後等待數據返回時的狀態,是對請求本身而言


分享到:


相關文章: