c - fork 后 exec 系统调用中的调度策略

标签 c linux scheduling scheduler execvp

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

创建的新进程的调度程序是否与以前的子进程相同,即调度策略是否通过 execvp 系统调用继承?我已经阅读了手册页,其中指出 FIFORR 策略是继承的,但是正常的策略呢,比如 SCHED_BATCHSCHED_IDLESCHED_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/

相关文章:

ctags可以搜索代码中的条件循环吗

c++ - 如何使用 mplayer 播放到内存

c - c 中 while() 循环的不明确行为

c - 使用递归回文

linux - 使用 SSH 从 Windows 连接到远程 Linux 计算机给出权限被拒绝错误

linux - "/proc/$pid/latency"文件有什么作用?

linux - Linux 上的 Perfect 框架缺少库/模块

linux - 如何屏蔽Linux调度程序中的CPU(防止将线程调度到该CPU上)?

java - 为什么我收到 "Trigger' s 相关的作业名称不能为空” quartz 错误

linux - 我如何知道进程的最后安排时间