我正在研究一个旨在作为服务的研究编译器项目。一个要求之一是,某些用户在处理呼叫时,某些用户的内存使用情况可能有限(例如," IP a.b.c.d 的调用最多可能会使用30MB的堆内存")。
我的原型实现(用C编写)只是直接使用malloc
'IND的内存池(由于有效的类型,实际上很难获得正确的选择)。不过,手动内存管理。
是否有任何方法可以通过限制函数,单元或轻质线程来实现这一目标?(我会接受其他功能性语言的建议,这可能会让我这样做。)
在GHC的最新版本中,可以使用GHC.Conc
中的setAllocationCounter
和enableAllocationLimit
设置每线程分配计数器和限制。设置限制并且计数器达到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 ()
分配作为一种措施有点粗糙,但是检测一些"失控"计算仍然很有用。
Simon Marlow的这篇博客文章更详细。