select和epoll

今天看了下select和epoll。網絡

先搞清楚兩個概念:阻塞和非阻塞。
阻塞是直到事件發生纔會繼續執行,
非阻塞是能夠設定時間,若是在規定時間內事件發生了,則執行。 若是超出時間了也會繼續執行。socket

若是是阻塞模式:
while true {
for i in stream[]; {
if i has data
read until unavailable
}
}函數

select 輪詢機制
調用select()將阻塞,直到指定的文件描述符準備好執行I/O,或者可選參數timeout指定的時間已通過去
while true {
select(streams[])
for i in streams[] {
if i has data
read until unavailable
}
}
缺點是:傳統的select/poll另外一個致命弱點就是當你擁有一個很大的socket集合,不過因爲網絡延時,任一時間只有部分的socket是"活躍"的,可是select/poll每次調用都會線性掃描所有的集合,致使效率呈現線性降低。
可是epoll不存在這個問題,它只會對"活躍"的socket進行操做---這是由於在內核實現中epoll是根據每一個fd上面的callback函數實現的。那麼,只有"活躍"的socket纔會主動的去調用 callback函數,其餘idle狀態socket則不會。事件

相關文章
相關標籤/搜索