gpt4 book ai didi

multithreading - 线程休眠时的线程与内核

转载 作者:行者123 更新时间:2023-12-03 13:18:52 25 4
gpt4 key购买 nike

我希望确认我对线程和 CPU 内核的假设。

所有的线程都是一样的。不使用磁盘 I/O,线程不共享内存,每个线程只做 CPU 绑定(bind)的工作。

  • 如果我有 10 个内核的 CPU,并且我产生 10 个线程,每个线程将有自己的内核并同时运行。
  • 如果我使用具有 10 个内核的 CPU 启动 20 个线程,那么 20 个线程将在 10 个内核之间“任务切换”,从而为每个线程提供每个内核大约 50% 的 CPU 时间。
  • 如果我有 20 个线程,但其中 10 个线程处于休眠状态,并且 10 个处于事件状态,那么 10 个事件线程将以 100% 的 CPU 时间在 10 个内核上运行。
  • 休眠的线程只消耗内存,而不是 CPU 时间。当线程还在休眠时。例如,10,000 个都处于休眠状态的线程与 1 个处于休眠状态的线程使用相同数量的 CPU。
  • 通常,如果您有一系列线程在处理并行进程时经常休眠。您可以添加更多线程,然后再添加核心,直到达到所有核心 100% 时间都处于忙碌状态的状态。

  • 我的任何假设都不正确吗?如果是,为什么?

    编辑
  • 当我说线程处于 sleep 状态时,我的意思是线程被阻塞了特定的时间。在 C++ 中,我会使用 sleep_for至少在指定的 sleep_duration
  • 内阻止当前线程的执行

    最佳答案

    如果我们假设您正在谈论在现代操作系统中使用 native 线程支持实现的线程,那么您的陈述或多或少是正确的。

    有几个因素可能导致行为偏离“理想”。

  • 如果还有其他用户空间进程,它们可能会与您的应用程序竞争资源(CPU、内存等)。这将减少(例如)您的应用程序可用的 CPU。请注意,这将包括诸如负责运行桌面环境的用户空间进程等。
  • 操作系统内核会产生各种开销。发生这种情况的地方很多,包括:
  • 管理文件系统。
  • 管理物理/虚拟内存系统。
  • 处理网络流量。
  • 调度进程和线程。

  • 这将减少您的应用程序可用的 CPU。
  • 线程调度程序通常不会进行完全公平的调度。因此,一个线程可能比另一个线程获得更大百分比的 CPU。
  • 当应用程序的内存占用很大并且线程没有良好的内存局部性时,会与硬件进行一些复杂的交互。由于各种原因,内存密集型线程相互竞争并可能相互减慢速度。这些交互都被计为“用户进程”时间,但它们导致线程能够做更少的实际工作。


  • 所以:

    1) If I have CPU with 10 cores, and I spawn 10 threads, each thread will have its own core and run simultaneously.



    由于其他用户进程和操作系统开销,可能并非总是如此。

    2) If I launch 20 threads with a CPU that has 10 cores, then the 20 threads will "task switch" between the 10 cores, giving each thread approximately 50% of the CPU time per core.



    大约。有开销(见上文)。还有一个问题是,相同优先级的不同线程之间的时间切片是相当粗粒度的,不一定公平。

    3) If I have 20 threads but 10 of the threads are asleep, and 10 are active, then the 10 active threads will run at 100% of the CPU time on the 10 cores.



    大约:见上文。

    4) An thread that is asleep only costs memory, and not CPU time. While the thread is still asleep. For example 10,000 threads that are all asleep uses the same amount of CPU as 1 thread asleep.



    还有操作系统消耗CPU来管理 sleep 线程的问题;例如让他们休眠,决定何时唤醒他们,重新安排时间。

    另一个问题是线程使用的内存也可能是有代价的。例如,如果用于所有进程的内存总和(包括所有 10,000 个线程的堆栈)大于可用的物理 RAM,则可能存在分页。这也使用 CPU 资源。

    5) In general if you have a series of threads that sleep frequently while working on a parallel process. You can add more threads then there are cores until get to a state where all the cores are busy 100% of the time.



    不必要。如果虚拟内存使用不正常(即您正在大量分页),则系统可能不得不在等待从分页设备读取和写入内存页面时空闲一些 CPU。总之,你需要考虑内存利用率,否则会影响CPU利用率。

    这也没有考虑线程调度和线程之间的上下文切换。每次操作系统将核心从一个线程切换到另一个线程时,它必须:
  • 保存旧线程的寄存器。
  • 刷新处理器的内存缓存
  • 使 VM 映射寄存器等无效。这包括@bazza 提到的 TLB。
  • 加载新线程的寄存器。
  • 由于必须进行更多的主内存读取,以及由于先前的缓存失效而导致的 vm 页面转换,从而导致性能下降。

  • 这些开销可能很大。根据 https://unix.stackexchange.com/questions/506564/这通常是每次上下文切换大约 1.2 微秒。这听起来可能不多,但如果您的应用程序正在快速切换线程,那么每秒可能会达到很多毫秒。

    关于multithreading - 线程休眠时的线程与内核,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57000424/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com