我有几个小问题。
首先,多线程和多核之间有区别吗?它们是完全不同的两个东西,还是多线程在需要时使用多个内核?
其次,大多数内核都有两个线程,但是在分析我的应用程序时,我注意到许多不同的线程,从线程 128 到线程 3460。是什么决定了您的计算机有多少线程?
谢谢
我有几个小问题。
首先,多线程和多核之间有区别吗?它们是完全不同的两个东西,还是多线程在需要时使用多个内核?
其次,大多数内核都有两个线程,但是在分析我的应用程序时,我注意到许多不同的线程,从线程 128 到线程 3460。是什么决定了您的计算机有多少线程?
谢谢
首先,多线程和多核之间有区别吗?
是的。
多线程和多核是适用于不同计算领域的不同术语。
多核是指具有多个逻辑 CPU 内核并且可以同时物理执行多条指令的计算机或处理器。计算机的“核心数”是计算机拥有的核心总数:计算机可能有多个处理器,每个处理器可能有多个核心;核心数是所有处理器上的核心总数。
多线程是指可以通过同时在多个内核上运行来利用多核计算机的程序。一般来说,两倍的内核等于两倍的计算能力(对于支持多线程的程序),尽管有些问题受到 CPU 使用率以外的因素的限制;这些问题不会从多线程中获得如此巨大的收益。
需要注意的是,性能并不是程序使用多线程的唯一原因。稍后再谈。
它们是完全不同的两个东西,还是多线程在需要时使用多个内核?
它们是相关的,但又是分开的。
如果多个内核可用,支持多线程的程序可以使用多个内核。
大多数内核都有两个线程,但在分析我的应用程序时,我注意到许多不同的线程,从线程 128 到线程 3460。
操作系统分配线程编号,以便跟踪它们。
您将运行的大多数程序都不需要同时运行 3400 个线程。此外,正在运行的线程将消耗所有内核。您的 CPU 不能一直 100% 运行的唯一原因是操作系统知道如何暂停处理器,这基本上使它停止一切并等待发生某些事情(例如 IO 事件或时钟滴答声)。一次只能在一个内核上运行一个线程。不同的线程运行实际上只是线程跳到CPU上并运行了很短的时间,然后被其他也需要运行的线程切换出去。
是什么决定了您的计算机有多少线程?
所有进程中的线程总数。此外,大多数操作系统都施加了一个硬限制,即不能超过的现有线程的最大数量。
一个进程就是一个程序(你可能知道这一点)。多线程是每个进程拥有多个线程的过程(许多进程不会创建多个线程,因为它们不必这样做)。Windows 对您可以创建的线程数没有硬性限制(至少自 XP 以来没有。不会对 w98 和以前的版本说任何话),但是您可以创建的线程数当然受到内存量的限制你有。
您说某些程序出于性能以外的原因使用多个线程。
有时能够多任务处理是件好事,即使不是同时处理。
有时程序需要在特定时间做特定的事情。一个经常被引用的例子是一个带有可见窗口的程序。该程序可能会进行密集的后台数字运算,但如果它仍然可以响应用户事件(例如单击按钮和调整其大小),它将使它受益。这可以通过异步处理来完成,这将需要你的一个线程每隔一段时间重复检查 GUI 工作,暂停它正在做的事情,并处理一段时间的 GUI。很多事情都是这样做的。
另一种可能更好的处理方法是使用线程。您的程序不必担心在数字运算和 GUI 管理之间来回切换,操作系统会为您管理。即使您只有一个内核,您仍然可以运行多个线程,并且您的操作系统将尽最大努力确保所有正在运行的进程中的所有正在运行的线程都获得它们公平的 CPU 时间份额。
核心数和线程数是解耦的。您可以在单个内核上运行多个线程,并且尽管存在更多内核,但您可能会遇到只有一个线程运行的情况(尽管我无法想到会发生这种情况的现实生活场景)。假设多核是一种硬件特性,而线程数是操作系统域和在其上运行的进程的一部分。
当然,对于单核,您不能同时运行多个线程。操作系统必须不断地在线程之间来回切换。
大多数内核有两个线程
在这里,我认为您混淆了重载术语“线程”。正如其他答案正确指出的那样,线程通常指的是“软件”概念。但有时它也被用作“硬件”概念。当一个“核心”有两个“线程”时(就像在许多新的英特尔芯片中一样),这意味着核心可以运行两个并行线程,就好像有两个核心一样。然而,这通常称为超线程。看:
http://en.wikipedia.org/wiki/Hyper-threading
因此,如果您有 N 个线程(我的意思是软件线程,在您的应用程序中创建的,或者只是通过同时运行不同的应用程序)和 M 个处理器(作为内核,或上面解释的硬件线程),会发生以下情况:
单核上的线程通常意味着您可以创建 x 个线程,并且每个线程都将被赋予设定的运行时间(线程量子)。当线程切换时,这称为上下文切换,所有这一切都需要一些时间,因此需要进行一些基准测试以找到每个内核具有的理想线程数。
如果大部分工作都受 CPU 限制,那么产生数百个线程就没有什么意义了,因为这不太可能提高性能(实际上可能会使情况变得更糟,记住上下文切换不是免费的)。然而,为 I/O 绑定的工作执行此操作可能会有所帮助,因为当系统忙于执行此工作时,可以为另一个线程分配 cpu 时间。
拥有额外的物理内核意味着两件事可以在硬件级别真正并行运行。