美文网首页
用户态协议栈之epoll实现原理

用户态协议栈之epoll实现原理

作者: congchp | 来源:发表于2021-09-13 11:13 被阅读0次

用户态协议栈,为什么要实现epoll?
因为内核的epoll是跟内核协议栈一起使用的,内核协议栈处理io后通过回调的方式来操作epoll中的就绪队列,所以用户态协议栈必须要有用户态的epoll。

用户态epoll是参考内核的epoll,在用户空间实现了epoll的功能。

epoll使用红黑树和队列,红黑树存放需要检测的节点,队列存放就绪的节点。


image.png

epoll三个函数:
int epoll_create(int size);

  1. 分配一个eventpoll;
  2. 初始化红黑树的根节点epfd。
    eventpoll与epfd一一对应。

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
操作红黑树,根据op对红黑树进行增删改

int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
把就绪队列的数据从内核copy到用户空间。

何时将红黑树中的节点加入到就绪队列中?
网卡中有数据时,内核协议栈通过回调的方式将红黑树中的节点加入到就绪队列中。
回调的时机有哪些呢?

  1. client端调用connect(), 发送TCP连接请求;
    这里需要注意,跟server端是否调用accept没有关系,已经测试过,即使不调用accept,TCP依然连接成功
  2. client端通过send发送消息;
  3. server端通过send发送消息;
  4. client端调用close,进行关闭的时候。
    回调的参数有哪些?
  5. fd,确定红黑树中的节点;
  6. events,EPOLLIN, EPOLLOUT等等;
  7. eventpoll, epoll底层数据结构,可以确定是那个epoll。可以同时存在多个epoll。
image.png

如何检测到io数据发生了变化,需要调用回调呢?
这个是netmap + TCP协议栈做的事情,会有一个while(1), 不断去检测。


image.png
image.png

epoll是不是线程安全的?
epoll是线程安全的。红黑树和就绪队列,都是加锁的;epoll_wait中,使用条件变量。

  1. rbtree --> mutex;
  2. queue --> spinlock;
  3. epoll_wait -->cond, mutex

ET和LT是如何实现的?会不会回调?
LT: 一直回调
ET:调用一次
一直回调怎么实现?就是上面提到的,有一个while(1),不断去检测。

来看一下epoll的代码

  1. int epoll_create(int size);
    初始化eventpoll,rbtree,rdlist,以及epoll中使用的锁和条件变量
  2. int epoll_ctl(int epid, int op, int sockid, struct epoll_event *event)
    根据op,EPOLL_CTL_ADD/EPOLL_CTL_DEL/EPOLL_CTL_MOD,操作红黑树。
  3. int epoll_wait(int epid, struct epoll_event *events, int maxevents, int timeout)
    将就绪队列中的数据(fd, events)从内核空间copy到用户空间, 并将数据从就绪队列中移除。
    timeout > 0, 使用 pthread_cond_timedwait()
    timeout < 0, 一直阻塞,使用pthread_cond_wait()
  4. int epoll_event_callback(struct eventpoll *ep, int sockid, uint32_t event)
    根据fd,从rbtree中找到节点,并加入到就绪队列中。

相关文章

  • 用户态协议栈之epoll实现原理

    用户态协议栈,为什么要实现epoll?因为内核的epoll是跟内核协议栈一起使用的,内核协议栈处理io后通过回调的...

  • 用户态协议栈之TCP

    要实现用户态协议栈,必须要搞懂TCP,TCP 11个状态、滑动窗口、拥塞控制等等。要使用用户态协议栈,内核提供的e...

  • 用户态协议栈的实现

    协议栈,指的是TCP/IP协议栈。linux系统中,协议栈是内核实现的。 Client发送数据给server,数据...

  • 面试常见问题06 - 项目相关

    一. epoll 1. epoll 实现原理 epoll_create:创建一个epoll对象,一般 epollf...

  • Android面试题总结(题目+复习链接)

    数据结构 1.栈实现原理 java数据结构与算法之栈(Stack)设计与实现 - CSDN博客 2.链表实现原理 ...

  • LTE学习笔记(二)

    LTE协议栈 LTE协议栈的两个面 用户面协议栈:负责用户数目传输 控制面协议栈:负责系统信令传输 用户面的主要功...

  • 了解一下BLE协议栈整体架构

    协议栈框架 一般而言,我们把某个协议的实现代码称为协议栈(protocol stack),BLE协议栈就是实现低功...

  • Epoll实现原理

    Epoll 很重要,但是 Epoll 与 Select 的区别是什么呢?Epoll 高效的原因是什么? 网上虽然也...

  • ovs 基于dpdk性能优化的原理

    得益于用户态网络协议栈处理,用户空间,巨页,内存索引,数据预取, IPC等dpdk的设计,如下维度都有一定性能的提...

  • f-stack初探

    介绍 f-stack是基于DPDK(Data Plante Development Kit)实现的一个用户态的协议...

网友评论

      本文标题:用户态协议栈之epoll实现原理

      本文链接:https://www.haomeiwen.com/subject/qdbuwltx.html