epoll

Linux socket accpet 对应的内核结构 https://blog.youkuaiyun.com/u010039418/article/details/80628490

Linux socket https://blog.youkuaiyun.com/u010039418/article/details/80628490

epoll 的两种用法: https://www.cnblogs.com/ccccccccc/p/3963392.html

下面我们再来看看epoll_event的结构:

typedef union epoll_data {  
    void *ptr;  
    int fd;  
    uint32_t u32;  
    uint64_t u64;  
} epoll_data_t;
 
struct epoll_event {  
    uint32_t events;      // Epoll events  
    epoll_data_t data;      // User data variable  
};

请重点关注epoll_data_t这个字段。这个字段是一个联合体,联合体在同一时间只有一个成员变量,联合体占用的内存大小为所有成员中占用字节最大的成员决定,在此处,就是类型为uint_64_t 的u64。

原始epoll结构有一个很大的麻烦,fd字段放在了epoll_data_t结构 ,这就使得在使用的时候,我们不得不在fd与用户自己的数据之间做一个抉择,关键是fd不能少,少了也就失去 epoll的意义。选择保存用户数据到epoll_data_t中,那么我们自定义 的结构中一定要包含fd,但是请注意,用户自定义的数据此时只能保存一个地址,即保存在指针*ptr中。常规的编程中,我们发现,几乎所有的epoll结构都没有自定义用户数据,即使定义了,对epoll的使用也不得不变得麻烦,并且用户不得不为每一个epoll注册申请一个 内存空间(本人目前没有发现更好的办法,如果不申请内存,那么只能用全局或静态变量)。当有大量服务连接的时候,每次触发epoll机制都不得不重新根据ptr来获取自定义结构内存,这样难免会影响epoll服务器的性能,即使内核对epoll已经足够优化,用户自己查找的过程中,还是必不可少的增加了时间,间接或直接地降低了epoll的效率。

参考:https://blog.youkuaiyun.com/qq_33195791/article/details/81838444

转载于:https://my.oschina.net/innovation/blog/3072043

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值