accpet创建一个socket,就会对应创建一个file结果,放在进程打开的文件列表中
    image.png
    socket包含file指针和一个sock结构,这个sock结构中包含等待队列,接收队列和发送队列

    epoll三个函数
    epoll_create创建一个eventloop结构,然后里面包括一个等待队列,当内核数据准备就绪(软中断执行完)后就会从这里面唤醒等待的进程,还有一个红黑树结构,用来管理插入的socket连接,然后还包括一个就绪链表用于存放就绪的socket连接
    epoll_ctl将socket插入到红黑树结构里面,epoll_wait用来查看就绪链表中有没有数据,没有就把自己加入eventloop的等待队列中把自己阻塞掉(当数据到达socket后进入就绪队列然后唤醒eventloop中的等待队列的进程(打开了这个socket的))
    image.png

    总结下,epoll 相关的函数里内核运行环境分两部分:
    用户进程内核态。进行调用 epoll_wait 等函数时会将进程陷入内核态来执行。这部分代码负责 查看就绪队列,以及负责把当前进程阻塞掉,让出 CPU。
    硬软中断上下文。在这些组件中,将包从网卡接收过来进行处理,然后放到 socket 的接收队列。对于 epoll 来说,再找到 socket 关联的 epitem,并把它添加到 epoll 对象的就绪链表 中。 这个时候再捎带检查一下 epoll 上是否有被阻塞的进程,如果有唤醒之。

    image.png