类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

epoll为什么这么快,epoll的实现原理

丽丽FXxy56 问题未开放回答
推荐于2016-10-17 13:45:02 最佳答案
解释.
假设读书,要等待朋友访,朋友知道A号楼,知道具体住,于A号楼门口见面.
使用阻塞IO模型处理问题,直守候A号楼门口等待朋友,能做别事情,难知道,效率.
进步解释selectepoll模型差异.
select版妈做事情:比朋友,select版妈比较笨,带着朋友挨房间进行查询谁甲,朋友,于实际代码,select版妈做事情:
int n = select(&readset,NULL,NULL,100); for (int i = 0; n > 0; ++i) { if (FD_ISSET(fdarray[i], &readset)) { do_something(fdarray[i]); --n; } }epoll版比较先进,信息,比房间号,等同朋友,需要告诉该朋友同房间即,用自亲自带着.于epoll版妈做事情代码表示:
n = epoll_wait(epfd,events,20,500); for(i=0;i<n;++i) { do_something(events[n]); } epoll,关键数据结构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_dataunion结构体,epoll版妈用于保存同信息结构体,保存类型信息:fd,指针,等等.结构体,epoll用吹灰定位甲.
别些效率提高,规模并发服务器,轮询IO操作.再,朋友楼管妈都要全楼查询同,处理效率必,久楼底.
早给阻塞IO处理模型, 采用路复用IO, 程序自由进行自IO操作工作, IO状态发变化候由路复用IO进行通知, 再采取相应操作, 直阻塞等待IO状态发变化.
,epoll比select提高实际用空间换间思想具体应用.
二、深入理解epoll实现原理:发高性能网络程序windows发者言必称iocplinux发者则言必称epoll家都明白epoll种IO路复用技术高效处理数百万计socket句柄比起selectpoll效率高用起epoll觉挺爽确实快高速处理并发连接呢 先简单何使用C库封装3epoll系统调用吧int epoll_create(int size); int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); int epoll_wait(int epfd, struct epoll_event *events,int maxevents, int timeout); 使用起清晰首先要调用epoll_create建立epoll参数size内核保证能够确处理句柄数内核保证效
epoll_ctl操作面建立epoll刚建立socket加入epoll让其监控或者 epoll监控socket句柄移epoll再监控等等
epoll_wait调用给定timeout间内监控句柄事件发用户态进程
调用epoll比select/poll优越处:者每调用都要传递所要监控socket给select/poll系统调用意味着需要用户态socket列表copy内核态万计句柄导致每都要copy几十几百KB内存内核态低效调用epoll_wait往调用select/poll用传递socket句柄给内核内核已经epoll_ctl要监控句柄列表实际调用epoll_create内核已经内核态始准备帮存储要监控句柄调用epoll_ctl往内核数据结构塞入新socket句柄
内核切皆文件epoll向内核注册文件系统用于存储监控socket调用epoll_create虚拟epoll文件系统创建file结点file普通文件服务于epollepoll内核初始化(操作系统启epoll自内核高速cache区用于安置每想监控socket些socket红黑树形式保存内核cache支持快速查找、插入、删除内核高速cache区建立连续物理内存页建立slab层简单物理想要size内存使用使用空闲static int __init eventpoll_init(void) { ... ... /* Allocates slab cache used to allocate "struct epitem" items */ epi_cache = kmem_cache_create("eventpoll_epi", sizeof(struct epitem), 0, SLAB_HWCACHE_ALIGN|EPI_SLAB_DEBUG|SLAB_PANIC, NULL, NULL); /* Allocates slab cache used to allocate "struct eppoll_entry" */ pwq_cache = kmem_cache_create("eventpoll_pwq", sizeof(struct eppoll_entry), 0, EPI_SLAB_DEBUG|SLAB_PANIC, NULL, NULL); ... ... epoll高效调用epoll_ctl往塞入百万句柄epoll_wait仍飞快事件句柄给我用户由于我调用epoll_create内核除帮我epoll文件系统file结点内核cache红黑树用于存储epoll_ctl传socket外再建立list链表用于存储准备事件epoll_wait调用仅仅观察list链表数据即数据数据sleeptimeout即使链表没数据epoll_wait非高效
准备绪list链表维护执行epoll_ctlsocket放epoll文件系统file红黑树给内核断处理程序注册调函数告诉内核句柄准备绪list链表socket数据内核网卡数据copy内核socket插入准备绪链表
颗红黑树张准备绪句柄链表少量内核cache帮我解决并发socket处理问题执行epoll_create创建红黑树绪链表执行epoll_ctl增加socket句柄则检查红黑树否存立即返则添加树干向内核注册调函数用于断事件向准备绪链表插入数据执行epoll_wait立刻返准备绪链表数据即
看看epoll独两种模式LTETLTET模式都适用于所说流程区别LT模式句柄事件处理完调用epoll_wait句柄ET模式仅
件事socket句柄事件内核该句柄插入面所说准备绪list链表调用epoll_wait准备socket拷贝用户态内存清空准备绪list链表epoll_wait干件事检查些socketET模式(LT模式句柄并且些socket确实未处理事件该句柄放刚刚清空准备绪链表非ET句柄事件epoll_wait每ET模式句柄除非即使socket事件没处理完epoll_wait返三、扩展阅读(epoll与前其相关技术比较): Linux提供select、poll、epoll接口实现IO复用三者原型所示本文参数、实现、性能等三者进行 int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); int poll(struct pollfd *fds, nfds_t nfds, int timeout); int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout); select、poll、epoll_wait参数及实现比 1. select参数nfdsfdset集合描述符值加1fdset位数组限制__FD_SETSIZE(1024)位数组位代表其描述符否需要检查 select第二三四参数表示需要关注读、写、错误事件文件描述符位数组些参数既输入参数参数内核修改用于标示哪些描述符关注事件调用select前都需要重新初始化fdset timeout参数该结构内核修改其值剩余 select应于内核sys_select调用sys_select首先第二三四参数指向fd_set拷贝内核SET描述符调用进行poll并记录(fdset)事件发select用户空间并返轮询任何事件发指定则select睡眠睡眠结束再进行轮询用户空间 select返需要逐检查关注描述符SET(事件否发 2. poll与selectpollfd数组向内核传递需要关注事件故没描述符限制pollfdevents字段revents别用于标示关注事件事件故pollfd数组需要初始化 poll实现机制与select类似应内核sys_pollpoll向内核传递pollfd数组pollfd描述符进行poll相比处理fdsetpoll效率更高 poll返需要pollfd元素检查其revents值指事件否发 3. epoll通epoll_create创建用于epoll轮询描述符epoll_ctl添加/修改/删除事件epoll_wait检查事件epoll_wait第二参数用于存放结 epoll与select、poll首先用每调用都向内核拷贝事件描述信息调用事件信息epoll描述符关联起另外epoll轮询等待描述符注册调函数事件发调函数负责事件存储绪事件链表用户空间

dsuwlzon

采纳率:95% 擅长: 暂未定制

为您推荐: