如果有一个cpu核心和两个非阻塞不退出的线程,每个线程每次可以占用多长时间的cpu时间?

Posted

技术标签:

【中文标题】如果有一个cpu核心和两个非阻塞不退出的线程,每个线程每次可以占用多长时间的cpu时间?【英文标题】:if there are one cpu core and two threads with non-blocking and non-exit, how long cpu time each thread could occupy each time? 【发布时间】:2017-10-13 07:04:39 【问题描述】:

我的问题的更多细节:

系统平台是linux(mac),线程任务是非阻塞循环的。假设只有一个cpu核心,当有两个线程时,一个线程每次可以占用多长时间的cpu时间。当线程号增加时,分配给每个线程的 cpu 时间如何变化。

|------------------ one cpu time of one thread ---------------------|
|-context switch time -|----------- user code running time----------|
|------------A---------|--------------------B-----------------------|

经验表明,线程数过大时性能会逐渐下降。我认为性能可能受 A/B 值的影响(A 代表上下文切换时间,B 代表用户代码在线程的一个 cpu 时间片中运行的时间)。所以如果我们知道线程数增加时cpu时间片是如何变化的,我们就可以知道我们系统的性能。

我想真正了解cpu时间分配,有人可以推荐一些关于这方面的好读物或书籍。

【问题讨论】:

How long cpu time each thread could occupy each time? - 这取决于调度程序策略。调度是一个广泛的主题。 Linux 调度程序策略在 x86、arm 等大多数硬件平台上是否不同?还是取决于硬件性能? 【参考方案1】:

事实一:CPU时间未分配,内核周期性踢出拒绝释放CPU的busy-looping进程

有一个硬件以固定间隔产生中断,该中断称为定时器中断或tick。只有当 tick 到达时,内核才有机会检查当前正在运行的进程是否占用过多的 cpu 资源。如果没有中断触发,进程将永远控制cpu,不会有任何其他代码可以运行的机会。

事实 2:设计良好的程序总是在无事可做时释放 CPU。

有几个函数或系统调用可以释放 CPU 资源。例如。 selectepoll_wait、阻塞读/写、wait_pid 和我最不喜欢的sleep(我编写了数百万行代码,sleep 除了在测试用例中从未使用过)。

调用这些函数会释放CPU资源,然后内核可以将CPU调度给其他进程。

事实3:当所有进程都无事可做并释放CPU时,内核会将CPU置于低功耗模式,功耗低,发热量少。

在 X86 架构中,内核会使用halt 指令将 CPU 置于低功耗模式,这实际上会交给 CPU,如果没有中断到来,CPU 将永远挂起。 (在tickless模式下,如果没有进程处于活动状态,则tick将被禁用,如果没有网络、硬盘、键盘/鼠标输入或任何中断到达,CPU将永远挂起,这样可以节省电池)

事实 4:单个忙循环进程会将单个 CPU 核心使用率提高到 100%

事实 5:简单的忙循环过程不会导致 CPU 产生大量热量

没有 I/O 的简单循环,很少的内存访问(非常低的缓存未命中),很少的分支,还不错。您可以在每个内核尝试一个for (;;) 循环,发现您的 CPU 风扇仍在休息。因为它只使用了芯片中很少的门。

游戏通常以 60fps 运行,一帧为 1s/60 = 16ms。典型的 CPU 周期为 10-50ms,如果游戏释放 CPU,不保证会在接下来的 16ms 内重新获得 CPU。所以游戏通常会运行一个简单的循环,不断检查高精度时钟以更准确地实现帧率。这就是为什么游戏总是占用 100% 的 CPU,不管你的盒子有多强大。

事实 6:在现代系统中,几个繁忙循环的进程不会挂起、冻结、减慢您的系统

调度器会提高设计良好的主动释放CPU资源的进程的优先级,并降低busy-looping进程的优先级。在现代系统中,响应您的键盘/鼠标输入或 ssh/bash 需要不到 1% 的 cpu 资源,因此处理用户输入的进程可以轻松击败繁忙循环的进程并控制 CPU 资源。

希望这些可以帮助您了解调度程序的工作原理

【讨论】:

谢谢~,很清楚内核调度器的工作原理了。而“典型的 CPU 周期是 10-50 毫秒”绝对是我想知道的。 我还有一个问题。当线程数增加时,CPU周期(tick period)是否改变以及如何改变? 优秀的总结。我见过的最好的答案之一。 你说游戏通常一直保持cpu以达到准确的帧率,为什么它没有按tick退出。如果被踢了,到下一次得到cpu的时间间隔就像是主动释放cpu一样。 @Panda 如果所有其他进程都没有很常见的东西,内核不会费心去踢它。

以上是关于如果有一个cpu核心和两个非阻塞不退出的线程,每个线程每次可以占用多长时间的cpu时间?的主要内容,如果未能解决你的问题,请参考以下文章

java Future 阻塞

如何在其他核心上运行每个线程?

java 多线程怎么深入?

同步异步阻塞非阻塞 总结

阻塞队列与非阻塞队列

爬虫提高性能:串行线程进程异步非阻塞