在单核系统上拥有多个线程还能提高性能吗?

Can having multiple threads on a single core system still improve performance?

我刚刚在 Java 学习了并行处理的基础知识。 我读到这个问题:Multiple threads and performance on a single CPU 并想知道是否还有其他原因可以解释为什么在单核系统上多线程可能比单线程更快。 我在想每个线程如何拥有自己使用的内存。 想象一下 Java FXML 是主线程的一部分。这可能会增加主线程内存的大小,进而可能会减慢线程速度,因为它必须在交换上加载更多值,或者更糟的是,必须对内存进行更多调用(我认为当前线程的值被复制到缓存)。

综上所述,在单核系统上做多线程可以提高性能吗?

在单个 CPU 上拥有多个线程在大多数情况下可以提高性能,因为在大多数情况下线程并不忙于计算,它正在等待事情发生。

这包括I/O,比如等待磁盘操作完成,等待数据包从网络到达,等待用户输入等,甚至一些非I/O情况,例如等待不同的线程发出事件已发生的信号。

因此,由于线程绝大部分时间都在等待,因此它们相互竞争 CPU 的频率远低于您的想象。

这就是为什么如果您查看现代台式计算机中的活动线程数,您可能会看到数百个线程,而如果您查看服务器,您可能会看到数千个线程。这明明比电脑的核心数多了很多,显然,如果没有好处,就不会这么做了。

单核上的多个线程不会提高性能的唯一情况是当线程忙于进行不间断的计算时。这往往只发生在特殊情况下,如科学计算、加密货币挖掘等。

因此,单核系统上的多线程通常会提高性能,但这与内存关系不大,而且在一定程度上与"separated"内存无关.

事实上,运行 多线程(在同一个内核上,甚至是同一个芯片上的不同内核上)主要访问不同的内存区域(而且它们大多这样做)倾向于 伤害 性能,因为每次 CPU 从一个线程切换到另一个线程时,它开始访问一组不同的内存位置,这些位置不太可能在 CPU' s 缓存,因此每次上下文切换后往往会出现一连串的缓存未命中,这代表了开销。但通常来说,还是值得的。