Как ограничить использование памяти потоками Haskell
В программе Haskell, скомпилированной с GHC, можно ли программно защищать от чрезмерного использования памяти? То есть, уведомить ли он программу, когда использование памяти достигает указанного предела, предпочтительно указывая на оскорбительную нить.
Например, предположим, что я хочу написать сервер, содержащий интерпретатор языка сценариев, к которому могут подключаться пользователи. Это Turing-complete, поэтому программы теоретически могут использовать неограниченную память или время. Предположим, что каждый клиент обрабатывается отдельным потоком. Если клиент пишет бесконечный цикл, который очень быстро потребляет память, я хочу убедиться, что поток потребляет не более, чем, скажем, 1 МБ памяти, перед тем как получить предупреждение с исключением. Я не хочу, чтобы другие пользователи были затронуты, когда это произойдет.
Возможно, это возможно с помощью отдельных процессов и ulimit
, но:
-
Я бы предпочел сохранить его в одной программе, чтобы избежать сложности межпроцессного общения.
-
Мне нужно поддерживать как Linux, так и Windows, поэтому я предпочел бы, чтобы это было возможно для платформы-agnostic.
Ответы
Ответ 1
Эдвард З. Ян и Дэвид Мазьер разработали расширение для GHC, которое поддерживает динамические пределы ресурсов, и обсудите его на http://ezyang.com/rlimits.html Они также предоставляют версию GHC 7.8, которая поддерживает это.
К сожалению, их работа не была включена в GHC вверх по течению.
Ответ 2
Не может быть именно то, что вы хотите. Но, как описано в здесь, у вас есть опция компиляции ghc:
-Ksize, обновление: К сожалению, -K для. Тем не менее, вы можете проверить эту ссылку.
Ответ 3
В вашем примере вам может потребоваться изменить источник интерпретатора языка сценариев, внести некоторые завихрения в память mgmt. модуль (ы), разумеется, если он имеет некоторые функции распределения памяти, интерпретатор может жаловаться на верное использование квоты памяти обратным вызовом API для вашего хост-приложения.