近日又繼續學習了一下epoll的工作模式,這會基本上搞清楚了,因而撰寫了此篇文件進行描述。先來一段網上的介紹文件:
epoll事件分發系統可以運轉在兩種模式下:edge triggered (et)、level triggered (lt)。
lt是預設的工作方式,並且同時支援block和no-block socket;在這種做法中,核心告訴你乙個檔案描述符是否就緒了,然後你可以對這個就緒的fd進行io操作。如果你不作任何操作,核心還是會繼續通知你的,所以,這種模式程式設計出錯誤可能性要小一點。傳統的select/poll都是這種模型的代表。
et是高速工作方式,只支援no-block socket。在這種模式下,當描述符從未就緒變為就緒時,核心通過epoll告訴你。然後它會假設你知道檔案描述符已經就緒,並且不會再為那個檔案描述 符傳送更多的就緒通知,直到你做了某些操作導致那個檔案描述符不再為就緒狀態了。但是請注意,如果一直不對這個fd作io操作(從而導致它再次變成未就 緒),核心不會傳送更多的通知。
後面才是我想說的內容,既然et模式是高速模式,那我們進行伺服器開發是一定要使用的了,可是查遍文件,也沒有找到et模式的設定方法,到底如何設定和使 用呢?通過反覆測試,終於搞明白「epollet」就是et模式的設定了,也許是我太笨所以才迷惑這麼久了,以下就是將tcp套接字hsocket和 epoll關聯起來的**:
struct epoll_event struevent;
struevent.events = epollin | epollout | epollet;
struevent.data.fd = hsocket;
epoll_ctl(m_hepoll, epoll_ctl_add, hsocket, &struevent);
如果將監聽套接字m_hlistensocket和epoll關聯起來,則**如下:
struct epoll_event struevent;
struevent.events = epollin | epollet;
struevent.data.fd = m_hlistensocket;
epoll_ctl(m_hepoll, epoll_ctl_add, m_hlistensocket, &struevent);
如果想使用lt模式,直接把事件的賦值修改為以下即可,也許這就是預設的意義吧。
struevent.events = epollin | epollout; //使用者tcp套接字
struevent.events = epollin; //監聽tcp套接字
不過,通過我的測試確定,這兩種模式的效能差距還是非常大的,最大可以達到10倍。100個連線的壓力測試,其他環境都相同,lt模式cpu消耗99%、et模式15
Epoll工作模式詳解
我們目前的網路模型大都是epoll的,因為epoll模型會比select模型效能高很多,尤其在大連線數的情況下,作為後台開發人員需要理解其中的原因。select epoll的特點 select的特點 select 選擇控制代碼的時候,是遍歷所有控制代碼,也就是說控制代碼有事件響應時,select需要...
Epoll工作模式詳解
我們目前的網路模型大都是epoll的,因為epoll模型會比select模型效能高很多,尤其在大連線數的情況下,作為後台開發人員需要理解其中的原因。select epoll的特點 select的特點 select 選擇控制代碼的時候,是遍歷所有控制代碼,也就是說控制代碼有事件響應時,select需要...
epoll的兩種工作模式LT ET
之前已經介紹過了epoll的工作機制,以及它和select,poll之間的區別,傳送門 接下來我們詳細介紹一下它的兩種工作模式。lt level triggered lt模式,也叫做水平觸發模式。在該模式下,當有事件發生並呼叫epoll wait後,若未及時處理,下一次呼叫epoll wait仍會繼...