关于select epoll底层原理问题

发布于 2022-09-12 04:51:22 字数 245 浏览 15 评论 0

selectimage.png
如上图所说select poll是轮训方式来查看所有监听的socket,这里的意思是说调用了select poll后就死循环轮训所有要监听的socket集吗,那这样的话不是很蠢效率很低吗?这里epoll是说是用回调方式来检测就绪事件,意思是说epoll调用以后进程阻塞也也不做轮训 当某个socket有数据时通知调用epoll的进程唤醒吗?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

泪意 2022-09-19 04:51:22

对,是死循环。以 select 为例,源码的关键部分是:

for (;;) {
    unsigned long *rinp, *routp, *rexp, *inp, *outp, *exp;

    inp = fds->in; outp = fds->out; exp = fds->ex;
    rinp = fds->res_in; routp = fds->res_out; rexp = fds->res_ex;

    for (i = 0; i < n; ++rinp, ++routp, ++rexp) {
        // 省略代码
    }
    
    // 省略代码
    
    if (retval || timed_out || signal_pending(current)) {
        break;
    }
        
    if (table.error) {
        retval = table.error;
        break;
    }
}

所以说 epoll 效率比 select 高啊。

P.S. 其实效率低主要倒不是因为死循环,而是频繁的内核态和用户态切换。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文