Epoll技術深刻學習
Epoll技術深刻學習
一, Epoll概述
- epoll就是一種典型的IO多路複用,支持高併發,號稱一百萬
- 傳統select, poll 在併發量1000-2000的時候性能明顯降低
- epoll是Linux內核2.6引入的技術。(kqueue相似,在其餘系統中
- 十萬個鏈接同一時刻,只有幾十上百個客戶端給你發數據,epoll只處理這幾十上百個鏈接
- 不少服務器每一個進程,或每一個線程對應一個鏈接。涉及進程切換損壞
- epoll事件驅動機制,在單獨進程或線程單獨運行。收集處理技術
二,Epoll的工做原理(三個函數)
- epoll_create()
- 原型:int epoll_create(int size)
- 建立一個epoll對象,返回對象描述符
- 最終要調用close(), 由於文件描述符 老是關閉的
- 原理:
- 建立一個eventpoll的結構對象。
- rbr是一顆紅黑樹
- rdlist結構表明一個雙向鏈表表頭指針,從頭訪問遍歷每一個元素
- epoll_ctl()
- 原型:int epoll_ctl(int efpd, int op, int sockid, struct epoll_event &event);
- 功能:把感興趣的事件添加到系統中去
- efpd: 就是epoll_create返回的文件描述符
- op: 動做,添加/刪除/修改,對於1,2,3,當時系統有宏EPOLL_CTL_ADD,EPOLL_CTL_DEL,EPOLL_CTL_MOD
- add 就是往紅黑樹上加結點。每次tcp鏈接得到一個socket,即紅黑樹的key
- mod修改,
- del刪除,從紅黑樹把結點幹掉,TCP鏈接上沒法收到任何通知了
- sockid: 一個客戶端一個socket,就是accpet(); 就是紅黑樹的key
- event:事件信息。
- 原理:
- 其實就是紅黑樹上的維護過程。
- EPOLL_CTL_ADD: 往紅黑樹中增長結點
- EPOLL_CTL_DEL: 往紅黑樹中刪除結點
- EPOLL_CTL_MOD: 往紅黑樹中修改結點
- epoll_wait
- 原型:int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout)
- 阻塞一小段時間並等待事件發生,返回事件的集合。也就是獲取內核通知事件
- 把雙向鏈表中移除(雙向鏈表記錄的是全部有數據的TCP鏈接)
- efpd: 就是epoll_create返回的文件描述符
- events: 數組,長度是maxevents。標示這一次epoll_wait收集到的事件數目。從雙向鏈表中取節點
-
- 通常有四種狀況,操做系統會回調把事件插入到雙向鏈表中
- 完成三次握手,accept()。
- 客戶端關閉鏈接,close()。
- 客戶端發送數據來的時候。
- 當能夠發送數據的時候,服務器調用send(),write()。
- 其餘。。。
三,實際使用
epoll案例數組
四,LT和ET
- LT(level trigger) 水平觸發,低速效率差, 默認模式
- ET(edge trigger) 邊沿觸發,高速模式(效率好)
- 現狀:
- 全部的監聽套接字都是水平觸發
- 全部的接入進來的用戶套接字都是邊緣觸發
本質區別:服務器
- 水平觸發: 來一個事件,若是你不處理它,那麼這個事件就會一直觸發;
- 邊緣觸發: 只對非阻塞socket有用. 來一個事件,內核只通知一次.無論你是否處理
- 代價: 編碼的難度加大, 接到通知後要保證處理問題.
歡迎關注本站公眾號,獲取更多信息