2017-02-20 1 views
9

저는 서비스로 일하기위한 연구 컴파일러 프로젝트를 진행하고 있습니다. 요구 사항 중 하나는 전화를 처리하는 동안 특정 사용자가 제한된 메모리 사용량을 가질 수 있습니다 (예 : "IP .b.c.d의 힙 메모리를 최대 30MB까지 사용할 수 있음").하스켈에서 함수/모나드/쓰레드 당 메모리 사용을 제한 할 수 있습니까?

C로 작성된 프로토 타입 구현은 직접 malloc 인 메모리 풀을 사용합니다 (실제로 유효한 형식으로 인해 올바르게 작성하기가 어렵습니다). 수동 메모리 관리.

함수, 모나드 또는 가벼운 스레드에서 힙 사용을 제한하여 Haskell에서이를 수행 할 수있는 방법이 있습니까? (나는 내가이 작업을 수행 할 수있는 다른 함수형 언어의 제안을 받아 들일 것입니다.) GHC의 최신 버전에서

+0

정확히 무엇을 제한하려고합니까? 임의의 하스켈 코드에 대한 임의의 메모리를 제한하는 것은 가능하지 않을 수 있지만, 타입 클래스 뒤에 숨겨서 특정 리소스에 대한 액세스를 제한 할 수 있습니다. – Cirdec

+7

운영 체제 프로세스의 메모리가 제한 될 수 있습니다. 한 가지 가능한 해결책은 새 프로세스를 포크하고 새로운 프로세스에 대한 ['setResourceLimit'] (https://hackage.haskell.org/package/unix-2.7.2.1/docs/System-Posix-Resource.html)과 [원격] (https://hackage.haskell.org/package/remote-0.1.1/docs/Remote.html)과 같은 것으로 통신하십시오. 새로운 프로세스에서 실행되는 코드를'IO()'보다 덜 강력한 것으로 제한해야 할 것이다. – Cirdec

+0

그래, 그 컴파일 과정에 대한 전체적인 메모리 사용을 제한하려하고있다. 그것들은 정말로 비쌀 수 있습니다. 나는 힙 사용을 어떻게 든 제한하지 않으면 DoS에 취약 할 수 있습니다. – paulotorrens

답변

10

, GHC.Conc에서 setAllocationCounterenableAllocationLimit를 사용하여, 스레드 당 할당 카운터 및 제한을 설정할 수 있습니다. 한계가 설정되고 카운터가 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() 

할당이 척도로서 비트 원유이지만, 여전히 "통제 불능"계산을 감지하는 것이 유용 할 수 있습니다 : 예를 들어,이 코드는 라이브 세트에도 불구하고 결코 매우 큰되고없는 한계를 맞았습니다.

This blog post Simon Marlow가 더 자세히 설명합니다.

+0

충분히 가깝다. 감사. – paulotorrens

관련 문제