Подтвердить что ты не робот

Как ограничить использование памяти потоками Haskell

В программе Haskell, скомпилированной с GHC, можно ли программно защищать от чрезмерного использования памяти? То есть, уведомить ли он программу, когда использование памяти достигает указанного предела, предпочтительно указывая на оскорбительную нить.

Например, предположим, что я хочу написать сервер, содержащий интерпретатор языка сценариев, к которому могут подключаться пользователи. Это Turing-complete, поэтому программы теоретически могут использовать неограниченную память или время. Предположим, что каждый клиент обрабатывается отдельным потоком. Если клиент пишет бесконечный цикл, который очень быстро потребляет память, я хочу убедиться, что поток потребляет не более, чем, скажем, 1 МБ памяти, перед тем как получить предупреждение с исключением. Я не хочу, чтобы другие пользователи были затронуты, когда это произойдет.

Возможно, это возможно с помощью отдельных процессов и ulimit, но:

  • Я бы предпочел сохранить его в одной программе, чтобы избежать сложности межпроцессного общения.

  • Мне нужно поддерживать как Linux, так и Windows, поэтому я предпочел бы, чтобы это было возможно для платформы-agnostic.

4b9b3361

Ответ 1

Эдвард З. Ян и Дэвид Мазьер разработали расширение для GHC, которое поддерживает динамические пределы ресурсов, и обсудите его на http://ezyang.com/rlimits.html Они также предоставляют версию GHC 7.8, которая поддерживает это.

К сожалению, их работа не была включена в GHC вверх по течению.

Ответ 2

Не может быть именно то, что вы хотите. Но, как описано в здесь, у вас есть опция компиляции ghc: -Ksize, обновление: К сожалению, -K для. Тем не менее, вы можете проверить эту ссылку.

Ответ 3

В вашем примере вам может потребоваться изменить источник интерпретатора языка сценариев, внести некоторые завихрения в память mgmt. модуль (ы), разумеется, если он имеет некоторые функции распределения памяти, интерпретатор может жаловаться на верное использование квоты памяти обратным вызовом API для вашего хост-приложения.