2016-09-24 75 views
1

假设我有一个子进程,其调度策略使用C库的函数sched_setscheduler设置为SCHED_BATCH,现在这个子进程使用这个子进程创建一个外部进程execvp系统调用。在分叉后执行系统调用中的调度策略

创建的新进程的调度程序是否与前一个子进程的调度程序相同,即是否通过execvp系统调用继承了调度策略?我已阅读手册页,其中指出FIFORR政策是继承的,但对于正常的政策,像SCHED_BATCHSCHED_IDLESCHED_OTHER

有它支持所有的调度策略的继承任何exec家庭的功能?

回答

0

首先,exec家庭系统调用的不执行它自己的形象,而它执行二进制IT负载。按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标志或与调度策略结合使用。如果您指定该标志,则任何新创建的进程都将回退到缺省调度策略,而不是复制父级的行为。

希望这会有所帮助!

+0

基本上什么,我问的是有些不同,我首先设置一个新的'forked'子进程的调度是'SCHED_IDLE'使用'sched_setscheduler',现在这个派生的子进程创建使用'execvp'系统的新工艺因此,这个新创建的进程也将具有与创建该进程的子进程相同的调度程序SCHED_IDLE,或者它可能会有所不同? – Jarvis

+0

再次,'execvp'不会创建新的进程,它会替换调用进程的映像。 fork()和exec()之间有区别。 'fork()'重复调用进程(这意味着在内存中创建新空间,execvp不会)。 –

+0

是的,所以如果它取代了它的形象,那么前一个过程的调度器对于新过程将是相同的,对吧? – Jarvis