代码之家  ›  专栏  ›  技术社区  ›  Chinna

当应用程序在linux中使用poll()而不是epoll()时,调用将被路由到驱动程序

  •  1
  • Chinna  · 技术社区  · 9 年前

    使用时,应用程序调用被路由到驱动程序轮询方法 poll() 而不是与 epoll() 。有人能知道为什么会发生这种情况吗?下面是我的epoll应用程序代码。另一个观察结果是, epoll_ctl() 呼叫被路由到驾驶员,但没有 epoll_wait() .

    struct epoll_event ev, events[MAX_EPOLL_EVENTS];
    int epfd, nfds;
    epfd = epoll_create(MAX_EPOLL_EVENTS);
    ev.events = EPOLLIN | EPOLLET;
    ev.data.fd = fd; /* fd is an open file descriptor */
    if (epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &ev) == -1) {
        printf("epoll_ctl failed\n");
    }
    
    nfds = epoll_wait(epfd, &events, MAX_EPOLL_EVENTS, 10000);
    
    1 回复  |  直到 9 年前
        1
  •  1
  •   Arthur    9 年前

    轮询和epoll的实现是不同的。

    首先,我们知道 poll 的驱动程序总是调用 poll_wait() 这是这两个系统调用最重要的区别。

    轮询/选择

    这个 投票 每次从用户空间调用poll/select时,都会调用驱动程序的。它将当前进程添加到等待队列,并将等待队列添加到 poll_table .

    1. 用户空间轮询了2个不同的文件描述符
    2. 内核调用了每个文件描述符' 投票 驾驶员
    3. 这个 投票 已调用驱动程序 poll_wait 。它在 轮询表(_T)
    4. 假设他们也没有准备好。因此,在 poll table .
    5. 当文件描述符中的1个就绪时,它会唤醒进程。
    6. 唤醒的进程然后调用每个文件描述符' 投票 驱动程序再次检查哪个文件描述符已就绪。
    7. 最后,它回到了用户空间。

    环氧树脂

    这个 投票 的驱动程序仅由调用 epoll_ctl .

    1. 已调用用户空间 环氧乙烷 设置2个不同的文件描述符
    2. 内核调用了每个文件描述符' 投票 驾驶员
    3. 这个 投票 已调用驱动程序 轮询等待时间 。但这次 轮询等待时间 与轮询/选择不同。它不仅在 轮询表(_T) 还将回调函数更改为 ep_poll_callback 当进程被唤醒时。
    4. 假设他们也没有准备好。因此,现在在 投票表 .
    5. 当文件描述符中的1个就绪时,它会唤醒进程。
    6. 所以 ep_poll_回调 被调用。它将相应的文件描述符添加到 epoll
    7. epoll_wait 定期检查就绪队列并找到就绪队列。
    8. 最后,它回到了用户空间。