目录
关于网络编程和IO,结合实际开发经验,以下是我的总结:
一、网络编程实践
我确实在多个项目中应用过网络编程,典型场景包括:
-
HTTP服务器开发(Golang的net/http库)
-
WebSocket实时通信服务(配合goroutine实现高并发)
-
分布式RPC框架(基于TCP长连接+Protobuf协议)
-
物联网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);
// 内核完成读取后自动执行回调
三、关键概念对比
| 模型 | 阻塞点 | 用户态参与 | 适用场景 |
|---|---|---|---|
| 同步阻塞IO | 数据拷贝阶段 | 全程参与 | 低并发简单场景 |
| 同步非阻塞IO | 无阻塞点 | 轮询检查 | 需精细控制连接 |
| IO多路复用 |

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



