线程和处理器

Threads and Processors

我目前正在学习多线程、线程、线程池等。我读到线程数不能超过您计算机的逻辑处理器数(或者至少没有优势,因为您的 CPU 无法处理更多)。

那么,如果您编写的代码在具有 12 个逻辑处理器的计算机上创建数百个线程,那么预期的行为是什么?他们排队吗?他们互相等待吗?或者它给你一个错误?如果您有一个进程可以从 100 个连续 运行 线程中获益,但只有 12 个内核,那么处理这个问题的最佳方法是什么?我经常打开我的任务管理器看到数百个进程和数千个线程运行。它是如何工作的?

另外,如果我 运行 一个程序在 Windows 中,还有一堆其他应用程序 运行(即 Chrome,MS Excel、Skype 等...),也许还有一堆后台服务(即 Windows Defender、Wifi 服务等...)这些其他应用程序是否占用逻辑处理器,从而减少数量我的线程程序可用的逻辑处理器数量?

如果所有线程只进行 CPU 繁重的计算,那么是的,拥有比 [=20 更多的线程没有多大意义(至少在性能方面,在架构上可能是好的) =].

但是,许多任务涉及 I/O,其中大部分时间花在等待某些设备 return 数据上。我的意思是 大多数时候 。轻松超过90%。在这种情况下,CPU 有别的事可做就好了。

Do they queue up? Do they wait for each other?

操作系统负责安排和跟踪它们。通常线程是时间片的,你也可以分配优先级。同样,一旦线程进入等待状态,OS 可以 运行 CPU 上的不同线程。

正如 Thilo 所暗示的那样,现代个人计算机在任何给定的时间段内都在不断地创建、执行和销毁数十个甚至数百个 threads/processes。 CPU 上实际处理的线程数不能超过逻辑核心数,但这并不意味着不能有更多的线程等待执行。

What is the expected behavior if you write code that created hundreds of threads on a computer with say, 12 logical processors?

如果我们假设用于创建这些线程的环境(框架、平台、语言、OS、硬件)可以支持多个并发线程,那么结果将是每个线程都是由操作系统根据可用内核的数量和这些线程相对于其他线程的优先级进行调度 运行 threads/processes。根据特定操作系统、工具集、程序类型(windows 上的内核模式/用户模式)和硬件 运行 代码,此行为可能会有很大差异。

附带说明一下,传统线程的使用成本很高,因为它迫使处理器进行上下文切换(刷新缓存、加载新上下文、执行)。在解决特定问题时,还有其他技术可以在一定程度上解决这个问题(例如 .Net 的任务并行库,或 C++ 的并行模式库)。

If you have a process that could benefit from 100 continuously running threads, but only have 12 cores, what is the best way to handle this?

这取决于手头的任务和您所处的工作环境。异步编程是计算机科学中非常的一个大课题,因此,有大量可用的技术和库 - 每个都有其优点和缺点。