fork 后 exec 系统调用中的调度策略
Scheduling Policy in an exec system call after a fork
假设我有一个子进程,我将其调度策略设置为 SCHED_BATCH
,使用 C 库的函数 sched_setscheduler
,现在,这个子进程使用execvp
系统调用。
创建的新进程的Scheduler是否与之前子进程的Scheduler相同,即调度策略是否通过execvp
系统调用继承?我已经阅读了手册页,其中指出 FIFO
和 RR
策略是继承的,但是正常的策略呢,比如 SCHED_BATCH
、SCHED_IDLE
和 SCHED_OTHER
?
有没有exec
family的函数支持所有调度策略的继承?
首先,exec
系列系统调用不执行它自己的映像,而是执行它加载的二进制文件。根据 man exec
:
The exec() family of functions replaces the current process image with a new process image.
因此,它将表现出准备调度特定可执行映像的方式。
当一个进程被标记为 SCHED_BATCH
时,它们将根据它们的 nice 值进行调度,就像 SCHED_OTHER
一样。由于批处理任务不需要用户交互,因此调度程序将任务视为 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
标志与调度策略进行或运算。如果指定该标志,任何新创建的进程都将回退到默认调度策略,而不是复制父进程的行为。
希望对您有所帮助!
假设我有一个子进程,我将其调度策略设置为 SCHED_BATCH
,使用 C 库的函数 sched_setscheduler
,现在,这个子进程使用execvp
系统调用。
创建的新进程的Scheduler是否与之前子进程的Scheduler相同,即调度策略是否通过execvp
系统调用继承?我已经阅读了手册页,其中指出 FIFO
和 RR
策略是继承的,但是正常的策略呢,比如 SCHED_BATCH
、SCHED_IDLE
和 SCHED_OTHER
?
有没有exec
family的函数支持所有调度策略的继承?
首先,exec
系列系统调用不执行它自己的映像,而是执行它加载的二进制文件。根据 man exec
:
The exec() family of functions replaces the current process image with a new process image.
因此,它将表现出准备调度特定可执行映像的方式。
当一个进程被标记为 SCHED_BATCH
时,它们将根据它们的 nice 值进行调度,就像 SCHED_OTHER
一样。由于批处理任务不需要用户交互,因此调度程序将任务视为 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
标志与调度策略进行或运算。如果指定该标志,任何新创建的进程都将回退到默认调度策略,而不是复制父进程的行为。
希望对您有所帮助!