非阻塞I/O加上I/O复用,渐渐帮助我们在高性能网络编程这个领域搭建了初步的基石/
epoll增添足够的动力.
select poll epoll 的区别
由图可知 epoll的性能是最好的,也很稳定,变化不大
epoll还是一种I/O多路复用技术epoll
epoll通过监控注册的描述字,来进行I/O事件的分发处理。不同于poll的是,
epoll提供 level-triggered机制和edge-triggered 条件触发和边缘触发
epoll网络编程的步骤 epoll_creat,epoll_ctl和epoll_wait
epoll_create
int epoll_create(int size);
int epoll_create1(int flags);
返回值: 若成功返回一个大于0的值,表示epoll实例;若返回-1表示出错
epoll_ctl
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
返回值: 若成功返回0;若返回-1表示出错
创建完epoll实例之后,可以通过epoll——ctl往这个epoll实例增加或删除监控的事件
epfd 为 epol文实例描述字
op 操作,表示删除 增加,修改监控事件
EPOLL_CTL_ADD : 注册
EPOLL_CTL_DEL: 向epoll实例删除文件描述符对应事件
EPOLL_CTL_MOD:修改文件描述符对应的事件
第三个注册参数时 注册的事件的文件描述符,一个监听套芥子
第四个参数为注册的事件类型
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_wait
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
返回值: 成功返回的是一个大于0的数,表示事件的个数;返回0表示的是超时时间到;若出错返回-1.
第一个参数时eoill实例描述字,也就是epoll句柄
第二个参数返回给用户空间需要处理的i/o事件,这是一个数组,数组的大小由epoll_wait的返回值决定
这个数组的每个元素都是一个需要待处理的I/O事件,events表四具体的事件类型
第三个参数,表示epoll_wait可以返回的最大值
第四个参数时epoll_wait阻塞调用的超时值,如果这个值设置为-1 表示不超时,如果设置为0则立即返回,
即使没有任何i/o事件发生
边缘触发和条件触发:
条件触发 只要满足事件的条件,比如有数据可读,就一直不断的把这个事件传递给用户
边缘触发的意思时 只有第一次满足条件的时候才会触发,之后就不会再传递相同的事件
epoll通过改进的接口设计,避免了用户太-内核太频繁的数据拷贝,大大提高了系统性能,在使用epoll的时候
我们一定呀