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

网络I/O

目录

一、网络编程实践

二、IO核心模型解析

1. 阻塞IO(BIO)

2. 非阻塞IO(NIO)

3. IO多路复用(核心模型)

4. 信号驱动IO(较少使用)

5. 异步IO(AIO)

三、关键概念对比

四、生产环境经验

五、性能对比测试数据

六、select、poll、epoll 的区别是什么?

1. 历史和兼容性

2. 文件描述符数量限制

3. 事件存储和传递方式

4. 事件触发模式

5. 性能表现

6. 应用场景

七、其他资料

1、网络I/O (小林coding)

2、网络I/O (CS-Notes 面试笔记)


关于网络编程和IO,结合实际开发经验,以下是我的总结:

一、网络编程实践

我确实在多个项目中应用过网络编程,典型场景包括:

  1. HTTP服务器开发(Golang的net/http库)

  2. WebSocket实时通信服务(配合goroutine实现高并发)

  3. 分布式RPC框架(基于TCP长连接+Protobuf协议)

  4. 物联网MQTT消息服务(处理万级设备连接)

二、IO核心模型解析

IO的核心是数据在内存与外部设备(网络、磁盘等)的传输过程,主要分为五类:

1. 阻塞IO(BIO)
  • 特点:系统调用后线程被挂起,直到数据就绪

  • 代码示例:

sock.recv(1024)  # 线程在此阻塞
 
  • 缺点:1连接1线程,资源消耗大

2. 非阻塞IO(NIO)
  • 特点:立即返回结果,通过轮询判断就绪

  • 伪代码逻辑:

while(true) {
    if (socket.readable()) {
        readData(); // 实际读取
        break;
    }
}
 
  • 优点:单线程处理多连接

  • 缺点:CPU空转消耗资源

3. IO多路复用(核心模型)

通过单线程监控多个文件描述符:

系统调用 时间复杂度 最大连接数限制 触发方式
select O(n) 1024 水平触发
poll O(n) 无限制 水平触发
epoll O(1) 10万+ 水平/边缘触发可选

Go语言中的netpoll和Java NIO的Selector都是基于epoll实现

4. 信号驱动IO(较少使用)
  • 内核数据就绪时发送SIGIO信号

  • 需要处理信号回调,复杂度高

5. 异步IO(AIO)
  • 特点:内核完成所有操作后通知应用层

  • Linux原生AIO(libaio) vs Windows IOCP

  • 代码示例:

aio_read(sock, callback); 
// 内核完成读取后自动执行回调

 

三、关键概念对比


http://www.kler.cn/a/541702.html

相关文章:

  • 《DeepSeek大模型的微调和部署案例实操课程》
  • 【Java】Object类中的equals()和hashCode()
  • chromium-mojo
  • 不小心删除服务[null]后,git bash出现错误
  • innovus如何分步长func和dft时钟
  • sqli-lab靶场学习(六)——Less18-22(User-Agent、Referer、Cookie注入)
  • Linux之【网络I/O】前世今生(一)
  • 【DeepSeek】deepseek可视化部署
  • C++ Type Traits介绍
  • 厘米和磅的转换关系
  • 【C#零基础从入门到精通】(六)——C#运算符
  • 服务器有多少线程?发起一个请求调用第三方服务,是新增加一个请求吗?如果服务器线程使用完了怎么办?
  • 玩转适配器模式
  • Python 数据结构速成教程
  • 西安电子科技大学考研成绩2月24号即可查询,成绩查询入口:
  • 基于单片机的并联均流电源设计(论文+源码)
  • 微信小程序案例3——仿香哈菜谱微信小程序
  • linux统计文件夹下有多少个.rst文件行数小于4行
  • 正式开启Django之旅
  • 25年重庆省考报名流程详细教程
  • 11.swagger使用
  • 在win11下配置QT存在问题
  • 使用 Notepad++ 编辑显示 MarkDown
  • c++标准模板库(stl)vector和String
  • 项目场景拷打
  • 人工智能浪潮下脑力劳动的变革与重塑:挑战、机遇与应对策略