假设我有一个子进程,我使用 C 库的函数 sched_setscheduler
将其调度策略设置为 SCHED_BATCH
,现在,这个子进程创建了一个使用 execvp
系统调用的外部进程。
创建的新进程的调度程序是否与以前的子进程相同,即调度策略是否通过 execvp
系统调用继承?我已经阅读了手册页,其中指出 FIFO
和 RR
策略是继承的,但是正常的策略呢,比如 SCHED_BATCH
,SCHED_IDLE
和 SCHED_OTHER
?
有没有exec
族的函数支持所有调度策略的继承?
最佳答案
首先,exec
系列系统调用不执行它自己的镜像,而是执行它加载的二进制文件。根据 man exec
:
exec() 系列函数用新的过程镜像替换当前过程镜像。
因此,它将表现出该特定可执行镜像准备好被调度的方式。
当一个进程被标记为 SCHED_BATCH
时,它们将根据它们的 nice 值进行调度,就像 SCHED_OTHER
一样。由于批处理任务不需要用户交互,因此调度程序将任务视为 CPU 密集型任务。根据 man sched_setschedparam
引用 SCHED_BATCH: Scheduling batch process
-
这个策略和SCHED_OTHER类似,它根据进程的动态优先级(基于nice值)来调度进程。不同的是这个策略会导致调度器总是假设进程是CPU-密集的。因此,调度程序将对唤醒行为应用小的调度惩罚,因此该进程在调度决策中会受到轻微的不利影响。
因此,如果您将进程的调度策略更改为 SCHED_BATCH
,它将像几乎所有其他正常进程一样进行调度(SCHED_OTHER,默认调度策略)。如果您想回退到完全默认的行为,那么您必须使用 SCHED_RESET_ON_FORK
标志与调度策略进行或运算。如果您指定该标志,任何新创建的进程都将回退到默认调度策略,而不是复制父进程的行为。
希望这对您有所帮助!
关于c - fork 后 exec 系统调用中的调度策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39673306/