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会返回一次
          • 缓冲区从满到不满的时候
      • 为了保证写的数据一定能发送出去
server core client socket, listen 创建了监听文件描述符lfd epoll_wait() 客户端请求,connect() cfd = accept() epoll_wait( cfd )返回,read OK read 操作 将cfd从gefd树上摘下 设置监听cfd写event 客户端不一定能写 滑动窗口机制 客户端缓冲区不一定能 任由之可能造成server阻塞 epoll_wait( cfd )返回, write_OK write() 操作 将cfd从树上摘下 设置监听cfd读event epoll_wait()继续监听 server core client
  • 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
    在这里插入图片描述
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值