在 Linux 下,服务器如何知道某个 TCP 连接来了消息? 这就涉及 IO 事件通知机制!

1. 阻塞 read()

  • 阻塞 read() 就像你打电话问饭好了吗,但如果对方不接电话(没数据),你就一直守在电话边等,什么别的事情都做不了。

你打电话问外卖员"饭好了吗?",如果外卖还没送到,你只能一直等着,啥都干不了 。
(阻塞式等待)

  • 优点:实现简单,适用于单个连接。
  • 缺点 :等待期间 CPU 无法做别的事,如果有多个连接,性能极差。

2. 轮询 read()

  • 非阻塞 read() + 轮询 就是你每秒钟打一次电话问"饭好了吗?",如果没好就挂断,等 1 秒再打一次,重复操作,浪费时间和精力。

你每秒钟打一次电话问"饭好了吗?"
如果没好,就挂断,过 1 秒再打一次 ,一直循环到饭做好。
(非阻塞 + 轮询)

  • 优点:不会完全卡住,但 CPU 仍然会被轮询占用。
  • 缺点 :即使没有饭做好,你还是要不停地打电话(轮询 read()),CPU 资源浪费严重。

3. select() / poll()

你在餐厅前台登记了一个电话,并告诉服务员:
"有饭做好了,打电话通知我。"

服务员真的通知你了,但他说:
"有几道菜做好了,你自己去检查是哪道菜。"
(你必须自己挨个检查)

  • 优点:不用一直打电话(轮询),CPU 资源消耗减少。
  • 缺点 :仍然要遍历所有连接(菜品)检查哪些是好的,连接数量大时很慢。

4. epoll()

你用高科技 GPS 追踪器,每道菜都装上一个传感器,只要菜做好了,GPS 直接告诉你"5 号菜、8 号菜已经完成!"
你不用自己挨个检查,而是直接处理完成的菜品。

  • 优点 :只有有数据的连接才会被通知,不用遍历所有 socket,处理速度是 O(1)。
  • 缺点 :Linux 独有,Windows 不支持(Windows 用 IOCP 代替 epoll)。

最终结论

方式 比喻 效率
阻塞 read() 你打电话问饭好了吗?没人接就一直等 低,卡住 CPU
轮询 read() 你每秒打一次电话问"饭好了吗?" 很低,CPU 白白浪费
select() / poll() 你让服务员通知你,但仍然要自己检查每道菜 中等,仍然要遍历所有连接
epoll() 你用 GPS 追踪,服务员直接告诉你哪道菜好了 高效,适用于大规模高并发

所以,在写高性能 HTTP 服务器时,epoll 是最佳选择。

相关推荐
博客zhu虎康1 天前
实现局域网P2P通信:内网发送消息
网络·网络协议·p2p
|_⊙1 天前
网络层协议 IP
服务器·网络·tcp/ip
沫璃染墨1 天前
从零入门计算机网络系列(十五):TCP可靠传输机制详解——从序号与确认应答到乱序处理
服务器·网络·c++·tcp/ip·tcp
严肃小白兔1 天前
MATLAB 优秀开源项目与工具箱推荐:涵盖通信、图像处理、脑机接口等九大领域
图像处理·matlab·信息与通信·开源项目
流浪0011 天前
计算机网络篇20:网络层——IP 协议的定位与 IPv4 报头字段,从 20 字节首部到 TTL 防环
tcp/ip·计算机网络·ttl·网络层协议·ip报头
zhengfei6111 天前
CVE-2026-98432:Linux 内核 TCP 释放后重用漏洞,CVSS 9.8 但补丁覆盖极不均衡
linux·运维·tcp/ip
xixingzhe22 天前
AI 对话打字机效果:SSE 和 HTTP 的区别与适用场景
网络·网络协议·http
叼烟扛炮2 天前
Linux 学习笔记(五十一):数据链路层与 ARP 协议——局域网寻址与黑客骗局
linux·网络·网络协议·php·tcpdump
沫璃染墨2 天前
从零入门计算机网络系列(十四):TCP报文与字节流本质——从数据封装到报文边界
linux·服务器·网络·网络协议·tcp/ip·tcp
byte轻骑兵2 天前
【LMP】规范精讲[13]: 参数的户口本、公钥的集装箱与出厂的兜底值
人工智能·网络协议·人机交互·lmp·蓝牙链路管理