epoll是1个服务端监听n个客户端的多路复用技术(通讯方式socket)
epoll:(事件驱动)服务端通过管道通讯方式将有变化事件的客户端保存到1个队列
select/poll:(轮询驱动)服务端主动遍历监听的所有客户端,查看每个客户端的fd是否有变化的消息(通过pipe管道通讯方式)弊端:每次遍历全部fd消耗更多cpu,fdset 每次都需全部copy到内核态
实例1:MessageQueue机制
looper() UI线程走到nativePollOnce -〉epoll_wait(mWakeEventFd)挂起,
MessageQueue有消息过来时,write方法通过pipe方式通知mWakeEventFd有数据就绪,
epoll_wait恢复执行,继续消费message
mWakeEventFd创建在MessageQueue nativeInit ():
mWakeEventFd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC)int result = epoll_ctl(mEpollFd, EPOLL_CTL_ADD, mWakeEventFd)//并添加epoll监听
唤醒原理:
实例2: eventserver监听大量client发送event事件过来
while (start) {
struct epoll_event epollEvents[10];
int epollFd = epoll_create1(EPOLL_CLOEXEC);
int ret = epoll_ctl(epollFd, EPOLL_CTL_ADD, sockFd_, &event);
int eventNum = epoll_wait(epollFd, epollEvents, 10, 10000);
}