Что я хочу сделать
У меня есть приложение OCaml, требующее большого объема вычислений, и я бы хотел, чтобы оно работало в фоновом режиме, не нарушая нормальное использование компьютера.Я хотел бы предоставить пользователям два варианта:
(1) приложение запускается, только когда загрузка процессора составляет практически 0%;
(2) приложение использует только «бесплатную» обработкумощность (например, если другие процессы добавляют до 100%, приложение OCaml приостанавливается; если другие процессы фактически равны 0%, то для приложения OCaml нет никаких ограничений; если другие процессы добавляют, скажем, до 50%, тогда OCaml будет использоватьдо 50%).
Некоторые мысли
Моя идея состоит в том, чтобы проверить использование процессора в различных контрольных точках в коде и при необходимости приостановить выполнение.
In (1)мы просто проверяем, ниже ли CPU, скажем, 2%, и, если нет, делаем паузу, пока оно снова не станет ниже 2%.
В (2) все сложнее.Поскольку при отсутствии ограничений приложение всегда потребляет 100% ЦП, а контрольные точки будут довольно частыми, чтобы уменьшить использование ЦП, скажем, наполовину, мне просто нужно отложить его на каждой контрольной точке ровно на то время, которое потребовалось между контрольными точками.Если бы контрольные точки были частыми, я бы сказал, что это будет похоже на использование 50% ЦП.Для других процентов мы можем сделать нечто подобное, приостановив на соответствующие периоды времени.Тем не менее, это выглядит очень надуманным, полным накладных расходов, и, прежде всего, я не уверен, что это действительно то, что я хочу.Лучшей альтернативой может быть вызов Unix.nice n
с некоторым соответствующим целым числом в начале приложения.Я полагаю, что установка n=15
, вероятно, будет правильной.
Мои вопросы
(Q1) Как я могу узнать из своего приложения OCaml, какова загрузка ЦП для процесса приложения?(Я хотел бы сделать это с помощью функции OCaml, а не вызывая «ps» или что-то подобное в командной строке ...)
(Q2) Вы видите проблемы с моей идеей достижения (2).Каковы практические отличия от изменения качества процесса?
(Q3) Есть ли у вас другие предложения для (2)?