0

假设应用层协议是通过 UDP 实现的。需要客户端超时,因此服务器需要保持与之对话的每个客户端的状态。

也假设select被使用。

  1. 实现多线程服务器总是最好的吗?我认为链接列表也会这样做,其中 server timeout time=Earliest Timeout of a client- CurrentTime。链接列表将具有与保持客户端状态相同的功能,同时避免创建新线程的开销(尽管为服务器引入了一些复杂性来维护特定于客户端的超时)。

  2. 如果选择多线程,那么为新客户端调用新套接字是否最好?这将引入系统资源开销。但我认为默认服务器套接字(bind具有服务器众所周知的端口)会做同样的事情,因为它有缓冲区(嗯..对于可扩展的客户端数量来说可能不够长..)

谢谢!

4

4 回答 4

2

以我的经验,当可怕的同步问题潜伏时,线程让你的代码看起来很容易逻辑和干净,等待一些事件以正确的顺序发生,导致应用程序崩溃。线程是一个非常有用的工具——如果你的应用程序能够充分利用你的 CPU,你需要考虑线程,学习使用线程是学习利用分布式处理的一步(至少, 我认同)。

我的偏好是使用异步回调而不是阻塞调用来编写应用程序,并明确指示我想使用哪个线程来处理回调。这具有以下优点:

  • 它使状态变量交互更加可控,因此可预测,这意味着线程更加健壮。
  • 如果操作正确,它可以充分利用 CPU 拥有的处理器数量。
  • 它允许您直接控制要赋予某些函数的优先级-如果此函数是高优先级的,则将其分派给高优先级线程,然后在完成时将结果发送回低优先级调用者通过调用者线程的延续。或者到另一个线程 - 没有理由限制这一点。
  • 通常可以移植到非线程环境。也许对大多数人来说并不重要,但有时对我来说很重要。

于 2010-01-29T20:43:53.307 回答
1

我不会提出任何不在 Aidan Cully 答案中的新内容,但是,请看一下 Apache 的多处理模块背后的理论:http ://www.linuxquestions.org/linux/answers/Networking/ Multi_Processing_Module_in_Apache

In essence, the server is split into multiple modules and threads/processes are created to manage connections, depending on need and configuration options - it sounds like the balance described in Aidan's answer although the Apache implementation may differ slightly.

于 2010-01-29T20:50:31.603 回答
0

链接列表不会扩展。

在服务器端使用链表逐一检查客户端并满足他们的需求对于 5 到 10 个客户端来说都很好。但是当你有 100 个时会发生什么?1000?如果一个客户的请求需要很长时间来处理会发生什么?

线程不只是为单个客户端提供维护状态的方法。它们还提供了一种在所有客户端上同时“分配服务器资源”的方法。就好像每个客户端都有自己的专用服务器,(几乎)没有队列:客户端想要一些东西,它询问服务器,服务器回复。它是瞬时的。

另外,使用链表方法可能会浪费宝贵的资源。如果所有客户除了一个客户什么都不想要怎么办?您将重复循环超过一百个客户端,除了浪费 CPU 周期之外什么都不做,直到遇到确实需要服务器注意的客户端。

于 2010-01-29T20:26:06.203 回答
-1

多线程绝对不是必须的,因为您已经提出了替代方案。我们不能像往常一样使用绝对值或从不使用绝对值,因为每种情况都有独特的要求和约束。

是的,为每个连接添加一个新的线程/套接字会消耗更多的资源。听起来您需要很好地定义您需要多少连接。然后你可以确定你是否有足够的资源。

如果资源限制不是问题,我会选择更简单的解决方案。与编写新的功能体(链表建议)相比,使用您已经拥有的工具(即处理线程和套接字的经过良好测试的函数)更容易吗?代码维护呢?如果将来有其他程序员从事这个项目,他们是否更容易理解使用他们已经熟悉的标准操作系统调用或链表的实现?

于 2010-01-29T20:17:13.133 回答