【LInux内核中IO多路复用 背景+原理+直白总结+优缺点】Poll篇

poll

概述

poll是Linux内核提供的一种I/O多路复用机制,它允许一个进程同时监视多个文件描述符的状态变化,如可读、可写或发生异常等。当被监视的文件描述符中至少有一个满足条件时,poll就会返回并告知进程哪些文件描述符已经就绪,从而避免了进程轮询检查文件描述符状态的低效方式。

实现原理

pollfd结构体
poll函数使用pollfd结构体来描述被监视的文件描述符及其关注的事件类型。pollfd结构体通常包含以下三个成员:

  • fd:文件描述符。
  • events:请求的事件,如POLLIN(可读)、POLLOUT(可写)等。
  • revents:实际发生的事件,由内核在调用poll函数时填充。
  1. 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可能由于无文件描述符数量限制而更适合。

epoll终极篇在后面

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

another heaven

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值