答案1
我猜你的内核并不认为它们是优先的:)
如果您查看图像,您会发现 Python 进程的优先级为 20。这是默认值。这意味着,如果我们抛开其他调度因素(已分配的 CPU 时间、进程状态等),您的 Python 脚本将被认为与top
、rcu_shed
、 、 ...一样重要sshd
,而这些进程可能并不总是有东西为了做到这一点,他们仍然可以在进入时访问CPU运行状态。
Linux 进程以时间量子(或时间片)运行。这意味着每个n毫秒,内核抢占(挂起)当前正在运行的进程(在核心上),并搜索另一个要调度的进程。默认情况下,时间片值为 100 毫秒(或者)。
由于您的机器有 24 个核心,因此您基本上可以假设可以安排 24 个进程同时运行。被选择(每 100 毫秒)进行调度的 (24) 个进程是基于几个因素来选择的。此外,如果进程在时间片到期之前进入睡眠状态,也可能被抢占。从 Linux 2.6 开始,内核使用完全公平的调度器默认算法。进程调度优先级主要基于每个进程已经运行的时间,并通过a考虑“用户优先级”(niceness)衰减因子:
CFS 不直接使用优先级,而是将它们用作允许执行任务的时间的衰减因子。优先级较低的任务具有较高的衰减因子,而优先级较高的任务具有较低的延迟因子。这意味着低优先级任务允许执行的任务时间比高优先级任务消耗得更快。这是一个优雅的解决方案,可以避免按优先级维护运行队列。
现在,可以(从用户态)通过以下nice
命令运行具有自定义良好值的进程:
nice [OPTION] [COMMAND [ARG]...]
Run COMMAND with an adjusted niceness, which affects process scheduling.
With no COMMAND, print the current niceness. Niceness values range from
-20 (most favorable to the process) to 19 (least favorable to the process).
请记住,Linux 调度程序并不使用该优先级作为绝对的事情。每当内核需要选择一个进程时,都会考虑该值,但也会考虑其他因素:进程的贪婪使得它们无论如何都不太可能被选择(算法的名称是非常不言自明的)一:p)。