推荐星级:
  • 1
  • 2
  • 3
  • 4
  • 5

libevent的evmap文件描述符与事件的映射艺术.docx

更新时间:2026-10-07 10:26:41 大小:38K 上传用户:潇潇江南查看TA发布的资源 标签:libeventevmap文件描述符事件映射哈希表 下载积分:2分 评价赚积分 (如何评价?) 打赏 收藏 评论(0) 举报

资料介绍

libevent 的 evmap:fd 与事件的映射艺术

一个 fd 上可以挂多个事件

在 libevent 里,一个文件描述符上可能同时注册了多个事件。比如一个 socket,既注册了读事件,又注册了写事件,甚至可能有多个用途不同的读回调。当内核返回说这个 fd 可读时,libevent 需要找到所有挂在这个 fd 上的、关心读事件的事件对象,把它们全部激活。

这就是 evmap 要解决的问题。它是 libevent 内部一个非常关键、却常被忽视的数据结构。

evmap 是什么

evmap 是一个映射表,从文件描述符映射到事件列表。它的实现是一个哈希表(或双链表数组),key 是 fd,value 是一个链表,链接着所有注册在这个 fd 上的 event 结构。

当 epoll_wait 返回某个 fd 就绪时,libevent 通过 evmap 找到这个 fd 上注册的所有事件,再根据就绪的事件类型,把关注读的、关注的写的事件分别加入激活队列。

可以说,evmap 是事件循环"翻译"阶段的核心,它把内核返回的"哪个 fd 就绪",翻译成"哪些事件要激活"。

evmap 的工作流程

evmap 的工作贯穿事件注册和事件激活两个阶段。

在事件注册阶段,当调用 event_add() 时,会走到 evmap_io_add(),把 (fd, event) 对加入到 evmap 映射中。这样,这个 fd 上就登记了对应的读或写事件。

在事件激活阶段,当后端返回 fd 就绪后,libevent 查询 evmap,找到这个 fd 对应的所有事件,把关注对应事件类型的 event 插入激活队列。

所以 evmap 既负责"登记"(注册时),也负责"查询"(激活时)。

为什么需要 evmap

有人会问,为什么不直接把 fd 和 event 一一对应,非要搞个映射表?

因为一个 fd 上可能挂了多个事件。直接一一对应的话,就无法处理"一个 socket 同时可读又可写、且各有关心它的多个事件"的情况。


部分文件列表

文件名 大小
libevent的evmap文件描述符与事件的映射艺术.docx 38K

全部评论(0)

暂无评论

上传资源 上传优质资源有赏金

  • 打赏
  • 30日榜单

推荐下载