java - 服务器和线程模型

原文 标签 java c++ multithreading performance

我对以下概念感到困惑:
大多数书籍/文档都描述了多线程鲁棒的服务器,最常见的方法是启动一个新线程来为每个新客户端提供服务。例如。一个线程专用于每个新连接。但是,这在大型系统中实际上是如何实现的呢?如果我们有一个服务器接受来自100000个客户端的请求,那么它已经启动了100000个线程?这是现实的吗?服务器中可以运行多少个线程没有限制吗?另外,上下文切换和同步的开销是否会降低性能?它是队列和线程的混合实现吗?在这种情况下,队列数量是否固定?谁能对此有所启发,也许能给我提供一个很好的引用资料来描述这些内容?

谢谢!

最佳答案

常见的方法是使用线程池。线程池是已经创建的线程的集合。当一个新请求到达服务器时,它会从池中分配一个备用线程。处理请求后,线程将返回到池中。

池中的线程数是根据应用程序的特征配置的。例如,如果您有一个受CPU限制的应用程序,那么您将不需要太多线程,因为上下文切换会降低性能。另一方面,如果您具有绑定(bind)到数据库或IO的应用程序,则需要更多线程,因为要花大量时间等待。因此,更多线程将更好地利用CPU。

Google的“线程池”,您一定会找到很多有关该概念的知识。

相关文章:

java - 套接字未发送数据

c++ - 尖的物体失去了视野

multithreading - 如果FreeOnTerminate = true并在OnTerminate中引发异常,线程将如何处理?

c++ - 什么包含C++中的函数定义?

c# - 通过线程将表单显示为另一表单上的对话框

c++ - 如何终止或停止C++中的分离线程?

java - 从子上下文引用在父上下文中创建的Spring Singleton

java - 在Spring REST响应中隐藏/屏蔽 secret 数据

java - Spring Boot:使用Spring Data JPA读取数据返回不正确的值

c++ - Eclipse C++ : “Program ” g+ +“not found in PATH”