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有用. 來一個事件,內核只通知一次.無論你是否處理
    • 代價: 編碼的難度加大, 接到通知後要保證處理問題.
相關文章
相關標籤/搜索