java - 服务器和线程模型

标签 java c++ multithreading performance

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

谢谢!

最佳答案

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

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

谷歌“线程池”,您肯定会找到很多关于这个概念的资料。

关于java - 服务器和线程模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3543155/

相关文章:

java - 如何在 JAVA 中将 JSON 和文件传递给 REST API?

c++ - PointCloudLibrary (PCL) - 八叉树 - 获取 *branch* 节点内所有点的索引

java - 如何将 JSON 字符串转换为 GSON 对象?

java - 如何在log4j2中实现自定义模式布局

c++ - 将 exr/pfm 保存为小端

java - AspectJ 执行是线程安全的吗?

python - 使用 flask 的 socketio 扩展从线程发出

multithreading - 挂起的线程可以中止吗?

java - 使用 DocumentBuilderFactory 将文档转换为字符串?

c++ - 交替模板参数包