我对线程的理解是,在开始失去效率之前,每个核心只能有一个线程,两个带有超线程。
这台计算机有八个内核,所以应该最好用8/16个线程,但是很多应用程序使用了几次,尤其是Dropbox。
它在我的笔记本电脑上闲置时使用了95个线程,它只有4个核心。
为什么会这样?它是否有如此多的线程用于编程方便,我是否误解了线程效率还是其他完全不同的东西?
答案 0 :(得分:2)
我看了一下客户端的 Mac 版本,它似乎是用 Python 编写的,并且使用了多个框架。
大部分都是闲置的。
它看起来像是一个子系统的大杂烩,每个子系统都启动自己的线程,但在内存或 CPU 方面似乎并不太昂贵。
答案 1 :(得分:1)
我对线程的理解是,在开始失去效率之前,每个内核只能有一个线程,两个具有超线程。
不,这不是真的。我不知道你为什么这么认为,但事实并非如此。
作为证明它是错误的最明显的方式,假设您有一定数量的线程,其中一个访问了不在 RAM 中的内存页面,并且必须加载到磁盘。如果您没有任何其他线程可以运行,那么在从磁盘读取该内存页所需的整个时间里,一个内核都被浪费了。
如果不知道导致错误的推理链是什么,就很难直接解决这种误解。但最常见的情况是,如果您准备运行的线程多于您一次可以执行的线程数,那么您将需要进行大量上下文切换,而且上下文切换的成本很高。
但这显然是错误的。如果所有线程都准备好运行,则不需要上下文切换。仅当正在运行的线程停止准备运行时才需要上下文切换。
如果所有上下文切换都是自愿的,那么实现可以选择上下文切换的最佳次数。而这正是它的作用。
当且仅当大量线程执行少量工作,然后在其他等待线程准备运行时不再准备运行时,拥有大量线程会导致您失去效率。这会强制执行上下文,即使它不是最佳的。
一些使用大量线程的应用程序实际上会这样做。这确实会导致性能不佳。但 Dropbox 没有。