epoll反應堆模型

當epoll_wait發現response_events[]中的fd發生變化時,自動代用ptr指向的回調函數。這樣子可以再次提高一點效率。

  • 傳統
    epoll – Server – Listen — cfd — 可讀 — epoll返回 — read – 回顯 --epoll繼續監聽。
  • 反應堆
    • 流程
    • 爲什麼讀完之後要從樹上摘下來,然後改成監聽寫事件再掛到樹上
      • 設置EPOLLOUT後epoll_wait()是如何工作的
        • -水平模式:struct epoll_event ev;
          • ev.events = EPOLLOUT–>檢查寫緩衝區是否可寫
          • epoll_wait會一直返回,緩衝區能寫數據,該函數會返回,緩衝區滿的時候,不返回
        • -邊緣模式:
          • 第一次設置的時候epoll_wait會返回一次
          • 緩衝區從滿到不滿的時候
      • 爲了保證寫的數據一定能發送出去
servercoreclientsocket, listen創建了監聽文件描述符lfdepoll_wait()客戶端請求,connect()cfd = accept()epoll_wait( cfd )返回,read OKread 操作將cfd從gefd樹上摘下設置監聽cfd寫event客戶端不一定能寫滑動窗口機制客戶端緩衝區不一定能任由之可能造成server阻塞epoll_wait( cfd )返回, write_OKwrite() 操作將cfd從樹上摘下設置監聽cfd讀eventepoll_wait()繼續監聽servercoreclient
  • epoll_evet.data.ptr
    epoll_event.data.fd —>epoll_event.data.ptr
struct myevent_s {
    int fd;                                                 //要監聽的文件描述符
    int events;                                             //對應的監聽事件
    void *arg;                                              //泛型參數
    void (*call_back)(int fd, int events, void *arg);       //回調函數
    int status;                                             //是否在監聽:1->在紅黑樹上(監聽), 0->不在(不監聽)
    char buf[BUFLEN];
    int len;
    long last_active;                                       //記錄每次加入紅黑樹 g_efd 的時間值
};
  • epoll_event.data.ptr
    在這裏插入圖片描述
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章