2017-01-22 65 views
1

这里有一个场景:我有一个父进程产生了几个子进程。现在每个子进程必须允许运行两秒钟(理想情况下cpu时间),然后父进程让孩子进入睡眠状态或做一些工作。这个循环继续。还有一些子流程可能会在两者之间终止。将要产生的子过程是由一些不可信任的人写的代码。 (这个问题提醒轮询调度ME)如何安排子流程?

我的解决方案和研究:

明显的解决办法:把父两秒钟睡觉,然后醒来并控制孩子。在这里,我们花时间去了解每个进程可能得不到公平的两秒的执行时间。

解决方法二:使用prlimit()与RLIMIT_CPU,并设置一个大hardlimit和软限制两秒开始。随后软限制可能会上升两秒。然后子进程得到一个SIGXCPU信号。

不同的信号(实时信号)可以被分配给每个处理(命中的33更高的极限)。现在收到SIGXCPU信号后,必须使用os.kill()将指定的信号发送给父节点。这里的问题是子进程必须自发地将信号发送给父进程。通过延迟发送信号,子进程可能会获得额外的时间。

解决方案三:再使用setitimer()与ITIMER_VIRTUAL从子进程。 SIGVTALRM信号发送给子进程。它必须将不同的信号(如上所述)转发给父进程。该解决方案与以前的解决方案具有相同的问题。

所有三种解决方案都是灾难。我正在寻找更好的解决方案。一些最简单的代码解释会非常有帮助。

+0

我孩子打印并退出,然后父母将无限期地等待!所以测量CPU时间是不好的。 –

+0

我得出的结论是,使用cpu时间不是明智的,至于隔离时间,我认为问题仍然存在。 –

回答

0

同样的问题被问here

一种可能的解决方案是ptrace(由亲本)下运行的子进程。当您这样做时,父母会收到任何即将发送给其ptrace d孩子的信号的通知,并且家长可以决定如何处理这些待处理的信号(可能忽略信号或将其转发给孩子;或终止孩子等)。

要生成的子流程是由一些不可信任的人编写的代码。

ptrace解决方案还允许您观察子进程在做什么,并阻止它执行某些系统调用。

如果没有这个,子进程可能会fork并转到sleep,不消耗执行时间(使用无限制的CPU时间的宏程序进程)。

另请参见this有点过时的文章在Linux下的监狱。沙盒中的现有技术似乎是seccomp-bpf,例如Firejail

+0

我已经使用seccomp-bpf过滤出fork()和其他一些调用。 –