我有两个与C系统Linux编程相关的理论问题,涉及纳米睡眠和过程破坏。
所以,第一个:
只需使用nanosleep即可实现97%的CPU负载。例如,让我们考虑在子进程上以1秒的延迟迭代50次的for循环。使用nanosleep获得延迟。我在Debian Linux的开发板上观察到的是,在15到20次迭代之后,纳米级别的块和CPU负载是90%(我使用top来查看值)。
第二个问题与第一个问题有某种关系。使用相同的代码, 在子进程上运行50次for循环我观察到当纳秒睡眠在90%CPU负载下阻塞(冻结)时,子进程变成了僵尸进程。 它是一种内核机制,试图杀死使用过多CPU的进程?
再次,抱歉我无法发布代码,它不是我的...但我发现这两个案例的古玩,我在互联网上找不到什么,或者我没有& #39;不知道如何搜索。我只是想知道,理论上如果只使用nanosleep可以有90%的CPU负载,其次如果内核有一个安全机制试图杀死使用过多CPU的进程。
我有兴趣找到关于这种情况的一些意见,也许是推荐的替代功能。
PS:我不想看到要求源代码的评论,因为这个问题只是理论上的。
答案 0 :(得分:1)
你的问题毫无意义(抱歉)。
如果nanosleep
阻塞,它将不会使用任何CPU,因为它会阻塞,即在内核中等待其他事情发生。这就是阻止意味着什么。
对于使用100%CPU的进程,它必须忙着等待。
如果它正在忙着等待,并且正在呼叫nanosleep
,我们可以得出结论,每次拨打nanosleep的时间都非常短。
另一种解释是它使用大量的CPU做其他事情,只是非常偶尔调用nanosleep
,或者运行多个线程,而不是调用{ {1}}正在使用大量CPU。
答案 1 :(得分:1)
我不是专家,但我认为如果你的内核杀死了这个过程导致它消耗了太多的资源,它将完全取决于你正在使用的发行版。
关于CPU的使用,理论上你可以不断地将进程引入CPU并让它们进入睡眠状态。在这种情况下,操作系统将调度进程从CPU到锁定队列和返回(开销),并根据您的发行版用于调度进程的排队类型(循环,老化队列等,我记不起吧现在你可以设置这个参数)它最终可能会饿死其他进程
无论如何,这不仅仅是与操作系统相关的C问题