diff --git a/notes/Socket.md b/notes/Socket.md index 48d65ed3..56cbad75 100644 --- a/notes/Socket.md +++ b/notes/Socket.md @@ -234,6 +234,8 @@ epoll_ctl() 用于向内核注册新的描述符或者是改变某个文件描 从上面的描述可以看出,epoll 只需要将描述符从进程缓冲区向内核缓冲区拷贝一次,并且进程不需要通过轮询来获得事件完成的描述符。 +

+ epoll 仅适用于 Linux OS。 epoll 比 select 和 poll 更加灵活而且没有描述符数量限制。 diff --git a/notes/pics/epoll.png b/notes/pics/epoll.png new file mode 100644 index 00000000..2f01bd30 Binary files /dev/null and b/notes/pics/epoll.png differ diff --git a/tools/diagram/src/epoll.svg b/tools/diagram/src/epoll.svg new file mode 100644 index 00000000..b2f5a904 --- /dev/null +++ b/tools/diagram/src/epoll.svg @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + select / poll 与 epoll + + select / poll + + + 用户进程 + + 用户态 + 内核态 + + epoll + + + 用户进程 + + 用户态 + 内核态 + + 每次调用复制 + 全部描述符 + + + 遍历全部描述符 + 检查是否就绪 + + 返回后进程 + 再遍历一次 + 每次调用都是 O(N) + + epoll_ctl() + 注册一次 + + + + + + + + + + + + 红黑树:已注册描述符 + + + + + + 就绪链表 + + 就绪时回调 + + epoll_wait() + 只取就绪的 +