下面主要是把unp第六章的那一節貼出來。因為這五種模型應該是涵蓋了我們網絡編程中大多數的模型吧。
1. 阻塞I/O模型
例如UDP函數recvfrom的內核到應用層、應用層到內核的調用過程是這樣的:首先把描述符、接受數據緩沖地址、大小傳遞給內核,但是如果此時該與該套接口相應的緩沖區沒有數據,這個時候就recvfrom就會卡(阻塞)在這裡,知道數據到來的時候,再把數據拷貝到應用層,也就是傳進來的地址空間,如果沒有數據到來,就會使該函數阻塞在那裡,這就叫做阻塞I/O模型,如下圖:
2. 非阻塞I/O模型
如果recvfrom從應用層到內核的時候,如果該緩沖區沒有數據的話,就直接給我返回,並且返回一個EWOULDBLOCK錯誤,一般都對非阻塞I/O模型進行輪詢,就是一直在檢查這個狀態,看內核是不是有數據到來調用,過程如下圖:
3. I/O復用模型
設置一組套接字,如果這些套接字有一個以上出現了可讀、可寫、或者異常,select都會返回,這個時候,可以檢查室哪個套接字狀態達到了,因為select函數的套接字集是 值=結果 的,當select返回的時候,集合中的套接字是變化的,這個返回的套接字是滿足要求的,通常程序的做法是,對想要了解的套接字,進行分開處理。使用select的好處是:能夠等待多個套接字准備好。
4. 信號驅動I/O模型
當內核為我們准備好數據的時候,就會發送 SIGIO 信號,我們 【Linux公社 http://www.linuxidc.com 】 可以調用 sigaction 安裝 SIGIO 信號的處理函數,這個時候就可以在 SIGIO 信號處理函數中進行 recvfrom 函數來接受數據報:
5. 異步I/O模型
是讓內核拷貝完之後通知我們。信號驅動I/O是當內核准備好數據的時候,通知我們可以調用recvfrom了,而異步I/O模型是內核通知我們I/O操作完成的時候通知我們:
在網絡編程世界裡,一定要知道select函數。目前比較高級的應用中epoll是最強大的。