IO模型(select, poll, epoll的区别和原理)
生活随笔
收集整理的這篇文章主要介紹了
IO模型(select, poll, epoll的区别和原理)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
參考《unix網絡編程》
參考http://blog.csdn.net/blueboy2000/article/details/4485874
參考http://blog.csdn.net/suxinpingtao51/article/details/46314097
五種I/O模型
阻塞I/O:應用程序調用一個IO函數,導致應用程序阻塞,如果數據已經準備好,從內核拷貝到用戶空間,否則一直等待下去
非阻塞I/O:
I/O復用(select和poll)
信號驅動I/O(SIGIO)
異步I/O(Posix.1的aio_系列函數)
阻塞I/O:應用程序調用一個IO函數,導致應用程序阻塞,如果數據已經準備好,從內核拷貝到用戶空間,否則一直等待下去
非阻塞I/O模型?
我們把一個套接口設置為非阻塞就是告訴內核,當所請求的I/O操作無法完成時,不要將進程睡眠,而是返回一個錯誤。這樣我們的I/O操作函數將不斷的測試數據是否已經準備好,如果沒有準備好,繼續測試,直到數據準備好為止。在這個不斷測試的過程中,會大量的占用CPU的時間。
當一個應用程序像這樣對一個非阻塞描述符循環調用recvfrom時,我們稱之為輪循(polling)
總結:阻塞I/O模式下,雖然不會占用大量的CPU時間,一個線程只能處理一個流的I/O事件。如果想要同時處理多個流,要么多進程(fork),要么多線程(pthread_create),很不幸這兩種方法效率都不高。于是再來考慮非阻塞忙輪詢的I/O方式,我們發現我們可以同時處理多個流了(把一個流從阻塞模式切換到非阻塞模式再此不予討論): [cpp] view plain copy
epoll可以理解為event poll,不同于忙輪詢和無差別輪詢,epoll之會把哪個流發生了怎樣的I/O事件通知我們。此時我們對這些流的操作都是有意義的。(復雜度降低到了O(1))
I/O復用模型?
I/O復用模型會用到select或者poll函數,這兩個函數也會使進程阻塞,但是和阻塞I/O所不同的的,這兩個函數可以同時阻塞多個I/O操作。而且可以同時對多個讀操作,多個寫操作的I/O函數進行檢測,直到有數據可讀或可寫時,才真正調用I/O操作函數。?
我們阻塞于select調用,等待數據報套接字變為可讀。當select返回套接字可讀這一條件時,我們調用recefrom把所有讀數據報復制到應用進程緩沖區。
信號驅動I/O模型?
我們也可以用信號,讓內核在描述符就緒時發送SIGIO信號通知我們。通過sigaction系統調用安裝一個信號處理函數。該系統調用將立即返回,我們的進程繼續工作,也就是說它沒有被阻塞。當數據報準備好讀取時,內核就為該進程產生一個SIGIO信號。我們隨后既可以在信號處理函數中調用recvfrom讀取數據報,并通知主循環數據已經準備好待處理。 優勢:等待數據報到達期間進程不被阻塞。主循環可以繼續執行,只要等待來自信號處理函數的通知:既可以是數據已準備好被處理,也可以是數據報已準備好被讀取。
異步I/O模型?
告知內核啟動某個操作,并讓內核在整個操作(包括將內核復制到我們自己的緩沖區)完成后通知我們。 與信號驅動模型的主要區別在于:信號驅動式I/O是由內核通知我們何時可以啟動一個I/O操作,而異步模型是由內核通知我們I/O操作何時完成。
調用aio_read函數,告訴內核描述字,緩沖區指針,緩沖區大小,文件偏移以及通知的方式,然后立即返回。當內核將數據拷貝到緩沖區后,再通知應用程序。?
各種I/O模型的對比:
同步I/O和異步I/O對比:同步I/O操作導致請求阻塞(前4種模型是是同步I/O模型),直到I/O操作完成;異步I/O操作不導致請求進程阻塞。
http://www.cnblogs.com/Anker/p/3265058.html
select, poll, epoll區別以及原理
介紹epoll中函數,以及它們的使用, ET和LT是區別
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的IO模型(select, poll, epoll的区别和原理)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux服务器文件描述符最大值修改
- 下一篇: linux内存管理——kmalloc和v