-
1 # 使用者2180107962444
-
2 # 使用者1465424935672
select、poll、epoll都是IO多路複用的機制,但是他們的機制有很大的區別
1、select
select機制剛開始的時候,需要把fd_set從使用者空間複製到核心空間,並且檢測的fd數是有限制的,由FD_SETSIZE設定,一般是1024。
檢測的時候,根據timeout,遍歷fd_set表,把活躍的fd(可讀寫或者錯誤),複製到使用者空間,
再在使用者空間依次處理相關的fd。
這個機制是linux核心很早的版本,epool是根據select,pool基礎上最佳化的,缺點比較多。
缺點:
1)每次呼叫select的時候需要把fd_set從使用者空間複製到記憶體空間,比較耗效能。
2)wait時,需要遍歷所有的fd,消耗比較大。
3)select支援的檔案數大小了,預設只有1024,如果需要增大,得修改宏FD_SETSIZE值,並編譯核心(麻煩,並且fd_set中的檔案數多的話,每次遍歷的成本就很大)。
2. pool
poll的實現和select非常相似,只是描述fd集合的方式不同,poll使用pollfd結構而不是select的fd_set結構,其他的都差不多。
3. epool
epool是select和poll的改進版本,
* 先是使用int epoll_create(int size)在記憶體中建立一個指定size大小的事件空間,
* 再使用int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);事件註冊函式,註冊新的fd到epfd的epool物件空間中,並指明event(可讀寫啊等等),注意:在註冊新事件fd的過程中,也再核心中斷處理程式裡註冊fd對應的回撥函式callback,告訴核心,一旦這個fd中斷了,就把它放到ready佇列裡面去。
* 再使用int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);在epool物件對應的ready佇列裡取就緒的fd,並使用記憶體對映mmap複製到使用者空間。
* 再在使用者空間依次處理相關的fd。
優點:
1)支援一個程序開啟大數目的socket描述符
select 一個程序開啟FD是有限制的,由FD_SETSIZE設定,預設值是1024。epool可以開啟的FD數可以很大,一般1GB的記憶體有10萬多的FD數,具體數目可以cat /proc/sys/fs/file-max檢視。
2) IO效率不隨FD數目增加而線性下降
3) 使用mmap加速核心與使用者空間的訊息傳遞
回覆列表
select、poll、epoll都是IO多路複用的機制,但是他們的機制有很大的區別
1、select? select機制剛開始的時候,需要把fd_set從使用者空間複製到核心空間,並且檢測的fd數是有限制的,由FD_SETSIZE設定,一般是1024。
檢測的時候,根據timeout,遍歷fd_set表,把活躍的fd(可讀寫或者錯誤),複製到使用者空間,
再在使用者空間依次處理相關的fd。
這個機制是linux核心很早的版本,epool是根據select,pool基礎上最佳化的,缺點比較多。
缺點:
1)每次呼叫select的時候需要把fd_set從使用者空間複製到記憶體空間,比較耗效能。
2)wait時,需要遍歷所有的fd,消耗比較大。
3)select支援的檔案數大小了,預設只有1024,如果需要增大,得修改宏FD_SETSIZE值,並編譯核心(麻煩,並且fd_set中的檔案數多的話,每次遍歷的成本就很大)。
2. pool
poll的實現和select非常相似,只是描述fd集合的方式不同,poll使用pollfd結構而不是select的fd_set結構,其他的都差不多。
3. epool
epool是select和poll的改進版本,
* 先是使用int epoll_create(int size)在記憶體中建立一個指定size大小的事件空間,
* 再使用int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);事件註冊函式,註冊新的fd到epfd的epool物件空間中,並指明event(可讀寫啊等等),注意:在註冊新事件fd的過程中,也再核心中斷處理程式裡註冊fd對應的回撥函式callback,告訴核心,一旦這個fd中斷了,就把它放到ready佇列裡面去。
* 再使用int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);在epool物件對應的ready佇列裡取就緒的fd,並使用記憶體對映mmap複製到使用者空間。
*犜僭謨沒Э佔湟來未硐喙氐膄d。
優點:
1)支援一個程序開啟大數目的socket描述符
select 一個程序開啟FD是有限制的,由FD_SETSIZE設定,預設值是1024。epool可以開啟的FD數可以很大,一般1GB的記憶體有10萬多的FD數,具體數目可以cat /proc/sys/fs/file-max檢視。
2)營O效率不隨FD數目增加而線性下降
3)犑褂胢map加速核心與使用者空間的訊息傳遞