1、html
select poll 與 epoll的區別,能夠參考如下三個連接數組
總結一下服務器
三者區別以下網絡
(1)select,poll實現須要本身不斷輪詢全部fd集合,直到設備就緒,期間可能要睡眠和喚醒屢次交替。而epoll其實也須要調用epoll_wait不斷輪詢就緒鏈表,期間也可能屢次睡眠和喚醒交替,可是它是設備就緒時,調用回調函數,把就緒fd放入就緒鏈表中,並喚醒在epoll_wait中進入睡眠的進程。雖然都要睡眠和交替,可是select和poll在「醒着」的時候要遍歷整個fd集合,而epoll在「醒着」的時候只要判斷一下就緒鏈表是否爲空就好了,這節省了大量的CPU時間。這就是回調機制帶來的性能提高。併發
(2)select,poll每次調用都要把fd集合從用戶態往內核態拷貝一次,而且要把current往設備等待隊列中掛一次,而epoll只要一次拷貝,並且把current往等待隊列上掛也只掛一次(在epoll_wait的開始,注意這裏的等待隊列並非設備等待隊列,只是一個epoll內部定義的等待隊列)。這也能節省很多的開銷。socket
epoll優勢以下函數
epoll的優勢:性能
1.支持一個進程打開大數目的socket描述符(FD)spa
select 最不能忍受的是一個進程所打開的FD是有必定限制的,由FD_SETSIZE設置,默認值是1024/2048。對於那些須要支持的上萬鏈接數目的IM服務器來講顯然太少了。這時候你一是能夠選擇修改這個宏而後從新編譯內核。不過 epoll則沒有這個限制,它所支持的FD上限是最大能夠打開文件的數目,這個數字通常遠大於2048,舉個例子,在1GB內存的機器上大約是10萬左右,具體數目能夠cat /proc/sys/fs/file-max察看,通常來講這個數目和系統內存關係很大。操作系統
2.IO效率不隨FD數目增長而線性降低
傳統的select/poll另外一個致命弱點就是當你擁有一個很大的socket集合,不過因爲網絡延時,任一時間只有部分的socket是"活躍"的,可是select/poll每次調用都會線性掃描所有的集合,致使效率呈現線性降低。可是epoll不存在這個問題,它只會對"活躍"的socket進行操做---這是由於在內核實現中epoll是根據每一個fd上面的callback函數實現的。那麼,只有"活躍"的socket纔會主動的去調用 callback函數,其餘idle狀態socket則不會,在這點上,epoll實現了一個"僞"AIO,由於這時候推進力在Linux內核。
3.使用mmap加速內核與用戶空間的消息傳遞。
這點實際上涉及到epoll的具體實現了。不管是select,poll仍是epoll都須要內核把FD消息通知給用戶空間,如何避免沒必要要的內存拷貝就很重要,在這點上,epoll是經過內核與用戶空間mmap同一塊內存實現的。
對於poll來講須要將用戶傳入的 pollfd 數組拷貝到內核空間,由於拷貝操做和數組長度相關,時間上這是一個O(n)操做,當事件發生,poll返回將得到的數據傳送到用戶空間並執行釋放內存和剝離等待隊列等善後工做,向用戶空間拷貝數據與剝離等待隊列等操做的的時間複雜度一樣是O(n)。
epoll的主要優點在於回調函數,可是當socket中90%都是活躍的,epoll效率不必定就會高。(還需進一步瞭解)
2、
這裏面有個概念須要理清楚,內核態 用戶態
http://www.cnblogs.com/zemliu/p/3695503.html
內核態: CPU能夠訪問內存全部數據, 包括外圍設備, 例如硬盤, 網卡. CPU也能夠將本身從一個程序切換到另外一個程序
用戶態: 只能受限的訪問內存, 且不容許訪問外圍設備. 佔用CPU的能力被剝奪, CPU資源能夠被其餘程序獲取
因爲須要限制不一樣的程序之間的訪問能力, 防止他們獲取別的程序的內存數據, 或者獲取外圍設備的數據, 併發送到網絡, CPU劃分出兩個權限等級 -- 用戶態 和 內核態
全部用戶程序都是運行在用戶態的, 可是有時候程序確實須要作一些內核態的事情, 例如從硬盤讀取數據, 或者從鍵盤獲取輸入等. 而惟一能夠作這些事情的就是操做系統, 因此此時程序就須要先操做系統請求以程序的名義來執行這些操做.
這時須要一個這樣的機制: 用戶態程序切換到內核態, 可是不能控制在內核態中執行的指令
這種機制叫系統調用, 在CPU中的實現稱之爲陷阱指令(Trap Instruction)
他們的工做流程以下:
3、以poll爲例
http://blog.sina.com.cn/s/blog_7943319e0101a5dw.html
經過前面的分析,咱們知道,應用程序中的open、read、write函數系統調用都會觸發軟中斷異常,從而進入異常處理,在異常處理中將會獲取用戶態傳入的系統調用號,根據系統調用號在系統調用表中索引出實際的系統調用處理函數,如內核裏的sys_open、sys_read、sys_write函數,而內核裏的這些函數又會對應到驅動程序裏的open、read、write函數。
poll機制也不例外,用戶空間裏調用poll函數或者select函數時,都會調用到內核空間的sys_poll或者sys_select函數。
因此 這就涉及到了內存copy的問題。