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

ops/2025/3/10 20:48:46/
http://www.w3.org/2000/svg" style="display: none;">

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 是最佳选择。


http://www.ppmy.cn/ops/164752.html

相关文章

nginx中upstream模块的使用。

upstream模块中的轮询算法 作用:将多台web服务器定义成一个upstream组,实现web服务的负载均衡。 后台的多个网站服务器,可以是多个不同的机器,也可以是多个不同的主机。 第一点:nginx在接受到客户端的访问请求后&am…

快手,蓝禾,得物,优博讯,三七互娱,顺丰,oppo,游卡,汤臣倍健,康冠科技,作业帮25届春招内推

快手,蓝禾,得物,优博讯,三七互娱,顺丰,oppo,游卡,汤臣倍健,康冠科技,作业帮25届春招内推 ①快手 【在招岗位】运营、市场、产品、战略分析、职能、工程、设计…

Elasticsearch如何删除字段

文章目录 1、问题描述2、案例讲解3、问题剖析4、解决方案4.1 注意:4.2 步骤:4.3 示例:4.3.1 创建一个新的索引4.3.2 reindex 重建索引4.3.3 恢复索引 5、彩蛋 & 坑5.1 坑5.2 使用 Pipline 6、总结 1、问题描述 在 Elasticsearch 中&…

uniApp实战二:仿今日相机水印功能

文章目录 1.最终效果预览2.页面实现 1.最终效果预览 2.页面实现 页面布局 <view click"handleTakePhotoNew">拍照</view><view v-if"!snapSrc"><canvas canvas-id"canvas" :style"{width:cvWidthpx,height:cvHeight…

利用可变参数模板,可打印任意参数和参数值。(C++很好的调式函数)

很酷的应用&#xff1a; &#xff08;1&#xff09; 如何获取可变参数名 代码例子&#xff1a; #define _test(...) (test_t(#__VA_ARGS__, __VA_ARGS__))template<typename... Args> void test_t(const char* names, Args... args) {std::cout << names <<…

C++20 中使用括号进行聚合初始化:新特性与实践指南

文章目录 1. 聚合初始化简介2. C20 中的括号聚合初始化2.1 指定初始化器&#xff08;Designated Initializers&#xff09;2.2 嵌套聚合初始化 3. 使用括号初始化数组4. 注意事项5. 实际应用场景6. 总结 在 C20 中&#xff0c;聚合初始化&#xff08;Aggregate Initialization&…

AI视频生成工具清单(附网址与免费说明)

以下是一份详细的AI视频制作网站总结清单&#xff0c;包含免费/付费信息及核心功能说明&#xff1a; AI视频生成工具清单&#xff08;附网址与免费说明&#xff09; 1. Synthesia 网址&#xff1a;https://www.synthesia.io是否免费&#xff1a;免费试用&#xff08;生成视频…

在Dify中访问Gemini等模型代理设置指南

问题背景 Google Gemini模型可纯免费使用&#xff0c;且性能也相当不错&#xff0c;一般个人使用或研究足够。但在在国内访问&#xff0c;需设置代理。在Docker部署Dify时&#xff0c;虽然按官方文档介绍设置代理环境变量&#xff0c;但实测发现并不生效。我们通过研究试验解决…