go的多路IO

socket

客户端

服务端:bind accept

IO多路复用

  • 多路是指 多个socket网络连接
  • 复用是指使用一个线程来检查多个网络的连接的就绪状态

好处:解决了单线程处理多个IO操作时的阻塞问题。在需要处理大量并发IO的情况下,考研提升程序性能和相应速度。

IO模型

IO模型指同时操作Socket的方案

阻塞IO

image-20240224215049368

  • 同步读写Socket时,线程陷入内核态
  • 当读写完成后,切换回用户态,继续执行
  • 优点:开发难度小
  • 缺点:内核切换开销大

非阻塞的IO

image-20240224215333997

  • 轮询所有的socket,直到Socket可以读写
  • 优点:不会陷入内核态,自由度高
  • 缺点:需要自旋轮询

多路复用 Linux Epoll(event poll 事件池)

image-20240224215717352

  • 注册多个socket事件
  • 调用epoll,当有事件发生,返回事件列表
  • 优点:提供了事件列表,不需要查询各个Socket
  • 缺点:开发难度大,逻辑复杂

总结

  • OS 提供了Socket作为TCP通信的抽象
  • IO则是管理Socket的方案

image-20240224220620165

  • 在底层使用OS的多路IO
  • 在协程层次使用阻塞模型
  • 阻塞协程时,休眠协程

Epoll的抽象

  • 新建多路复用器 epoll——create()
  • 往多路复用器里插入需要监听的事件 epoll_ctl()
  • 查询发生了什么事件 epoll_wait()

image-20240225082722039

多路复用+阻塞模型


go的多路IO
http://example.com/2024/02/24/go的多路IO/
作者
Forrest
发布于
2024年2月24日
许可协议