【问题标题】:Is there a limit to how many threads I can make我可以制作的线程数是否有限制
【发布时间】:2012-07-27 12:00:29
【问题描述】:

好的,所以我用 标记了这个问题,因为我主要考虑它,因为这是我目前正在编写的语言。然而,这在编程世界中同样普遍。

我的问题是:处理器可以处理的线程数是否有任何限制,以及我的应用程序达到此限制的可能性有多大?如果我这样做会怎样?

我对线程知之甚少 - 我只知道它们使您能够同时执行两个进程(这甚至可能不是正确的术语)。最初,我认为单核处理器不允许多线程,但后来常识开始了,我想在 Windows 和其他东西的情况下这是不可能的。但是现在我想知道,单核和多核处理器有什么区别/多核处理器允许什么?

非常感谢以最简单的术语进行解释。提前致谢

【问题讨论】:

  • 我想这对于每个 CPU 都会有所不同,我建议创建越来越多的线程并监控你的 cpu 的反应。您的 CPU 可能一次只能运行几个线程,但上下文切换的速度将是其效率的真正衡量标准。

标签: java java multithreading


【解决方案1】:

处理器通常可以一次运行一个线程。然而,它处理远不止这些。当您有多个进程在运行时,您的处理器会非常快速地在它们之间切换,从而为每个进程提供处理器时间的一部分。这给人一种并发的错觉,但实际上一切都是串行发生的。

您可以运行的线程数量并没有真正的硬性限制,但是当处理器在线程之间切换时会产生开销。如果您正在使用 GUI 构建应用程序,最好为长时间运行的任务生成一个单独的线程,以便 GUI 可以保持响应。如果您希望在具有多个处理器或其他允许真正并发的解决方案的计算机上运行,​​您可以尝试通过在单独的线程中运行来利用它,但这确实会使您的问题更加复杂并且可能导致难以解决的错误追踪。

当今大多数计算机都是多核的,实际上可以同时运行多个线程。事实上,更多的并发性,而不是更强大的单个处理器,很可能是计算机未来的发展方式。能够利用这一点 很重要,但也很难。如果您没有特定的理由让您的应用程序成为多线程的,我建议您避免使用它,直到您觉得这样做为止。

【讨论】:

  • 非常感谢您的回答 - 非常有用。我问这个问题的全部原因是因为我有一个更新 GUI 的递归方法,但我发现如果我消除 GUI 位,我至少可以节省一半的时间,所以我希望把GUI 位在一个单独的线程中。而且我认为我有足够的信心这样做!
【解决方案2】:

在 Java 中,当您用完内存来处理线程时,您将达到创建线程的限制。我在 2GiB 的 RAM 上花了大约 10,000 来完成这项工作。一旦你点击了OutOfMemoryException,你就会遇到问题,除非你已经打开了一个 shell/任务管理器,因为你可能会努力杀死 JVM 进程。

就处理器而言,它们一次只能运行 1 个(或 2 个)每个内核。调度程序(操作系统的一部分)的工作是分配时间,因此线程 A 将运行一点点,然后是线程 2 等。通过这种方式,它们允许您一次执行多项操作。如果您有一个多核 cpu,调度程序还将负责分配哪个线程到哪个核,让您可以毫不费力地利用这一点。

一般来说,您不必为此担心太多。当您需要同时处理事物时,只需创建多个线程(例如,GUI 代码必须在后台任务发生时继续处理)。大多数应用程序都有

【讨论】:

  • '大多数应用程序都有
  • 也非常感谢您的回答 - 它的信息量太大了。
【解决方案3】:

处理器可以处理的线程数是否有限制,

它只能运行一两个(使用超线程)。一些 sparc 处理器最多可以处理 16 个。

在考虑创建大量线程时值得记住这一点,因为创建更多线程可能效率低下(尤其是如果进程受 CPU 限制)

我只知道它们使您能够同时执行两个进程

一个“进程”包含一个或多个线程。即“过程”具有特定含义。

单核和多核处理器有什么区别/多核处理器允许什么

多个核心可以同时运行多个线程。单个核心可以模拟运行多个线程(足够快你不会注意到)

如果您有足够的线程来使用所有内核,您就可以实现吞吐量的线性提升。例如如果您可以使用一个核心每秒处理 10,000 个请求,那么您可能可以使用 8 个核心每秒处理 80,000 个请求。

【讨论】:

  • “一个“进程”包含一个或多个线程。即一个“进程”具有特定含义。”不完全正确。在 Linux 中(我假设其他 *Nix 系统)每个线程都是它自己的进程(尝试创建一些然后运行 ​​top
  • @PeterLawrey 那个观点已经改变了,我记得有一次线程没有被分组到它们的父进程中。但是如果你在使用 top 时按“H”,你应该可以看到线程。
  • 不幸的是,不同的作者对进程和线程这两个术语的处理方式不同。好像他们认为并发还不够复杂......
  • @Andy 我知道并没有真正的“真实”定义,你能做的最好的事情就是把这个词放在上下文中以明确含义。
  • @JacobRaihle 好的,谢谢。我确实发现以下顶部有很多有用的链接和答案:social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/…。基本上,进程就像线程的容器。一个进程中可以有多个线程共享相同的内存。
【解决方案4】:

我想你知道只有少量(取决于处理器)线程可以真正运行并发。但我想你问的是总共可以处理多少个线程(并且不时切换)。

我认为线程的总数可能有一个限制(取决于操作系统和使用的硬件),但你肯定不会达到这个最大值。之前,您会遇到大量的性能问题,因为(从特定数量的线程开始)更多的线程不会带来更多的性能,而是相反。

然而,这条线,从那里你不会通过更多的并行度获得更多的性能是不是你的核心数量,而是可以高出两到四倍。

【讨论】:

  • '之前,您会遇到大量的性能问题,因为(从特定数量的线程开始)更多的线程不会带来更多的性能,但相反' - 仅适用于 CPU-bound 线程,其中每个线程操作的数据集需要大量的缓存刷新。在典型的桌面系统上,例如。我现在正在使用的,在总共 1072 个线程中,我有 0 个线程处于该状态。
  • 感谢您的回答@aRestless。我想我明白你在说什么!
【解决方案5】:
Is there any limit to how many threads a processor can handle?

1) 您的计算机可以同时执行与可用 CPU 中的内核一样多的 RUNNING 线程。

2) 如果需要执行的线程数多于内核数,则操作系统会应用调度算法来决定在任何进入操作系统的硬件中断或系统调用并更改需要执行的线程集后运行哪一组线程.

3) 未运行/准备运行的线程,即。正在等待 I/O 或彼此,只是虚拟内存中的死代码/堆栈空间,因此不会产生直接开销。

总结:

处理器可以处理的运行线程的限制与核心数相同。

操作系统/内存系统限制任何状态下的线程总数。

【讨论】:

  • 也感谢您的回答,一个很好的总结。虽然,其他一些人认为每个核心可以处理“一个(或两个)”线程,而您只说一个核心可以处理一个。这是为什么呢?
  • @Andy 较新的处理器具有超线程。虽然我不了解细节,但它有效地让你的处理器表现得像它的核心数量是实际数量的两倍。例如,一个普通的英特尔 i3 处理器有 2 个物理内核,您会期望它运行 2 个线程。但是,由于超线程,它可以运行 4 个。它甚至在操作系统看来是 4 个内核(例如,当在系统监视器中查看时),每个内核都可以独立运行。但是,对于普通的应用程序开发人员来说,这又不是什么值得担心的事情。
  • @James 感谢您提供的信息。我会查找超线程
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-21
  • 1970-01-01
  • 1970-01-01
  • 2021-06-25
  • 1970-01-01
相关资源
最近更新 更多