1. 程式人生 > >IO多路復用之select,poll,epoll個人理解

IO多路復用之select,poll,epoll個人理解

poll nbsp 不同的 cpu 有時 協議 應用程序 建立 非阻塞io

在看這三個東西之前,先從宏觀的角度去看一下,他們的上一個範疇(阻塞IO和非阻塞IO和IO多路復用)

阻塞IO:套接口阻塞(connect的過程是阻塞的)。套接口都是阻塞的。 應用程序進程-----recvfrom-----系統內核,這個過程是阻塞的,進程調用recvfrom後發現沒有數據可用,就杵在原地等著了。數據從網絡返回,再到內核緩沖區,再到進程緩沖區。這時,recvfrom發現數據來了,開始上班了。比較有惰性,你不給我資源我不做事情,就在這幹等

非阻塞IO:套接口非阻塞(connect的過程是非阻塞的),就是鏈接未建立好,沒關系可以先去做別的事,但是不能做像收發數據這樣的事,因為鏈接還沒有建立好,所以接下來做的事是那些不受建立鏈接這件事而影響的事。應用程序進程-----recvfrom-----系統內核(輪詢),這裏就和阻塞IO不一樣了,這裏會一直問有沒有數據啊,還沒來麽,什麽時候來啊,突然發現這非阻塞IO不僅做不了事情還一直占用cpu資源在這輪詢(polling)。好了,數據來了,這時又不一樣了,這時發現數據到內核緩沖區了,來數據了,趕快幹活了,你看這一層就是到內核緩沖去就要幹活了,內核緩沖區-----進程緩沖區

IO多路復用:此模型用到select和poll函數,這兩個函數也會使進程阻塞,select先阻塞,有活動套接字才返回,但是和阻塞I/O不同的是,這兩個函數可以同時阻塞多個I/O操作,而且可以同時對多個讀操作,多個寫操作的I/O函數進行檢測,直到有數據可讀或可寫(就是監聽多個socket)。select被調用後,進程會被阻塞,內核監視所有select負責的socket,當有任何一個socket的數據準備好了,select就會返回套接字可讀,我們就可以調用recvfrom處理數據。
正因為阻塞I/O只能阻塞一個I/O操作,而I/O復用模型能夠阻塞多個I/O操作,所以才叫做多路復用。

再來理解socket編程數據流的過程

read過程:建立鏈接-----數據從網絡到達內核緩沖區-----數據從內核copy到應用程序進程緩沖區-----應用程序操作數據

write過程:建立鏈接-----應用程序進程緩沖區-----內核緩沖區-----網絡

以上的兩個過程可以總結一下:1.數據到達內核之前的過程2.數據從內核copy到應用程序的過程

數據的流向分為三個層次:應用程序,操作系統內核,物理層(這裏比較籠統不特指tcp/ip協議的物理層)。應用程序是建立在操作系統之上的,為了安全考慮應用程序與操作系統都有獨立內存,應用程序是不允許直接訪問操作系統內存的,而他們是通過一個recvfrom函數,或者理解為一個接口進行通信的。

(先寫到著吧,之後有時間在補充epoll,異步IO)

IO多路復用之select,poll,epoll個人理解