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