當前位置:編程學習大全網 - 編程語言 - epoll et和lt模式的區別

epoll et和lt模式的區別

EPOLL事件分發系統可以運轉在兩種模式下:Edge Triggered (ET)、Level Triggered (LT)。

LT是缺省的工作方式,並且同時支持block和no-blocksocket;在這種做法中,內核告訴妳壹個文件描述符是否就緒了,然後妳可以對這個就緒的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%。

  • 上一篇:“雙減”政策下如何提高小學英語課堂效率的報告
  • 下一篇:大學生何如自我介紹
  • copyright 2024編程學習大全網