假设我有一个子进程,我使用C库的函数sched_setscheduler
将其调度策略设置为SCHED_BATCH
,现在,这个子进程使用execvp
系统调用创建了一个外部进程。
创建的新进程的Scheduler是否与以前的子进程的Scheduler相同,即通过execvp
系统调用继承调度策略?我已经阅读了手册页,其中说明FIFO
和RR
策略是继承的,但是正常的策略,如SCHED_BATCH
, SCHED_IDLE
和SCHED_OTHER
呢?
是否有exec
家族的功能支持所有调度策略的继承?
首先,exec
系列系统调用不执行它自己的映像,而是执行它加载的二进制文件。根据man exec
:
The exec() family of functions replaces the current process image with a new process image.
因此,它将按照准备调度的特定可执行映像的方式执行。
当一个进程被标记为SCHED_BATCH
时,它们将像SCHED_OTHER
一样基于它们的nice值进行调度。由于批处理任务不需要用户交互,因此调度器将该任务视为cpu密集型任务。根据man sched_setschedparam
引用自SCHED_BATCH: Scheduling batch process
-
This policy is similar to SCHED_OTHER in that it schedules the process according to its dynamic priority (based on the nice value).The difference is that this policy will cause the scheduler to always assume that the process is CPU-intensive. Consequently, the scheduler will apply a small scheduling penalty with respect to wakeup behaviour, so that this process is mildly disfavored in scheduling decisions.
因此,如果将进程的调度策略更改为SCHED_BATCH
,它将像几乎任何其他正常进程一样被调度(SCHED_OTHER,默认调度策略)。如果你想回退到完全默认的行为,那么你必须使用SCHED_RESET_ON_FORK
标志或调度策略。如果您指定了该标志,任何新创建的进程将回退到默认调度策略,而不是复制父进程的行为。
希望这对你有帮助!