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
- 行为分析
- 定义抽象
- 具体事项