多路转接使用场景
多路转接select/poll/epoll适用于长连接。
短连接:在一次通信周期才通信一次,就断开连接。使用多路转接,需要频繁将文件信息从用户拷贝到内核。
select的缺点
- 可以监视的文件个数是有限的。fd_set位图的位数有限。
- 需要用户来管理要监视的文件描述符。比如:需要定义一个数组来保存要监视的文件描述符。
- 由于用户通知内核的需要监视的文件和内核通知用户就绪的文件事件是一个参数,即输入输出参数是一个,在编码调用select前需要重新设定需要监视的文件,重新设定fd_set。
- 每次调用selcet,都需要将监视的文件信息从用户拷贝到内核,当监视文件数过多时,效率会降低。
- select内核监视文件就绪的方式是轮询检测,当监视文件个数过多时,效率会降低。
poll的缺点
- 需要用户来管理要监视的文件描述符。定义一个数组,来保存需要监视的文件。poll可以监视的文件数时无限的,但是,用户定义的数组大小决定了能够监视的文件数。
- 每次调用poll,都需要将要监视的文件信息从用户拷贝到内核。当监视文件数量过多时,效率会降低。
- poll内核监视文件就绪的方式是轮询检测,当监视文件个数过多时,效率会降低。
select和poll的不同点
poll实际是是针对select的缺点进行了改进。
- poll参数struct pollfd结构体中包含了event和revent两个变量,分别用来用户通知内核需要监视文件的事件和内核通知用户,文件事件是否就绪。相比较于select,输入输出参数分开了,不需要再调用poll前重新设定需要监视的文件。
- poll可以等待的文件数量是无限的。select是有限的。
epoll的优点
- 需要监视的文件交给了内核进行管理,具体一点是交给了epoll模型的红黑树。
- 接口使用方便。将多路转接功能拆分成了3个接口,各司其职。不像select和poll用一个接口,更加复杂。
- 数据拷贝轻量。不需要在调用epoll时重新将要监视的文件信息从用户拷贝到内核。而是在需要增加的时候才会调用epoll_ctl参数op选择EPOLL_CTL_ADD将文件信息拷贝到内核。
- 事件回调机制。内核监视事件就绪不需要轮询检测。epoll模型中有回调机制,当事件就绪,内核会调用回调函数,形成一个就绪事件的节点连接到就绪队列中,判断是都就绪,只需要判断就绪队列不为空即可。时间复杂度为O(1)。
- 监视的文件数量没有限制。
epoll为什么高效,相比较于select和poll
- 有回调机制,内核检测是否有就绪文件,不需要轮询检测,只需要判断就绪队列是否为空。
- 数据拷贝轻量,在调用epoll时不需要重新将所有需要监视的文件信息从用户拷贝到内核。只是在需要增加监视文件时才会将需要监视的文件信息从用户拷贝到内核。