2009-11-04 6 views
4

프로세스 별 및 시스템 별 메모리 사용 정보를 얻고 싶습니다. Windows에서는 꽤 쉽습니다. GetProcessMemoryInfo 및 GlobalMemoryStatusEx는 이러한 작업을 매우 쉽고 매우 쉽게 수행합니다. 예를 들어, GetProcessMemoryInfo는 주어진 프로세스의 "PeakWorkingSetSize"를 제공합니다. GlobalMemoryStatusEx는 시스템 전체의 사용 가능한 메모리를 반환합니다.Linux/Windows의 C/C++ 메모리 사용 API

그러나 리눅스에서해야합니다. GetProcessMemoryInfo 및 GlobalMemoryStatusEx와 동일한 Linux 시스템 API를 찾으려고합니다.

'getrusage'가 발견되었습니다. 그러나 구조체 rusage의 최대 'ru_maxrss'(상주 세트 크기)는 0으로 구현되지 않았습니다. 또한 시스템 전체에 사용 가능한 메모리를 확보 할 생각이 없습니다.

현재 해결 방법은 "system ("ps -p % my_pid -o vsz, rsz ");"입니다. 수동으로 파일에 기록하십시오. 그러나 데이터를 처리하는 것이 더럽고 편리하지 않습니다.

이 목적을 위해 멋진 Linux API를 알고 싶습니다.

+0

특정 프로세스에서 사용하는 메모리 양 또는 특정 스레드에서 사용중인 메모리 양을 원하십니까? – ChadNC

+0

@ChadNC, 나는 프로세스와 시스템마다 하나씩 원했고, 나는이 문제를 해결했다. – minjang

답변

6

어떻게 수행되는지는 libstatgrab에서 확인할 수 있습니다.

+0

감사합니다 알렉스, 이것은 내가 원했던 것입니다. 사실, 라이브러리는/proc/* 데이터를 읽습니다. 제가 시도 할 방법입니다 :) – minjang

+0

그런 다음 대답을 허용으로 표시하고 그것을 upvote. –

5

리눅스에는 커널에서 이러한 데이터를 가져 오기위한 (모듈 형) 파일 시스템 인터페이스가 있으므로 거의 모든 언어 또는 스크립팅 도구에서 사용할 수 있습니다.

메모리가 복잡 할 수 있습니다. 프로그램 실행 파일 자체가 있습니다. 아마도 mmap()이 공유 라이브러리에있을 것입니다. 스택 사용률. 힙 사용. RAM에있는 소프트웨어 부분. 부분이 바뀌 었습니다. 기타


정확히 "PeakWorkingSetSize"는 무엇입니까? 최대 상주 세트 크기 (프로세스에서 사용되는 최대 비 스왑 물리 메모리)와 같습니다.

전체 프로세스의 총 가상 메모리 풋 프린트 일 수도 있지만 (합계 in-RAM 및 SWAPPED-out 부분).


선명하게 촬상는, 리눅스에서, 당신은 strace를 프로세스가 커널 수준의 상호 작용을 참조 할 수 있습니다. "ps"는 ​​/ proc/$ {PID}/* 파일에서 데이터를 가져옵니다.

나는 cat/proc/$ {PID}/상태를 제안합니다. Vm * 라인은 매우 유용합니다.

구체적으로 : VmData은 프로세스 힙 사용을 나타냅니다. VmStk은 프로세스 스택 사용률을 나타냅니다. 당신이 "PS"를 계속 사용하는 경우

, 당신은 는 popen()을 고려할 수 있습니다.


나는 시스템 전체 사용 가능한 메모리를 얻을 아무 생각이 없습니다.

리눅스는 ... 따라서 +/- 버퍼/캐시 버퍼링 파일 및 캐싱에 사용되지 않는 메모리의 사용을 만들 것입니다

주 무료 는/usr/빈은/항상있다 행.

+0

답변 해 주셔서 감사합니다. "PeakWorkingSetSize"는 Windows 시스템에서 정의되며 max rss와 비슷합니다. 언급 한대로 libstatgrab은/proc/$ PID/status에있는 파일을 읽습니다. 라이브러리는 "/ proc/meminfo"섹션을 읽어 시스템 전체의 사용 가능한 메모리를 제공합니다. 감사합니다. – minjang