源码分析(二)——Epoll

Epoll源码解析

epoll_create()//创建内核时间表 容纳事件的容器

size(>0)没有意义 inode每一个文件都有自己的id

struct file 打开的文件

当创建好epoll句柄后,它就是会占用一个fd

一、getfd 分配空闲的struct file,fd,struct inode,将fd和file关联起来

1.struct file

2.inode

3.fd

4.关联

根据file数组中所存放的fd来寻找指向的file结构体

内核事件表

二、分配struct eventpoll(用file中private data找到)定义的重要的数据结构 与struct file关联

1.Rdlist(就绪队列)

2.Rbr(红黑树)作为内核事件表,容纳描述符和事件

3.关联

用file中private data找到struct eventpoll

4.红黑树关联到struct epitem

三.struct inode

epoll_ctl() //向内核事件表中 添加 修改 移除 事件

判断添加描述符是否正确

tfile->f_op(操作)|| ! tfile->f_op->poll

判断文件是否正确

ep产生节点epi

对epi节点进行操作(增加,删除,修改)

实现Ep_insert时

ep_ptable_queue_proc

ep_poll_callback:注册回调函数,描述符就绪时调用

一旦基于某个文件描述符就绪时,内核会采用类似callback的回调机制,迅速激活这个文件描述符

回调函数:ep_poll_callback(将就绪的描述符放到就绪队列中)

把节点epi添加到树中

epoll_wait()//检查并获取就绪事件

maxevents:数组大小

Events:存放就绪事件的结构体数组

Ep_poll:

Eavail:

ep_events_transfer:

ep_collect_ready_items:收集就绪描述符和事件

ep_send_events:将就绪的事件传递给用户,传递前会再次检查事件是否就绪,拷出前再次检查是否就绪

Eventcnt为0,则不再读取

ep_reinject_items:

LT:拷出后返回再次加入到rdlist中

ET:不会再次返回

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值