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