2017-01-22 5 views
1

Здесь идет сценарий: у меня есть родительский процесс, который породил пару дочерних процессов. Теперь каждому подпроцессу должно быть разрешено работать в течение двух секунд (время процессора в идеале), после чего родитель заставляет детей спать или выполняет некоторую работу. Этот цикл продолжается. Также некоторые подпроцессы могут быть прекращены между ними. Подпроцесс, который будет создан, - это код, написанный каким-то ненадежным человеком. (Эта проблема напоминает мне о циклической диспетчеризацией)Как планировать подпроцессы?

Мои решения и исследования:

Очевидное решение: Положите родителя спать в течение двух секунд, а затем просыпаются и контролировать детей. Здесь мы идем со стеной, и каждый процесс может не получить справедливые две секунды времени выполнения.

Решение второе: используйте prlimit() с RLIMIT_CPU и установите большую жесткость и softlimit как две секунды изначально. Впоследствии мягкая граница может быть увеличена на две секунды. Затем подпроцесс получает сигнал SIGXCPU.

Каждому процессу может быть присвоен другой сигнал (сигнал в реальном времени) (попадает в верхний предел 33). Теперь, получив сигнал SIGXCPU, назначенный сигнал должен быть отправлен родителям с помощью os.kill(). Здесь проблема заключается в том, что подпроцесс должен добровольно отправить сигнал родительскому элементу. Подпроцесс может получить дополнительное время, посылая сигнал поздно.

Решение три: Используйте метод setitimer() с ITIMER_VIRTUAL из дочернего процесса. Сигнал SIGVTALRM отправляется дочернему процессу. Он должен передать другому сигналу (как описано выше) к родительскому процессу. Эти решения имеют те же проблемы, что и в предыдущем решении.

Все три решения - это катастрофы. Я ищу лучшие решения. Некоторый минимальный код для объяснения будет очень полезен.

+0

I ребенок печатает и завершает работу, тогда родитель будет ждать бесконечно! Таким образом, измерение времени процессора плохое. –

+0

Я пришел к выводу, что использование процессорного времени не является разумным, и что касается времени на стене, я думаю, что вопрос все еще стоит. –

ответ

0

Тот же вопрос был задан here.

Одним из возможных решений является запуск подпроцессов под номером ptrace (родителем). Когда вы это сделаете, родитель будет уведомлен о любых сигналах, которые будут отправлены в его ptrace d детей, и родитель может решить, что делать с этими отложенными сигналами (с возможностью игнорировать сигнал или пересылать его на ребенок или прекращение ребенка и т. д.).

Подпроцесс, который будет порожден, - это код, написанный ненадежным человеком.

Решение ptrace также позволяет вам следить за тем, что делает подпроцесс, и предотвратить его выполнение определенных системных вызовов.

Без этого подпроцесс мог бы fork и перейти на sleep, не потребляя времени на выполнение (с процессом грандиозного дочернего процесса, использующим неограниченное время процессора).

См. Также this несколько устаревшая статья о тюрьмах под Linux. Текущим уровнем техники в песочнице является seccomp-bpf, например Firejail.

+0

Я уже использую seccomp-bpf, чтобы отфильтровать fork() и некоторые другие вызовы. –

Смежные вопросы