Linux內核講全部文件設備都看作一個文件來操做,對一個文件的讀寫操做會調用內核提供的系統命令,返回一個file descriptor(fd,文件描述符)。而對一個socket的讀寫也會有相應的描述符,稱爲socketfd(socket描述符),描述符就是一個數字,它指向內核中的一個結構體(文件路徑,數據區等一些屬性)。編程
根據UNIX網絡編程對I/O模型的分類,UNIX提供了5種I/O模型,分別以下:網絡
(1)阻塞I/O模型:最經常使用的I/O模型就是阻塞I/O模型,缺省情形下,全部文件操做都是阻塞的。咱們以套接字爲例:在進程空間中調用recvfrom,其系統調用知道數據包到達且被複制到應用進程的緩衝區中或者發生錯誤時才返回,在此期間一直會等待,進程在從調用recvfrom開始到它返回的整段時間內都是被阻塞的,所以被稱爲阻塞I/O模型。異步
(2)非阻塞I/O模型:recvfrom從應用層到內核的時候,若是該緩衝區沒有數據的話,就直接返回一個EWOULDBLOCK錯誤,通常都對非阻塞I/O模型進行輪訓檢查這個狀態,看內核是否是有數據到來。socket
(3)I/O複用模型:Linux提供select/poll,進程經過將一個或多個fd傳遞給select或poll系統調用,阻塞在select操做上,這樣select/poll能夠幫咱們偵測多個fd是否處於就緒狀態。select/poll是順序掃描fd是否就緒,並且支持的fd數量有限,所以它的使用受到了一些制約。Linux還提供了一個epoll調用,epoll使用基於事件驅動方式代替順序掃描,所以性能更高。當有fd就續時,當即回調函數rollback。函數
(4)信號驅動I/O模型:首先開啓套接口信號驅動I/O功能,並經過系統調用sigaction執行一個信號處理函數(此係統調用當即返回,進程繼續工做,它是非阻塞的)。當數據準備就續時,就爲該進程生成一個SIGIO信號,經過信號回調通知應用程序調用recvfrom來讀取數據。性能
(5)異步I/O:告知內核啓動操做,並讓內核在整個操做完成後(包括將數據從內核複製到用戶本身的緩衝區)通知咱們。這種模型與信號驅動模型的主要區別是:信號驅動I/O由內核通知咱們什麼時候能夠開始一個I/O操做:異步I/O模型由內核通知咱們I/O操做什麼時候已經完成。接口
最後總結:進程
a、同步I/O引發進程阻塞,直至I/O操做完成。事件
b、異步I/O不會已經進程阻塞。ip
c、I/O複用進程會受阻與select調用。
參考書籍:《Netty權威指南-第二版》