我正在尝试通过一个小应用程序来学习 Linux 上的调度策略C++
。这对于 应该同样有效C
。我正在使用以下代码更改应用程序的优先级:
sched_param tParam;
sched_getparam(0, &tParam);
tParam.sched_priority = 20;
sched_setscheduler(0, SCHED_RR, &tParam);
rt
我希望我的应用程序在运行时能够实时显示,top
但事实并非如此。这就是我得到的:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2652 root -21 0 145452 63460 11444 R 1.3 1.6 0:02.08 myRealTimeApp
负值PR
。但是当我跑步时chrt -p 2652
我得到:
pid 2652's current scheduling policy: SCHED_RR
pid 2652's current scheduling priority: 20
这是有道理的。
top
rt
除非我将优先级提高到99
,否则不会将我的应用程序列为。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2770 root rt 0 145452 63460 11444 S 1.0 1.6 0:01.93 myRealTimeApp
我的问题是:
除非优先级设置为 ,否则为什么
top
不将我的应用程序视为实时应用程序99
?为什么
top
优先级显示为负数,而事实并非如此。如果我设置优先级,会有什么风险
99
?
答案1
如果您的进程占用很少的资源,则无需担心,您可以使其实时运行,但这不会产生太大的影响。当相关进程使 CPU 过载并阻止基本任务完成其工作时,就会出现风险和问题。
通常不需要做超过 a renice -20
(优先级 0)的事情,因为它将优先于任何不重要的进程,除了您自己重新定义的进程之外。
当您-21
通过在 RT 中定义优先级来设置优先级时,您实际上会超出重要进程,包括(但不限于)窗口管理器、登录进程,甚至网络管理。幸运的是,由于您认为存在缺陷,系统仍将继续处理重要任务(尽管效率较低),即使该进程已耗尽 CPU 资源。
如果您认为您的进程非常重要,需要真正实时考虑并且需要占用所有 CPU 资源,那么所有其他非实时进程都将停止。这肯定会导致灾难,因为除了系统已经实时运行的内容之外,其他任何操作都不会运行,并且许多操作将失败或变得不可靠(主要是磁盘和网络访问)。甚至交换控制也可能受到影响,从而对系统管理可用内存的能力产生副作用。
为了防止出现任何上述问题,通常更合理的做法是为进程提供可以正常运行的较低优先级。
请注意,某些系统被设计为实时运行,但这意味着需要对所有优先级和运行流程进行大规模重新设计,以防止出现任何不良结果。