select,poll,epoll
详解转载自:https://www.cnb
logs.com/Anker/p/3265058.html
jdk1.4中nio中引入了select,poll模式,jdk1.5中sun对其进行了优化,引入了epoll。
select缺点:
1:每次调用select都需要把fd从用户态拷贝到
内核态,开销比较大。
2:每次都需要在内核遍历传入的fd。
3:支持文件数量比较小,默认是102
poll缺点:
poll的实现和select非常相似,只是描述fd集合的方式不同,poll使用pollfd结构而不是select的fd_set结构,其他的都差不多。
epoll:
epoll提供了三个函数进行处理:epoll_create,epoll_ctl和epoll_wait,epoll_create是创建一个epoll句柄;epoll_ctl是注册要
监听的事件类型;epoll_wait则是等待事件的产生。
epoll优点:
1:每次注册新事件到epoll句柄都会把所有的fd拷贝进来,而不是在epoll_wait中重复拷贝,这样确保fd只会被拷贝一次 。
2:epoll不是像select/poll那样每次都把fd加入等待
队列中,epoll把每个fd指定一个回调函数,当
设备就绪时,唤醒等待队列的等待者就会调用其的回调函数,这个回调函数会把就绪的fd放入一个就绪链表。epoll_wait就是在这个就绪链表中查看有没有就绪fd。
3:epoll没有fd数目
限制。