io多路复用的原理和实现_IO多路复用的三种机制:select 、poll 、epoll
目錄
- 概述
- IO多路復用本質
- IO多路復用的優勢
- IO多路復用Select機制
- IO多路復用Poll機制
- IO多路復用Epoll機制
- select,poll,epoll機制區別總結
- php7進階到架構師相關閱讀
概述
這是關于php進階到架構之后端開發必備學習的第三篇文章:IO多路復用的三種機制:select 、poll 、epoll
- 第一篇:理解TCP/IP與UDP協議、Socket的正確姿勢
- 第二篇:一文搞懂進程,線程,CPU核心數,時間片輪轉機制
- 第三篇:IO多路復用的三種機制:select 、poll 、epoll
IO多路復用本質
檢測多個文件描述符是否有變化 。
讓單個進程可以監視多個文件描述符,
一旦某個描述符就緒(一般是讀就緒或寫就緒),
能夠通知程序進行相應的讀寫操作
select,poll,epoll都是IO多路復用的機制。但select,poll,epoll本質上都是同步I/O,因為他們都需要在讀寫事件就緒后自己負責進行讀寫,也就是說這個讀寫過程是阻塞的
IO多路復用的優勢
與多進程和多線程技術相比,
I/O多路復用技術的最大優勢是系統開銷小,
系統不必創建進程/線程,
也不必維護這些進程/線程,
從而大大減小了系統的開銷。
在介紹select、poll、epoll之前,首先介紹一下Linux操作系統中基礎的概念:
用戶空間 / 內核空間
操作系統的核心是內核,
獨立于普通的應用程序,
可以訪問受保護的內存空間,
也有訪問底層硬件設備的所有權限。
為了保證用戶進程(如qq,新浪等進程)不能直接操作內核(kernel),保證內核的安全,
操作系統將虛擬空間劃分為兩部分,
一部分為內核空間,
一部分為用戶空間。
進程切換
為了控制進程的執行,內核必須有能力掛起正在CPU上運行的進程,并恢復以前掛起的某個進程的執行。這種行為被稱為進程切換。
任何進程都是在操作系統內核的支持下運行的,是與內核緊密相關的,并且進程切換是非常耗費資源的。
進程阻塞
正在執行的進程,由于期待的某些事件未發生,如請求系統資源失敗、等待某種操作的完成、新數據尚未到達或無新工作做等,則由系統自動執行阻塞原語(Block),使進程由運行狀態變為阻塞狀態
只有處于運行態的進程(獲得了CPU資源),才可能將其轉為阻塞狀態。
當進程進入阻塞狀態,是不占用CPU資源的。
文件描述符
文件描述符(File descriptor),是一個用于表述指向文件的引用的抽象化概念。
文件描述符在形式上是一個非負整數。
實際上,它是一個索引值,指向內核為每一個進程所維護的該進程打開文件的記錄表。
當程序打開一個現有文件或者創建一個新文件時,內核向進程返回一個文件描述符。
在程序設計中,一些涉及底層的程序編寫往往會圍繞著文件描述符展開。
但是文件描述符這一概念往往只適用于UNIX、Linux這樣的操作系統。
IO多路復用Select機制
select機制中提供一種fd_set的數據結構,實際上是一個long類型的數組。
每一個數組元素都能與一打開的文件句柄建立聯系,當調用select()時,由內核根據IO狀態修改fd_set的內容,由此來通知執行了select()的進程哪一Socket或文件可讀。
select機制的問題
1.每次調用select,都需要把fd_set集合從用戶態拷貝到內核態,如果fd_set集合很大時,那這個開銷也很大
2.同時每次調用select都需要在內核遍歷傳遞進來的所有fd_set,如果fd_set集合很大時,那這個開銷也很大
3.為了減少數據拷貝帶來的性能損壞,內核對被監控的fd_set集合大小做了限制,并且這個是通過宏控制的,大小不可改變(限制為1024)
IO多路復用Poll機制
poll改變了文件描述符集合的描述方式,
使用了pollfd結構而不是select的fd_set結構,
使得poll支持的文件描述符集合限制遠大于select的1024
poll的機制與select類似,與select在本質上沒有多大差別,管理多個描述符也是進行輪詢,根據描述符的狀態進行處理,但是poll沒有最大文件描述符數量的限制。
也就是說,poll只解決了上面select的問題3,并沒有解決問題1,2的性能開銷問題。
IO多路復用Epoll機制
epoll在Linux2.6內核正式提出,是基于事件驅動的I/O方式。
相對于select來說,epoll沒有描述符個數限制,使用一個文件描述符管理多個描述符,將用戶關心的文件描述符的事件存放到內核的一個事件表中,這樣在用戶空間和內核空間的copy只需一次。
epoll是Linux內核為處理大批量文件描述符而作了改進的poll,它能顯著提高程序在大量并發連接中只有少量活躍的情況下的系統CPU利用率。
原因就是獲取事件的時候,它無須遍歷整個被偵聽的描述符集,只要遍歷那些被內核IO事件異步喚醒而加入Ready隊列的描述符集合就行了。
select,poll,epoll機制區別總結
epoll是Linux目前大規模網絡并發程序開發的首選模型。在絕大多數情況下性能遠超select和poll。
既然如此,為何select,poll,epoll同時存在呢?那是因為它們也是不同歷史時期的產物。
1984,在BSD實現select
1997,實現了poll
2002, 大神 Davide Libenzi 實現了epoll
php7進階到架構師相關閱讀
https://www.kancloud.cn/gofor/gofor
最后,歡迎大家留言補充,討論~~~
總結
以上是生活随笔為你收集整理的io多路复用的原理和实现_IO多路复用的三种机制:select 、poll 、epoll的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《无畏契约》国服要来了!腾讯WeGame
- 下一篇: 放大器的传递函数_保证放大器的稳定性什么