Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 如果有一个cpu内核和两个非阻塞和非退出线程,那么每个线程每次可以占用多少cpu时间?_Multithreading_Linux Kernel_Cpu Usage - Fatal编程技术网

Multithreading 如果有一个cpu内核和两个非阻塞和非退出线程,那么每个线程每次可以占用多少cpu时间?

Multithreading 如果有一个cpu内核和两个非阻塞和非退出线程,那么每个线程每次可以占用多少cpu时间?,multithreading,linux-kernel,cpu-usage,Multithreading,Linux Kernel,Cpu Usage,我的问题的更多细节: 系统平台为linux(mac),线程任务为非阻塞和循环。假设只有一个cpu核心,当有两个线程时,一个线程每次可以占用多长cpu时间。当线程数增加时,分配给每个线程的cpu时间如何变化 经验表明,当线程数过大时,性能会逐渐下降。我认为性能可能受到A/B值的影响(A代表上下文切换的时间,B代表用户代码在线程的一个cpu时间片中运行的时间)。所以,如果我们知道当线程数增加时cpu时间片是如何变化的,我们就可以知道系统的性能了 我想真正了解cpu时间分配,有人能推荐一些关于这方面的

我的问题的更多细节:

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

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


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

事实1:cpu时间没有分配,内核周期性地启动拒绝释放cpu的繁忙循环进程。

有一种硬件以恒定的间隔产生中断,这种中断称为定时器中断或
滴答声
。只有当勾号到达时,内核才有机会检查当前运行的进程是否占用了太多的cpu资源。如果没有中断触发器,进程将永远控制cpu,不会有任何机会运行任何其他代码

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

有几个函数或系统调用可以释放CPU资源。例如,
select
epoll\u wait
,blocking read/write,
wait\u pid
和我最不喜欢的
sleep
(我编码了数百万行,
sleep
,除了在测试用例中,从不使用)

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

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

在X86 arch中,内核将使用
halt
指令将CPU置于低功耗模式,这将实际移交CPU,如果没有中断,CPU将永远挂起。(在无滴答模式下,如果没有进程处于活动状态,则滴答将被禁用;如果没有网络、硬盘、键盘/鼠标输入或任何中断,则CPU将永久挂起,从而节省电池)

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

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

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

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

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

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


希望这些将帮助您了解调度程序是如何工作的

每个线程每次可以占用多长cpu时间?
-这取决于调度程序策略。调度是一个广泛的话题。linux调度程序策略在大多数硬件平台(如x86、arm)上是否有所不同?还是取决于硬件性能?谢谢~,了解内核调度器的工作原理是非常清楚的。“典型的CPU周期是10-50ms”是我想知道的。我还有一个问题。当线程数增加时,CPU周期(勾号周期)是否改变以及如何改变?非常好的总结。这是我见过的最好的答案之一。你说过,游戏通常会一直占用cpu以精确地达到帧速率,为什么它不会被勾选出来呢。如果它被踢出,它下次获得cpu之前的间隔就像它主动释放cpu一样。@Panda如果所有其他进程都没有非常常见的东西,内核就不会费心踢出它。
|------------------ one cpu time of one thread ---------------------|
|-context switch time -|----------- user code running time----------|
|------------A---------|--------------------B-----------------------|