accept流程:先创建一个文件调用sock_alloc申请一个struct socket对象,将listen的socket的协议操作ops赋值给新的socket对象,在创建file对象将socet->ops付给file->ops,而file->f_op->poll指向sock_poll;socket对象内部存在一个sock指针。创建完毕之后会把该fiel对象挂在当前进程列表上。
epoll_create流程:
eventpoll主要成员:
epoll_ctl(ADD):
1.分配一个红黑树节点epitem,将等待事件添加到socket的等待队列里去,并注册回调函数ep_poll_callback(创建等待队列项,添加在socket的等待队列中区),将epitem插入到eventpoll对象的红黑树里去;(原先阻塞式IO等待队列项中存在private指针指向current进程描述服,现在将其置空);epoll_wait,调用时即查看rdlist存在数据与否,没有数据就创建等待队列项,将其添加在eventpoll上的等待队列上去,然后阻塞;
软件中断到来时,tcp协议栈入口函数tcp_v4_rcv,现根据包查找本地socket,对其状态进行判断,当socket状态为establish,将接收数据放在接收队列上。找到等待队列上的元素,调用其注册的回调函数,在 ep_poll_callback 根据等待任务队列项上的额外的 base 指针可以找到epitem,进而也可以找到 eventpoll对象。首先它做的第一件事就是把自己的 epitem 添加到 epoll 的就绪队列中。接着它又会查看 eventpoll对象上的等待队列里是否有等待项(epoll_wait 执行的时候会设置)。如果没执行软中断的事情就做完了。如果有等待项,那就查找到等待项里设置的回调函数。