我正在学习 Linux 进程调度程序并一直在阅读 pthread_setsched 函数:https ://man7.org/linux/man-pages/man3/pthread_setschedparam.3.html
让我感到惊讶的一件事是允许线程修改自己的优先级/类。我可以看到这对于配置某些多线程应用程序(例如生产者和消费者)有什么意义,但是,任何进程都可以请求设置自己的优先级,这似乎是一个系统稳定性风险。是什么阻止了我的 helloworld.out 以最高优先级请求 SCHED_FIFO?这可能会完全锁定系统。
那么有哪些机制可以防止进程完全控制调度程序呢?似乎可以设置系统错误 EPERM,但是,这是在哪里配置的?
内核强制执行此操作。规则在“权限和资源限制”部分中
man 7 sched
有详细说明;总之:SCHED_DEADLINE
策略只能由特权线程修改(带CAP_SYS_NICE
);RLIMIT_RTPRIO
只能降低其优先级或切换到非实时策略;RLIMIT_RTPRIO
被绑定到该限制,除非它们的优先级被设置得更高(由特权线程)。线程
CAP_SYS_NICE
可以为所欲为,但其他任何事情都受到严格控制。