用生活中的场景类比,可以更容易理解 select
、poll
和 epoll
的工作原理和区别。
1. select
:固定值班表,逐个检查
想象你是一个前台管理员,有一张固定的名单,上面列了 100 个人的名字(比如说住户)。你需要每隔一段时间检查这 100 个人是否需要服务(比如是否需要收信件)。
怎么做?
- 你一个个地叫名字:“小张,有事吗?”、“小王,有事吗?”……直到全部检查完。
- 这样效率比较低,尤其是名单很长的时候(即便只有 1 个人有事,你也得把 100 个人都叫一遍)。
特点:
- 每次都要检查整张名单,效率低。
- 如果名单人数超过前台管理员的记忆容量(比如最大 1024),就没办法继续处理了。
2. poll
:灵活的值班表,逐个检查
现在你升级了一下,把固定的名单换成了一本活页笔记本,想加入谁的名字都可以。但是,检查的方式还是一样的,一个一个问。
怎么做?
- 和
select
的方式类似,你依然需要逐一检查所有名字。 - 好处是,名单变灵活了,你想放多少人就放多少人。
特点:
- 名单大小不再受限制。
- 但是效率没有本质提升,因为你还是需要一个个检查。
3. epoll
:智能通知机制,自己来找你
你变得更聪明了,不再一个个去问住户,而是安装了一个“服务通知系统”。当某个住户需要服务时,他们会按门铃通知你,你只需要处理那些按了门铃的住户就行。
怎么做?
- 把所有住户的名字登记在系统里,住户有事就会自己通知你。
- 你只处理那些真的按了门铃的人,其他不需要服务的住户,你完全不用理会。
特点:
- 不用逐一检查名单了,效率大幅提高。
- 特别适合大规模住户的情况(比如几万个住户,只有少部分需要服务时)。
- 你可以设置不同的通知方式:比如“每次有事就通知”(水平触发)或者“只通知一次”(边缘触发)。
总结一下:
select
:就像一个呆板的前台管理员,每次都按固定名单挨个检查,名单太长时效率很低。poll
:和select
差不多,但换了个更大的本子,可以装更多名字。epoll
:有了智能通知系统,住户有事自己通知,效率最高,尤其适合住户多的情况下。
所以,如果你管理的住户(文件描述符)很少,select
和 poll
都能用。但如果住户特别多,而且只有一部分人会需要服务,那 epoll
会是最明智的选择!