%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EC%96%BC%EB%A7%88%EB%82%98%20%EB%A7%8E%EC%9D%80%20%EB%A9%94%EB%AA%A8%EB%A6%AC%EB%A5%BC%20%EC%98%88%EC%95%BD%ED%96%88%EB%8A%94%EC%A7%80%20%ED%99%95%EC%9D%B8%ED%95%98%EC%84%B8%EC%9A%94..png)
프로세스가 malloc()
이 메모리에 실제로 쓰지 않으면 Linux는 이 메모리가 비어 있고 다른 프로세스에서 사용할 수 있다고 간주합니다(오버커밋).
malloc()
어쨌든 특정 프로세스에서 얼마나 많은 메모리가 사용되었는지 알 수 있는 방법이 있나요 ? (사용하지 않더라도)
이 정보는 의 시스템 전반에 걸쳐 존재 /proc/meminfo
하지만 특정 프로세스에 대해 알고 싶습니다.
자세히 살펴봤지만 /proc/<PID>/{smaps,stat,statm}
이 정보가 표시되는지 확실하지 않습니다.
답변1
malloc()
데이터 세그먼트 크기를 변경하는 호출 (즉, 이전에 할당된 메모리를 재사용하지 않습니다. 따라서 sbrk()
또는 )에 대한 호출을 초래하는 할당은 및 mmap()
에 표시됩니다 ./proc/$PID/statm
/proc/$PID/stat
에서 statm
첫 번째 필드는 전체 프로그램 크기를 표시하고 여섯 번째 필드는 데이터 페이지 수를 표시합니다. 둘 다 메모리 할당을 반영합니다(사용되지 않은 경우에도).
에서 stat
살펴볼 필드는 vsize
(현재 23번째 필드) 입니다.
(아래 표 1-3 및 1-4 참조)proc
선적 서류 비치.)
malloc()
이는 총 메모리 사용량과 총 데이터 세그먼트 크기를 표시하므로 편집된 메모리와 다른 메모리 사용량을 구별할 수 없습니다 .
다음 프로그램을 사용하면 이 내용을 실제로 볼 수 있습니다.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv) {
void *buf;
puts("Waiting before allocating...");
sleep(20);
buf = malloc(10*1024*1024*1024L);
puts("Sleeping after allocating...");
sleep(20);
free(buf);
return 0;
}
(언제나 오류 처리가 훌륭합니다.) 그런 다음
$ ./356532&
[1] 4239
Waiting before allocating...
$ cat /proc/4239/statm
1043 172 154 1 0 81 0
$ cat /proc/4239/stat | awk '{print $23}'
4272128
Sleeping after allocating...
$ cat /proc/4239/statm
2622484 172 154 1 0 2621522 0
$ cat /proc/4239/stat | awk '{print $23}'
10741694464
앤드류 헨레 지적했다 malloc_info(3)
, 실제로 거의 모든 프로세스에서 사용할 수 있습니다. 위의 예제 프로그램을 사용하면,디버깅 정보 없이(그냥 필요하지 않다는 것을 보여주기 위해):
$ gdb ./356532
> break free
free
(이것은 프로그램의 호출에 중단점을 설정합니다 . 실제로는 에 대한 모든 호출 free
이지만 "우리의 호출"을 먼저 누르게 됩니다. malloc
시작 코드에서 를 사용하기 때문에 를 사용하는 것은 유용하지 않습니다 malloc
.)
> run
gdb
중단점에 도달 하면 malloc_info
다음과 같이 호출할 수 있습니다.
> call malloc_info(0, stdout)
그러면 malloc
정보가 덤프됩니다.