当前位置: 首页 > news >正文

应用层网络编程范式

前言

        在不考虑内核层的情况下,选用Linux底层支持的posix API和网络协议栈。对于应用层网络编程方案总结如下。其中主要针对两个角度:IO模型、编程模型。其中IO模型可参考Linux下IO模型,一般分为五种:阻塞IO、非阻塞IO、信号驱动IO、IO多路复用、异步IO。编程模型分为两种:同步编程、异步编程。其中对于IO模型不再赘述,对于编程模型而言,同步编程更好理解,开发效率更高。异步编程实现方式一般两种:线程池、回调函数。优点是为了提高效率,缺点也很明显开发时如果选用线程池则会带来开销,而回调函数在开发时难理解,且开发难度大,容易陷入“回调地狱”。针对上述两个角度介绍以下内容:

一、常用范式

  • 线程池 + 阻塞 I/O(BIO)

  • Reactor + epoll(同步非阻塞IO + 回调)

  • 原生io_uring + 回调

  • 协程(封装底层同步非阻塞I/O或异步I/O)

二、介绍

1. 线程池 + 阻塞 I/O (BIO)

  • I/O 模型:同步阻塞 I/O

  • 编程模型:同步(每个线程顺序执行阻塞操作)

  • 工作机制

    • 主线程 accept 连接,分发给 Worker 线程池。

    • 每个 Worker 线程阻塞read/write 上,处理单一连接。

  • 适用场景:低并发、CPU 密集型任务,或兼容性要求高的简单服务。

  • 性能瓶颈:线程数 ≈ 并发连接数,上下文切换开销大,无法应对高并发。

2. Reactor + epoll(同步非阻塞 I/O + 回调)

  • I/O 模型:同步非阻塞 I/O

  • 编程模型:异步(事件驱动 + 回调函数或状态机)

  • 工作机制

    • 单线程(或少量线程)运行事件循环,调用 epoll_wait 监听 I/O 就绪事件。

    • 事件就绪后,触发注册的回调函数处理数据(需主动调用非阻塞的 read/write)。

  • 优势:高并发支持(单线程处理万级连接)。

  • 缺点:回调地狱(Callback Hell),逻辑碎片化。

  • 代表:Netty (Java)、libevent (C)、Tornado (Python)

3. 原生 io_uring 的异步 I/O

  • I/O 模型:异步 I/O (AIO)

  • 编程模型:异步(回调或 Future/Promise)

  • 工作机制

    • 提交 I/O 请求(如 read/write)到内核队列(SQ),立即返回

    • 内核完成操作后,将结果放入完成队列(CQ),应用异步收割结果。

    • 无需应用再次发起数据拷贝调用(区别于 epoll)。

  • 优势:零拷贝、批处理、更低延迟(避免二次系统调用)。

  • 代表:Tokio(Rust, 可选后端)、liburing (C)

4. 协程(封装底层同步非阻塞I/O或异步I/O)

  • I/O 模型

    • 底层为 epoll同步非阻塞 I/O

    • 底层为 io_uring异步 I/O

  • 编程模型同步风格写异步代码

  • 工作机制

    • 协程在 I/O 等待时挂起(Yield),由调度器切换到其他就绪协程。

    • 底层仍依赖事件循环(epollio_uring)。

  • 优势:开发体验极佳(无回调地狱)、天然支持多核调度。

  • 代表

    • epoll 后端:Goroutine (Go)、asyncio (Python)

    • io_uring 后端:Tokio (Rust)、Glommio (Rust)

更多资料:0voice · GitHub

http://www.lqws.cn/news/575011.html

相关文章:

  • 现代 JavaScript (ES6+) 入门到实战(五):告别回调地狱,Promise 完全入门
  • Origin绘制复合子母饼状图—复合柱饼图、复合环饼图及复合饼图
  • 爬虫实战之图片及人物信息爬取
  • 【IQA技术专题】大模型视觉强化学习IQA:Q-Insight
  • 数据同步工具对比:Canal、DataX与Flink CDC
  • 第二届 Parloo杯 应急响应学习——畸形的爱
  • Mybatis的修改(update)操作
  • 【Linux庖丁解牛】— 文件系统!
  • cJSON 使用方法详解
  • 浅谈AI大模型-MCP
  • 机器学习在智能电网中的应用:负荷预测与能源管理
  • Nginx漏洞处理指南
  • Leetcode 3598. Longest Common Prefix Between Adjacent Strings After Removals
  • 第8篇:Gin错误处理——让你的应用更健壮
  • 【Typst】自定义彩色盒子
  • 【NLP 实战】蒙古语情感分析:从 CNN 架构设计到模型训练的全流程解析(内附项目源码及模型成果)
  • BP-Tools21.02下载 加解密利器 金融安全交易算法工具 PCI认证工具 金融和智能卡的数据加解密和数据转换工具
  • 无人机用shell远程登录机载电脑,每次需要环境配置原因
  • 06_注意力机制
  • (七)集成学习
  • git lfs 提交、拉取大文件
  • 【Linux高级全栈开发】2.4 自研框架:基于 dpdk 的用户态协议栈的实现
  • 华为云Flexus+DeepSeek征文 | 华为云 ModelArts Studio 赋能 AI 法务:合同审查与法律文件生成系统
  • M|艺伎回忆录
  • 从理论到实战:解密大型语言模型的核心技术与应用指南
  • (LeetCode 面试经典 150 题 ) 134. 加油站 (贪心)
  • 日语学习-日语知识点小记-进阶-JLPT-真题训练-N2阶段(5):2022年12月2023年7月
  • 通过HTTPS访问Harbor2.13.1 的配置
  • 1.认识Docker
  • #华为鲲鹏#华为计算#鲲鹏开发者计划2025#