select每次呼叫select()
時都要傳入fds陣列,而epoll在核心維護了乙個等待佇列,每次呼叫epoll_wait()
時不需要傳入等待佇列進去,只在執行epoll_ctl()
時才更新等待佇列。降低了核心與使用者層的資料遷移;
select()
返回後每次都要遍歷所有被監視的檔案描述符,而epoll_wait()
返回時已經將有事件發生的檔案描述符放到了乙個陣列中,所以使用者層只需要遍歷有事件發生的檔案描述符即可,大大降低了遍歷範圍;
select是將當前程序新增到每個被監視的socket的等待佇列裡面,等事件發生時,就會從所有socket的等待佇列裡面移除當前程序,並將當前程序放到工作佇列裡面,從而喚醒當前程序來處理。epoll並不直接處理程序,epoll通過epoll_create()
建立的epoll例程中會有乙個就緒列表,當某個socket有事件發生時,核心會將此socket的引用存入到就緒列表裡面。而epoll_wait()
檢視就緒列表是否為空,如果為空,就阻塞程序,如果不為空,就喚醒程序。
epoll和select原理深度解析
如果這篇文章說不清epoll的本質,那就過來掐死我吧!
epoll為什麼比select這麼快
epoll是多路復用io i o multiplexing 中的一種方式,但是僅用於linux2.6以上核心,在開始討論這個問題之前,先來解釋一下為什麼需要多路復用io.以乙個生活中的例子來解釋.假設你在大學中讀書,要等待乙個朋友來訪,而這個朋友只知道你在a號樓,但是不知道你具體住在 於是你們約好了...
Select和epoll的區別
當乙個節點和多個節點建立連線時,如何高效的處理多個連線的資料,下面具體分析兩者的區別。1.select函式 函式原型 int select int nfds,fd set readfds,fd set writefds,fd set exceptfds,struct timeval timeout ...
epoll與select的區別
epoll跟select都能提供多路i o復用的解決方案。在現在的linux核心裡有都能夠支援,其中epoll是linux所特有,而select則應該是posix所規定,一般作業系統均有實現。網上現在關於這兩者不同的介紹已經到處都是了。我這裡也不能多說出什麼東西,只是記錄下我看了實現 之後的一些總結...