今天简单了解了一下这三个函数,总体的感觉是系统性能提升的需求越来越明确,抽象出来的逻辑逐渐下沉到kernel中实现,没有亲手写一遍代码,但是读了一些示例代码,感觉使用上本质区别不大,都需要建立实例->注册fd->调用阻塞函数获取就绪的fd->处理fd,主要区别在内部实现上,还有一些小的差别在epoll的注册事件函数的功能上.
如果有理解的不对的地方希望不吝赐教.
演变过程
1. 阻塞/非阻塞式的IO模式,主要的消耗是线程,当服务器的连接数变多的时候,并发处理的瓶颈在于线程数量,线程消耗系统资源较多,所以并发数无法提高.
2. 使用select/poll/epoll函数,模式转变为多路复用,kernel选择好就绪的fd回传给用户态程序,可以是用单个线程处理多个连接,并发数量大大提高,
3.关于select,poll和epoll的性能上差别.
3.1 不是特别确定.我个人的理解. select和poll在内部实现中遍历了所有的fd,并选择就绪的fd返回, 而epoll将这些fd和事件注册到更下层,在fd就绪后,下层调用注册事件,把fd加到就绪队列中,省去遍历的消耗.
3.2 select,poll每次在阻塞的时候都把fd重新传入kernel一次,而epoll则是在调用ctl注册的时候拷贝一次就可以了.个人觉得这是一个小的改进不知道对性能的影响有多大.
参考文献:
Linux下I/O多路复用系统调用(select, poll, epoll)介绍
epoll man page