Skip to content

I/O多路复用

事件通知机制

step1:注册可读事件

step2:监听到可读数据

step3:通知数据可读

epoll_ctl与epoll_wait两种基本命令

epoll_ctl(epfd,op,fd,event) error:注册监听的fd和事件

epoll_wait(epfd,events,msec) (n int,err error):事件监听器,返回触发的事件events[:n]

BIO/NIO

blocking I/O(BIO)

当等待数据返回时,线程/协程阻塞。

non-bloking I/O(NIO)

使用多路复用器,保证所有线程都是在工作的。避免很多线程阻塞在等待读取数据。

go net-BIO式编程,连接量大时,协程数量过多,影响调度

维护连接池问题

在RPC场景下,通常在client端维护一个连接池。

使用go net,连接对象难以探活。只能通过写入时返回错误判断。

ET(边缘触发)/LT(水平触发)

ET(边缘触发):满足条件,只触发一次。需要在一次处理完所有数据

  • 轻量级的触发器

  • 并行I/O

  • 内存自由

LT(水平触发):满足条件,会持续触发。可以分多次处理数据

  • 主动触发器

  • 串行I/O

  • 主动内存管理

搭建Netpoll

设计poller

  1. 行为分析
  2. 定义抽象
  3. 具体事项