2013-06-02 2 views
6

내가 (이상적으로 데이터 세그먼트 스택뿐만 아니라 힙) 메모리 한계 세트 프로세스를 실행하려면이 내 코드세트 메모리 제한

child = fork(); 
if (child == 0) 
{ 
    ... 
    execv(program, args); 
} 
wait(&status); 
과 같이 보입니다

이 구조를 구명해야한다, 나는 (실행 시간 등을 측정, 표준 입력/출력 리디렉션) 그것으로 몇 가지 물건을

내 질문 : 나는 프로그램 프로세스 메모리 제한을 설정하고 알고 부모를 할 수있는 방법, 초과했다면? 프로세스가 sigsegv로 죽지 않아야합니다. 알고 싶습니다.이 메모리 제한 때문에 프로세스가 종료되었습니다. 또는 완료되면이 프로세스의 메모리 사용량을 얻을 수있는 방법이 있습니까? 프로세스가 끝나면 최대 사용 메모리를 비교할 수 있습니다.

실행 시간을 늦출 수 없기 때문에 valgrind (또는 이와 비슷한)를 사용할 수 없습니다.

답변

3

자녀 과정을 확인한 후 execv() 전화를 받기 전에 setrlimit()으로 전화 할 수 있습니다. 나는 부모에게 통보하는 방법을 모르지만, 아마도 이것은 올바른 방향으로 당신을 가리킬 것입니다.

+0

setrlimit는 한계를 적절하게 설정하지만 더 많은 메모리를 malloc (사용)하면 프로세스가 sigsegv를 호출하고 대기 상태가됩니다. 나는 이것들을 다르게하고 싶다. –

+0

자식이 종료하고 기다렸다가'gotrusage()'와'RUSAGE_CHILDREN'을 사용하여 자식이 사용하는 리소스를 센다. – caf

+0

getrusage는 좋은 기능이지만 "resident set size"는 도움이되지 않습니다. 나머지는 linux에서 사용되지 않습니다. –

1

system (또는 setrlimit, Mike가 작성한 바) 내에 ulimit으로 전화 할 수 있습니다. 프로그래머가 그 한계에 도달하면 malloc은 실패합니다 (즉, NULL을 반환합니다). 그런 상황을 처리해야합니다 (오류로 종료되거나 널 포인터에 액세스하려고 시도하면 SIGSEGV로 종료됩니다).

부모에게 신호를 보내는 것에 대해 ... 자녀 프로그램을 바꿀 수 있습니까? 특정 종료 코드를 반환 할 수 있습니다.

+0

아니요, 하위 프로그램을 변경할 수 없습니다. Setrlimit는 작동하지만 sigsegv를 전송합니다./ Malloc 오류 처리는 보장되지 않습니다. system()을 사용하고 싶지 않습니다. –

+0

http://www.pixelbeat.org/scripts/ps_mem.py와 같은 프로그램을 사용하면 어떨까요? 프로그램에 대한 제한은 없지만 사용 된 메모리 양을 측정 할 수 있습니다. –

+0

불행히도. 주기적으로 호출하고 구문 분석 한 다음 최대 값을 선택해야합니다. 그때조차도, 그것은 매우 부정확 할 것입니다. –

1

자신의 메모리 관리자를 작성하면이 문제를 해결할 수 있습니다.

morden OS 용으로 작성된 많은 응용 프로그램의 경우 libc의 malloc/free는 괜찮지 만 응용 프로그램에 큰 메모리가 필요하지 않은 것은 우리 프로그램에서 사용 된 메모리가 얼마나 많은지 알 수 없습니다. glibc의 malloc/free 래퍼 인 트리 구조의 메모리 컨텍스트 클래스를 작성할 수 있습니다. 우리는 메모리를 할당하고,이 메모리 컨텍스트에 사용 된 메모리를 예약하고, 메모리를 확보 할 때 예약 된 값의 값을 뺀 값을 채 웁니다. 따라서 우리가 실제로 사용한 메모리 크기를 알 수 있습니다.