poll
概述
poll是Linux内核提供的一种I/O多路复用机制,它允许一个进程同时监视多个文件描述符的状态变化,如可读、可写或发生异常等。当被监视的文件描述符中至少有一个满足条件时,poll就会返回并告知进程哪些文件描述符已经就绪,从而避免了进程轮询检查文件描述符状态的低效方式。
实现原理
pollfd结构体
poll函数使用pollfd结构体来描述被监视的文件描述符及其关注的事件类型。pollfd结构体通常包含以下三个成员:
fd
:文件描述符。events
:请求的事件,如POLLIN(可读)、POLLOUT(可写)等。revents
:实际发生的事件,由内核在调用poll函数时填充。
- poll函数调用
当进程调用poll函数时,需要传入一个pollfd结构体数组,以及数组的大小和超时时间等参数。内核会遍历该数组,检查每个文件描述符所对应的I/O事件是否发生。
3. 事件检测
内核通过轮询的方式检查每个文件描述符是否满足请求的事件条件。如果某个文件描述符的事件已经发生,内核会在该pollfd结构体的revents成员中设置相应的标志位。
4. 结果返回
当至少有一个文件描述符的事件发生时,或者超时时间到达时,poll函数会返回。进程可以通过检查pollfd结构体数组中的revents成员来确定哪些文件描述符已经就绪,并进行相应的处理。
优缺点
优点
没有文件描述符数量的硬限制,相比select函数更加灵活。
可以为不同的文件描述符设置不同的监听事件。
缺点
当文件描述符数量较多时,轮询检查的方式会导致性能下降。
与select函数类似,poll函数在处理大量文件描述符时也存在效率问题。
总结
poll多路复用机制通过监视多个文件描述符的状态变化,实现了高效的I/O事件处理。然而,在文件描述符数量较多时,其性能可能会受到影响。因此,在实际应用中,通常会根据具体场景选择更合适的I/O多路复用机制,如epoll等。
直白总结
poll机制和select差不多,可以看看select篇的直白总结。比较显著不同的是poll中文件描述符集存储的方式是通过数据中存放结构体实现的。其次是没有文件描述符数量的限制。
poll与select的比较
文件描述符数量:poll没有文件描述符数量的硬限制,而select通常有1024个的限制(尽管可以修改)。
数据结构:poll使用pollfd结构体数组来表示文件描述符集合,而select使用位图。
拷贝开销:对于少量文件描述符的情况,poll的拷贝开销可能略小于select。但对于大量文件描述符的情况,这种差异可能变得不那么显著。
性能:当监视的文件描述符数量较多时,两者都可能出现性能问题。但是,在某些情况下,poll可能由于无文件描述符数量限制而更适合。