Multithreading 线程和处理器

Multithreading 线程和处理器,multithreading,threadpool,processors,Multithreading,Threadpool,Processors,我目前正在学习多线程、线程、线程池等。我已经读到,线程的数量不能超过计算机拥有的逻辑处理器的数量(或者至少没有优势,因为CPU不能处理更多) 那么,如果您编写的代码在一台有12个逻辑处理器的计算机上创建了数百个线程,那么预期的行为是什么呢?他们排队吗?他们互相等待吗?还是会给你一个错误?如果有一个进程可以从100个连续运行的线程中获益,但只有12个内核,那么处理这个问题的最佳方法是什么?我经常打开任务管理器,看到数百个进程和数千个线程正在运行。这是怎么回事 另外,如果我在Windows中运行一个

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

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


另外,如果我在Windows中运行一个程序,运行一系列其他应用程序(如Chrome、MS Excel、Skype等),或者运行一系列后台服务(如Windows Defender、Wifi服务等),这些其他应用程序是否占用逻辑处理器,因此减少了线程程序可用的逻辑处理器的数量?

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

然而,许多任务都涉及I/O,其中大部分时间都花在等待某个设备返回数据上。我是说大多数时候。很容易超过90%。在这些情况下,CPU最好有其他事情做

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


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

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

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

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

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

如果有一个进程可以从100个连续运行的线程中获益,但只有12个内核,那么处理这个问题的最佳方法是什么

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

相关: