线程和处理器

时间:2016-04-19 23:55:45

标签: multithreading threadpool processors

我目前正在学习多线程,线程,线程池等。我已经读过,线程的数量不能超过你的计算机所拥有的逻辑处理器的数量(或者至少没有任何优势可以获得,因为你的CPU无法处理更多)。

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

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

2 个答案:

答案 0 :(得分:2)

如果所有线程只进行了CPU大量的计算,那么是的话,拥有比CPU更多的线程是没有意义的(至少在性能方面,在架构上可能是好的)。

然而,许多任务涉及I / O,其中大部分时间花在等待某些设备返回数据上。我的意思是大部分时间。轻松超过90%。在这些情况下,CPU可以做其他事情。

  

他们排队吗?他们互相等待吗?

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

答案 1 :(得分:1)

正如Thilo所暗示的那样,现代个人计算机在任何给定的时间段内都会永久地创建,执行和销毁数十个(如果不是数百个)线程/进程。在CPU上实际处理的线程数不能超过逻辑内核的数量,但这并不意味着没有更多的线程等待执行。

  

如果您编写的代码在具有12个逻辑处理器的计算机上创建了数百个线程,那么预期的行为是什么?

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

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

  

如果您的流程可以从100个连续运行的线程中受益,但只有12个核心,那么处理此问题的最佳方法是什么?

这取决于手头的任务和您正在使用的环境。异步编程是计算机科学中的一个非常重要主题,因此,有大量的技术和库可用 - 每个都有它的好处和退缩。