42°

epoll

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

Linux socket https://blog.csdn.net/u010039418/article/details/80628490

下面我们再来看看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.csdn.net/qq_33195791/article/details/81838444

本文由【MtrS】发布于开源中国,原文链接:https://my.oschina.net/innovation/blog/3072043

全部评论: 0

    我有话说: