go的多路IO
socket
客户端
服务端:bind accept
IO多路复用
- 多路是指 多个socket网络连接
- 复用是指使用一个线程来检查多个网络的连接的就绪状态
好处:解决了单线程处理多个IO操作时的阻塞问题。在需要处理大量并发IO的情况下,考研提升程序性能和相应速度。
IO模型
IO模型指同时操作Socket的方案
阻塞IO
- 同步读写Socket时,线程陷入内核态
- 当读写完成后,切换回用户态,继续执行
- 优点:开发难度小
- 缺点:内核切换开销大
非阻塞的IO
- 轮询所有的socket,直到Socket可以读写
- 优点:不会陷入内核态,自由度高
- 缺点:需要自旋轮询
多路复用 Linux Epoll(event poll 事件池)
- 注册多个socket事件
- 调用epoll,当有事件发生,返回事件列表
- 优点:提供了事件列表,不需要查询各个Socket
- 缺点:开发难度大,逻辑复杂
总结
- OS 提供了Socket作为TCP通信的抽象
- IO则是管理Socket的方案
- 在底层使用OS的多路IO
- 在协程层次使用阻塞模型
- 阻塞协程时,休眠协程
Epoll的抽象
- 新建多路复用器 epoll——create()
- 往多路复用器里插入需要监听的事件 epoll_ctl()
- 查询发生了什么事件 epoll_wait()
多路复用+阻塞模型
go的多路IO
http://example.com/2024/02/24/go的多路IO/