redis中io复用之evport
2018-03-05 09:46
1301 查看
从redis中的ae.c中可以知道目前复用io的方式有下面四种 #ifdef HAVE_EVPORT #include "ae_evport.c" #else #ifdef HAVE_EPOLL #include "ae_epoll.c" #else #ifdef HAVE_KQUEUE #include "ae_kqueue.c" #else #include "ae_select.c" #endif #endif #endif 即复用io的四种方式分别是evport->epoll->kqueue->select。其执行的效率也是从高到低 我们首先看看evport是如何使用的。evport的实现在ae_evport.c中 其使用的步骤如下: 1:首先通过port_create() 来申请一个port static int aeApiCreate(aeEventLoop *eventLoop) { int i; #申请结构体 aeApiState *state = zmalloc(sizeof(aeApiState)); if (!state) return -1; #通过port_create() 来申请一个port state->portfd = port_create(); if (state->portfd == -1) { zfree(state); return -1; } return 0; } 2:通过port_assocoate关联要要监控的fd static int aeApiAssociate(const char *where, int portfd, int fd, int mask) { int events = 0; int rv, err; #从这里知道目前只有读和写这两个事件 if (mask & AE_READABLE) events |= POLLIN; if (mask & AE_WRITABLE) events |= POLLOUT; #通过port_assocoate关联要要监控的fd rv = port_associate(portfd, PORT_SOURCE_FD, fd, events, (void *)(uintptr_t)mask); return rv; } 2:通过port_getn开始监控fd的io事件 static int aeApiPoll(aeEventLoop *eventLoop, struct timeval *tvp) { aeApiState *state = eventLoop->apidata; struct timespec timeout, *tsp; int mask, i; uint_t nevents; port_event_t event[MAX_EVENT_BATCHSZ]; nevents = 1; if (port_getn(state->portfd, event, MAX_EVENT_BATCHSZ, &nevents, tsp) == -1 && (errno != ETIME || nevents == 0)) { if (errno == ETIME || errno == EINTR) return 0; /* Any other error indicates a bug. */ perror("aeApiPoll: port_get"); abort(); } state->npending = nevents; #port_getn正常返回,表示监控到了io的read或者write事件 for (i = 0; i < nevents; i++) { mask = 0; #根据返回event中的flag来区分是读事件还是写事件 if (event[i].portev_events & POLLIN) mask |= AE_READABLE; if (event[i].portev_events & POLLOUT) mask |= AE_WRITABLE; #更新eventLoop 中监控到的io事件中的fd和mask eventLoop->fired[i].fd = event[i].portev_object; eventLoop->fired[i].mask = mask; } return nevents; }
相关文章推荐
- redis中io复用之epoll
- redis中io复用之kqueue
- redis中io复用之select
- linux IO复用笔记_更新中
- redis数据导出,报错Could not connect to Redis at ip:port: Cannot assign requested address解决方法
- IO复用:poll函数
- IO多路复用之select总结
- Linux网络通信编程(套接字模型TCP\UDP与IO多路复用模型select\poll\epoll)
- I/O复用——各种不同的IO模型
- IO多路复用 select与poll
- Linux下多路复用IO接口 epoll select poll 的区别
- 学习STM32(2)-IO-AFIO(复用功能IO和调试配置)
- 使用多线程还是用IO复用select/epoll? epoll 或者 kqueue 的原理是什么?
- 实现向IO PORT80丢CHECKPOINT的程序
- 【linux下c语言服务器开发系列5】功能齐全的聊天室 sever [IO复用+多进程+信号处...
- 【记录】io多路复用的学习和理解
- Linux中select IO复用机制
- 异步设备IO:OVERLAPPED和IOCompletionPort
- STM32 IO口的8中配置方式解读(推挽输出、开漏输出、复用开漏输出、复用推挽输出以及上拉输入、下拉输入、浮空输入、模拟)
- IO多路复用之epoll总结