【发布时间】:2019-11-21 20:02:50
【问题描述】:
我希望确认我对线程和 CPU 内核的假设。
所有的线程都是一样的。不使用磁盘 I/O,线程不共享内存,每个线程只做 CPU 绑定工作。
- 如果我有 10 个内核的 CPU,并且我生成 10 个线程,每个线程将有自己的内核并同时运行。
- 如果我使用具有 10 个内核的 CPU 启动 20 个线程,那么 20 个线程将在 10 个内核之间“任务切换”,为每个线程提供大约每个内核 50% 的 CPU 时间。
- 如果我有 20 个线程,但其中 10 个线程处于休眠状态,而 10 个处于活动状态,则 10 个活动线程将以 100% 的 CPU 时间在 10 个内核上运行。
- 休眠的线程只消耗内存,而不消耗 CPU 时间。当线程还在休眠时。例如,10,000 个全部处于休眠状态的线程与 1 个处于休眠状态的线程使用相同数量的 CPU。
- 一般来说,如果您有一系列线程在处理并行进程时经常休眠。您可以添加更多线程,然后再添加核心,直到达到所有核心 100% 时间都处于忙碌状态的状态。
我的假设是否不正确?如果是,为什么?
编辑
- 当我说线程处于睡眠状态时,我的意思是线程被阻塞了一段特定的时间。在 C++ 中,我会使用 sleep_for 至少在指定的 sleep_duration 内阻止当前线程的执行
【问题讨论】:
-
“睡着了”究竟是什么意思?他们在“sleep(...)”通话中吗?等待锁定或通知?等待 I/O?以上任何一种?
-
@StephenC 在我的情况下,我使用的是en.cppreference.com/w/cpp/thread/sleep_for 至少在指定的 sleep_duration 内阻止当前线程的执行。
-
所有假设对我来说都是正确的。
-
进程和线程调度是操作系统的一部分,所以你描述的行为真的取决于操作系统。
-
您可能正在与其他用户/系统进程...以及操作系统本身竞争 CPU/内核。
标签: multithreading