2011-04-30 2 views
0

getrusage()는 프로세스의 하위에서 사용하는 메모리 양을 표시 할 수 있습니다. 나는 여러 개의 하위 프로그램을 시작할 쉘을 만들고 있습니다. getrusage()는 이러한 모든 아이들이 사용하고있는 메모리의 총 합계를보고합니다. 이것은 내가 원하는 것이 아닙니다. 나는 각 어린이가 얼마나 많은 기억을 사용하고 있는지 알고 싶다. getrusage()는 개별 자식 프로세스에서 작동하지 않는다는 점을 제외하고는 사용하고자하는 것처럼 보입니다. 사용할 수있는 것은 무엇인가?C++에서 getrusage()와 비슷한 것을 찾으십시오.

+0

각 하위 프로세스에서 getrusage (RUSAGE_SELF, ..)를 호출 할 수 있습니까? –

답변

1

어쩌면 아이들을 한 번에 하나씩 처리 한 다음 getrusage(RUSAGE_CHILDREN...)을 사용하여 각 자녀의 사용을 독립적으로 확인할 수 있습니다.

이 접근법의 가장 명백한 단점은 아이들을 동시에 실행해야하는 경우입니다. 이 경우 맞춤 제작 된 중개 프로그램이이를 수행 할 수 있습니다. 대신 직접 아이들을 실행, 프로그램을 실행 한 다음 nice 또는 time 명령의 스타일

  • 포크
  • exec
  • 요청 된 프로그램, 아마도 명령 행 인수 (프로그램 및 인수)로 전달
  • 부모는 자식에 대해 getrusage()을 실행합니다. 하나 밖에 없으므로 원하는 결과입니다. 그런 다음 몇 가지 메커니즘을 사용하여 정보를 주 프로그램 (상태 파일)으로 다시 전달하십시오.

그런 다음 필요한 것은 자식을 실행하고 메모리 사용을보고하도록 지시 된 중개자를 통해 마스터가 각 자식을 분기하는 것입니다.

요점은 getrusage()을 호출하는 프로그램이 하나의 하위 만 가질 수 있도록 하위 프로세스의 계층을 다시 잡는 것입니다. 마스터 프로그램은 너무 많은 자식을 가지고 있고 pid에 의한 메모리 사용을 얻기위한 시스템 호출이 없기 때문에 그렇게 할 수 없습니다.

리눅스 나 호환이 가능하다면 /proc/<pid>/mem에서도 주위를 스누핑 할 수 있습니다.

+0

나는 fork를 사용한 다음 execv를 사용하여 초기에 자식을 만듭니다. 내가 포크를 다시 써서 아이들 한테 들어갈 수 있다고 말하는거야? –

+0

@ z-buffer : 그런 식으로. 나는 그 대답을 명확히 할 것이다. – wallyk

+0

아이가 처음 만들어 졌을 때만 작동할까요? 나는 주어진 시간에 아이들이 얼마나 많은 기억을 사용하고 있는지 볼 수 있기를 원한다. –

0

각 자식 프로세스가 fork() 일 때 부모는 PID이됩니다. 이를 사용하여 /proc 파일 시스템을 쿼리 할 수 ​​있습니다. 특히 /proc/{pid}/status (이후 특정 메트릭에 따라 다름)을 쿼리 할 수 ​​있습니다.

을 포함, 당신에게 다양한 정보를 제공합니다 : 당신은 wait3 또는 wait4을 사용할 수 있습니다

VmSize: 2788 kB 
VmLck:  0 kB 
VmRSS:  1280 kB 
VmData:  252 kB 
VmStk:  16 kB 
VmExe:  268 kB 
VmLib:  2132 kB 
관련 문제