Как ограничить использование памяти потоками Haskell - PullRequest
22 голосов
/ 04 сентября 2011

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

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 22 июля 2017

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

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

2 голосов
/ 09 сентября 2011

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

2 голосов
/ 04 сентября 2011

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

...