【问题标题】:How is epoll optimized by shared memory?共享内存如何优化epoll?
【发布时间】:2021-02-08 23:16:37
【问题描述】:

我看到epoll 比select 或poll 的优化之一是epoll 使用共享内存在用户空间和内核空间之间进行通信。 epoll是怎么做到的?

struct epoll_event events[MAX_EVENT_NUMBER];
...
while(1)
{
        int epcnt = epoll_wait(epfd, events, MAX_EVENT_NUMBER, -1);
        for(int i=0; i<epcnt; i++)
        {
            ....
        }
}
...

在我看来,假设 epoll 不使用共享内存。 epoll_wait 需要复制数据 -- events 数组,在用户空间和内核空间之间,每次循环两次。

但是,如果epoll 使用共享内存,内核需要创建一个共享块进行通信。那么在每次循环中,首先epoll_wait仍然需要将数据从共享块复制到用户位置。 shared block的数据修改后,还需要拷贝到用户空间,比如event的首元素地址。

所以,看来epoll 是否使用共享内存,复制数据的次数都是一样的。 epoll如何通过共享内存优化用户空间和内核空间的拷贝操作?

【问题讨论】:

    标签: c linux


    【解决方案1】:

    我不确定您所说的“共享内存”是什么意思。在 poll 和 epoll 中,内核将其结果复制到用户提供的缓冲区中。

    epoll 比 poll 更快的原因是因为 epoll 有一个文件描述符,并且该文件描述符可用于存储调用之间的状态(fd 列表)。

    使用 poll,每次等待时,内核都必须重新注册您正在等待的所有 fd,然后在将结果返回给用户空间之前取消注册它们。因此,对于在 m 个文件描述符上发生的 n 个事件,它需要 O(mn) 时间。但是使用 epoll 需要 O(m + n) 时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-30
      • 1970-01-01
      • 2014-03-22
      • 2014-10-08
      • 2014-04-20
      • 1970-01-01
      • 2016-05-08
      • 2021-06-15
      相关资源
      最近更新 更多