Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory 如何限制Haskell线程的内存使用_Memory_Haskell_Ghc - Fatal编程技术网

Memory 如何限制Haskell线程的内存使用

Memory 如何限制Haskell线程的内存使用,memory,haskell,ghc,Memory,Haskell,Ghc,在使用GHC编译的Haskell程序中,是否可以通过编程防止过度内存使用?也就是说,让它在内存使用达到指定限制时通知程序,最好是指示有问题的线程 例如,假设我想编写一个服务器,托管一个脚本语言解释器,用户可以连接到该服务器。它是图灵完全的,所以理论上程序可以使用无限的内存或时间。假设每个客户机都由一个单独的线程处理。如果客户机编写的无限循环非常快地消耗内存,我希望确保线程在收到异常警报之前消耗的内存不超过(比如)1MB。我不希望其他用户在这种情况下受到影响 这可能是使用单独的进程和ulimit实

在使用GHC编译的Haskell程序中,是否可以通过编程防止过度内存使用?也就是说,让它在内存使用达到指定限制时通知程序,最好是指示有问题的线程

例如,假设我想编写一个服务器,托管一个脚本语言解释器,用户可以连接到该服务器。它是图灵完全的,所以理论上程序可以使用无限的内存或时间。假设每个客户机都由一个单独的线程处理。如果客户机编写的无限循环非常快地消耗内存,我希望确保线程在收到异常警报之前消耗的内存不超过(比如)1MB。我不希望其他用户在这种情况下受到影响

这可能是使用单独的进程和
ulimit
实现的,但是:

  • 我宁愿将其保存在一个程序中,以避免进程间通信的复杂性

  • 我需要同时支持Linux和Windows,所以如果可能的话,我更愿意保持it平台的不可知性


    • 可能不是你想要的。但是,如文件所述,您有一个ghc编译选项:
      -Ksize,update:Oops,对不起,-K表示堆栈溢出。不过,您可以检查该链接。

      在您的示例中,您可能需要修改脚本语言解释器的源代码,对内存管理进行一些修改。模块,当然,如果它有一些托管内存分配功能,解释器可能会抱怨通过API回调到主机应用程序执行内存配额使用。

      Edward Z.Yang和David Mazières开发了一个GHC扩展,支持动态资源限制,并在会议上进行讨论。他们还提供了一个支持这一点的GHC 7.8版本


      不幸的是,他们的工作没有包含在GHC上游中。

      我认为可以使用。
      -M
      选项看起来特别有希望,但我不确定它本身是否足够。我在当前项目中遇到了同样的问题。有一个答案建议计算分配,但我觉得这并不令人满意,如果可能的话,我想直接限制活动内存集。好了,内存消耗不是为单个线程定义的,只是为进程定义的。解释器是我计划用Haskell编写的。除非我分配内存(这基本上违背了用Haskell编写内存的目的),否则我对GHC的分配器的功能感兴趣。@Joey Adams:为此,你需要有内存所有权的概念。然而,在通用分配器中,它不必要地使事情复杂化——例如,如果线程被终止,而其他线程正在使用它(在使用
      par
      等时非常常见)。