🎯epoll

type
status
date
slug
summary
tags
category
icon
password
Blocked by
Blocking
AI summary

IO 多路复用是什么

多路:存在多个需要处理的io event的fd
复用:复用一个loop thead 同时为多个fd提供服务

多路复用技术分类

linux内核提供了三种经典的多路复用技术
notion image
 

select

  1. 一次可以最多处理1024个 fd
  1. loop thread 通过select 将一组fd提交到内核中,做监听
  1. 当fd 中无io event 就绪时,loop thread 陷入阻塞
  1. 当这组fd 有io event到达时,内核会唤醒loop thread
  1. 其中,loop thead 无法精确感知哪些fd为 就绪,需要遍历一轮fd列表,时间复杂度为O(N)
 

epoll

  1. 可以处理的fd没有上限
  1. loop thead 通过epoll_create 创建一个epoll池子
  1. loop thread 通过epoll_ctl 每次将一个待监听的fd添加到epoll的池子中
  1. 每当fd列表中有fd就绪事件时,会唤醒loop thread,这个过程是事件通知的形式,无需额外的遍历
 
 

epoll涉及的函数

  1. epoll_create:在内核开辟空间,创建一个 epoll 池子用于批量存储管理 fd,后续可以通过 epoll_ctl 往池子中增删改 fd.
  1. epoll_ctl:在某个 epoll 池子中进行一个 fd 的增删改
  1. epoll_wait:从对应 epoll 池子中获取就绪的 epollevent
 
epoll池是使用linux内核的红黑树(red-black tree,一种自平衡二叉查找树),保证了所有增、删、改操作的平均时间复杂度维持在 O(logN) 的对数级水平
 
 
主要优势
  1. 拆解构池接口epoll_create和入池接口 epoll_ctl,实现fd一次拷贝,多次服用
  1. 通过红黑树池子维护fd数据,增删改查平均复杂度为0(logN)
  1. 精准事件回调,准确告诉loop thread 具体哪些fd已就绪,减少了一次额外的遍历操作,时间复杂度由O(N)优化到了O(1)
 
本质:
  1. 减少用户态和内核态之间文件句柄的拷贝
  1. 减少对可读可写文件句柄的遍历
 
 

红黑树 TODO

 
 

ref

 
 
Prev
Golang map
Next
Golang GMP模型
Loading...
Article List