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