我可以限制Haskell中每个函数/ monad/thread的内存使用量吗?

pau*_*ens 10 memory multithreading haskell ghc

我正在研究一个旨在作为服务工作的研究编译器项目.其中一个要求是某些用户在处理其调用时可能具有有限的内存使用量(例如,"来自IP abcd的调用可能使用高达30mb的堆内存").

我用C语言编写的原型实现只是直接使用内存池malloc(实际上由于有效类型而很难实现).但是,手动内存管理.

有没有办法在Haskell中实现这一点,通过限制函数,monad或轻量级线程上的堆使用?(我接受其他功能语言的建议,这些建议可能允许我这样做.)

dan*_*iaz 12

在GHC的最新版本,它可以设置每个线程分配柜台和限制,使用setAllocationCounterenableAllocationLimitGHC.Conc.设置限制并且计数器达到0时,线程会收到异步异常.

计数器测量分配,而不是实时集的大小.例如,这个代码达到了极限,尽管它的实时设置永远不会变得非常大:

{-# LANGUAGE NumDecimals #-}
module Main where

import Data.Foldable (for_)
import System.IO
import GHC.Conc (setAllocationCounter,enableAllocationLimit)

main :: IO ()
main = 
  do setAllocationCounter 2e9
     enableAllocationLimit
     let writeToHandle h =
            for_ ([1..]::[Integer])
                 (hPutStrLn h . show)
     withFile "/dev/null" WriteMode writeToHandle
     return ()
Run Code Online (Sandbox Code Playgroud)

分配有点粗略作为衡量标准,但它仍然有助于检测一些"失控"计算.

Simon Marlow撰写的这篇博文更详细.