【发布时间】: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如何通过共享内存优化用户空间和内核空间的拷贝操作?
【问题讨论】: