限制GHC中每个线程的线程内存访问

时间:2014-03-25 05:28:50

标签: multithreading haskell memory-management concurrency ghc

我想知道,是否可以限制线程使用的内存量?我正在寻找运行服务器,其中提交并运行不受信任的用户代码。我可以使用SafeHaskell来确保它不执行任何未经授权的IO,但我需要确保用户的代码不会使整个服务器崩溃,即通过导致堆栈溢出或内存不足堆错误。 / p>

有没有办法限制每个单独线程可以访问的内存量,或者某种方式确保如果一个线程消耗大量内存,那么只有该线程被终止?

也许,有没有一种方法,当任何线程遇到内存不足错误时,我可以捕获异常并选择哪个线程死掉?

我正在谈论更多关于并发性,在forkIO和STM线程的意义上,而不是par和seq的并行性。

注意:这与this question非常相似,但它从未得到一般问题的答案,而是答案涉及问题的具体情景。此外,自2011年以来,有可能在GHC 7.8中发生了一些变化,可能是新的IO经理?

1 个答案:

答案 0 :(得分:1)

我不知道Haskell,但总的来说,你的问题的答案是否定的。在所有编程语言/运行时/操作系统/等。我知道,线程只不过是通过相同代码执行的不同路径。在这种情况下,重要的是线程始终共享相同的虚拟地址空间。

话虽如此,没有技术原因可以解释为什么你的特定语言的内存分配器和运行时系统无法使用特定于线程的变量来跟踪任何给定线程已分配了多少,并施加了任意限制。

没有技术上的理由为什么它不能这样做,但是如果线程A分配一个随后由线程B,线程C,线程D,...进行访问的对象,那么惩罚线程A有什么意义呢?分配了吗?在一般情况下,没有实际的方法来跟踪许多线程访问的对象的“所有权”,这就是为什么没有语言/运行时/操作系统/等等。我知道尝试这样做。