为什么顶部没有将我的应用程序列为实时应用程序?

为什么顶部没有将我的应用程序列为实时应用程序?

我正在尝试通过一个小应用程序来学习 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

这是有道理的。

toprt除非我将优先级提高到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 资源,那么所有其他非实时进程都将停止。这肯定会导致灾难,因为除了系统已经实时运行的内容之外,其他任何操作都不会运行,并且许多操作将失败或变得不可靠(主要是磁盘和网络访问)。甚至交换控制也可能受到影响,从而对系统管理可用内存的能力产生副作用。

为了防止出现任何上述问题,通常更合理的做法是为进程提供可以正常运行的较低优先级。

请注意,某些系统被设计为实时运行,但这意味着需要对所有优先级和运行流程进行大规模重新设计,以防止出现任何不良结果。

相关内容