服务器 - 同步 I/O 多路复用(套接字)

Posted

技术标签:

【中文标题】服务器 - 同步 I/O 多路复用(套接字)【英文标题】:Server - Synchronous I/O Multiplexing (Sockets) 【发布时间】:2012-02-12 09:33:16 【问题描述】:

我在 C/Linux 中实现了一个使用 TCP 套接字的聊天服务器。它当前使用单个进程并使用 select() 来防止服务器阻塞。我读到 select() 是一个相当慢的方法,我希望将服务器升级到更高效的版本。

我目前正在研究 libevent,但我希望在设计快速服务器代码方面有经验的人能给我一些关于哪些是可用的最快技术的指示。 libevent 是一个可靠的选择还是我应该研究一些更好的东西?

非常感谢任何帮助!

【问题讨论】:

你应该看看github.com/joyent/libuv。 谢谢,我会调查的。你有什么理由喜欢这个软件吗? 它使用比libevent更快的libev,它是跨平台的,适用于windows,并且有点抽象。我没有在 C 中做过任何异步工作,所以没有经验。 您已经读过 select() 很慢 - 您的聊天服务器很慢吗?使用更快的技术真的会有什么不同吗? 【参考方案1】:

对于 Linux(仅)您可以使用 epoll,它在大多数情况下(但不是全部)更快。

epoll 的主要缺点是它仅在 Linux 操作系统上受支持(不可移植)。

总结一下,epoll 可以监控非常多的描述符,并且会返回那些发生变化的列表(无需传递所有原始描述符列表)。

【讨论】:

我会调查的。你的意思是 epoll 比 select() 快还是比 libevent 等库快?谢谢! epoll 最终是一个系统调用,它直接在内核上运行。图书馆可以使用 epoll、poll、select 或其他方式来执行他们的工作。显然,它们的开销很小,但这取决于您如何准确地看到开销。从积极的方面来说,一个库通常是可移植的,可以在多种架构/系统下使用,甚至允许从一种工具简单迁移到另一种工具……它是低级方法的抽象(如 epoll)。

以上是关于服务器 - 同步 I/O 多路复用(套接字)的主要内容,如果未能解决你的问题,请参考以下文章

I/O多路复用-EPOLL探索

非阻塞套接字与IO多路复用

select+异步

Linux IO多路复用

多路复用之selectepollpoll

异步 I/O 多路复用(套接字和线程间)