每个连接线程模型有什么缺点?

问题描述:

其中Distributed Systems Prayer的分站:每个连接线程模型有什么缺点?

我实现了一个线程,每个连接模型

我对此声明有以下几个问题:

  1. 是什么这种模型在设计服务器/分布式系统时的缺点?
  2. 在大多数情况下,哪种方法更好?
  3. 在什么情况下它可能是正确的方法?
+0

1.可扩展性,虽然这样的系统已经建成可以处理100,000个连接,所以它确实不是它被描述的问题。这一个。 3.除最严重的以外所有。你的链接有趣但不科学。 – EJP

+0

线程过于昂贵,无法持续占用连续性,其延迟时间以毫秒为单位,通常只需要几秒钟即可完成服务。智能的做法是只在连接工作时才使用线程,IOCP就是这样做的方法。 –

设计 服务器/分发系统时,什么是这个模型的缺点是什么?

一个连接=一个线程。这会影响服务器的可伸缩性,因为连接数可能会大大超出系统的理想线程数。

什么办法将工作在大多数情况下更好?

执行者的线程池。为每个连接完成的任务(如果有)在池中排队,以fifo线程完成作业。

在什么情况下可能是正确的做法?

不知道任何情况下。

  1. 这个模型在设计服务器/分布式系统时有什么缺点?

如果您的实现语言对分配给该线程的堆栈大小施加了最小值,那么如果有大量连接,则会导致内存不足。同时创造许多短暂的线程也有成本。

对于尝试访问共享数据的许多线程,或者如果您的操作系统未将网络事件集成到线程唤醒中,您也可能遇到性能或可靠性问题。

  1. 在大多数情况下,哪种方法更好?

在它工作正常,大多数情况下 - 大多数系统有〜10000个并发客户足够的内存(在Windows或〜1000,如果你不打扰设置的线程的堆栈大小,并把它留给1MiB)。

可以使用异步事件驱动库来代替,它允许由N个线程组成的池来处理M个连接。只需使用线程池创建线程可节省创建线程的成本,但不会阻止大量客户端的内存不足。

  1. 在什么情况下它可能是正确的方法?

这几乎从来没有技术上的'最好'的方法,但有时使得实用的工程意义。

从历史上看,语言没有提供创建线程池或使用异步套接字的简单库。如果您使用的是这样的语言,并且不期望获得许多连接,并且连接会保持更长时间的连接,那么开发人员资源不值得投资技术更好的解决方案。