【问题标题】:Maintaining many socket connections with a single thread使用单个线程维护多个套接字连接
【发布时间】:2009-11-18 08:43:19
【问题描述】:

我看到的许多关于套接字通信的教程似乎每个套接字使用 1 个线程。但是在用于在线游戏的服务器上,您可能有 10k 并发用户 - 10k 线程可能不是一个好主意。 我遇到了一个工具(SmartFox),它声称使用单个线程来监视所有套接字连接,可能有数千个。这个应用程序恰好是用 Java 编写的,但我认为 C++ 或 C# 可以做同样的事情......你将如何实现这一点?

【问题讨论】:

  • 很好的链接,我稍后会详细阅读。为什么您将此添加为评论,而不是答案?

标签: sockets tcp


【解决方案1】:

The C10K problem 谈到这个问题。

【讨论】:

    【解决方案2】:

    实现一个排队系统,其中一个线程轮询网络,x 个线程充当工作线程。您需要围绕使连接出队和排队的代码实现临界区

    【讨论】:

    • 啊,是的,那个老模式。一个明显的解决方案,考虑到我过去使用过它,我应该已经看到了。
    • 查看 java.nio.channels.Selector 以在轮询套接字的线程中使用。
    【解决方案3】:

    如果您使用 C++,请查看 boost::asio。

    当然,自己制作也很有趣。

    【讨论】:

      【解决方案4】:

      既然你提到了 C++...

      如果您使用的是 Windows 平台,那么您应该考虑 I/O 完成端口以获得这种可扩展性。 I/O 完成端口允许您使用少量线程在套接字(和其他设备)上执行异步 I/O,以服务数千个 I/O 操作(即连接)。

      其工作方式是 I/O 完成端口本质上是一个队列,但操作系统会优化线程的释放方式以处理该队列中的工作项,以防止一次释放太多线程并确保一个刚刚被使用过的线程更有可能再次被使用。请参阅此处:http://msdn.microsoft.com/en-us/library/aa365198(VS.85).aspx 了解有关 IOCP 的 MSDN 信息,请参阅此处:http://www.serverframework.com/products---the-free-framework.html 了解我在后台使用 IOCP 的免费客户端/服务器框架的源代码。

      作为可能的可扩展性示例,在这篇博文 (http://www.lenholgate.com/blog/2005/11/windows-tcpip-server-performance.html) 中,我详细介绍了我如何能够在只有 760MB 内存的 Windows Server 2003 机器上实现超过 70,000 个并发连接。

      请注意,C# 异步套接字操作在后台使用 IOCP。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多