Linux의 GNU C ++에 얼마나 많은 무료 메모리가 남아 있는지 알아내는 방법
문제
C ++ 프로그램을 작성하고 있습니다 (GCC로 컴파일하고 Redhat Linux에서 실행). 이 프로그램은 런타임에 스택에 얼마나 많은 공간이 남아 있고 힙에 얼마나 남아 있는지 알아야합니다. 이 질문에 대한 명확한 답이 없을 수도 있습니다 (힙에 관한). 따라서 대신 힙에서 이미 할당 된 메모리의 양을 사용할 수 있습니다. 이 데이터를 제공 할 AA 라이브러리/시스템 기능 호출이 있습니까?
디버깅 목적으로 만 필요하고 대략적인 추정치 만 필요하므로 빠른 솔루션이 완벽하게 허용됩니다. 그러나 메모리 사용량을 매우 자주 쿼리해야하므로 UNIX CMD 라인 유틸리티로 껍질을 벗기고 출력을 구문 분석 할 수 없습니다.
올바른 솔루션이 없습니다
다른 팁
아마도 실제 신규 및 삭제 연산자를 캡슐화하고 동시에 메모리 사용량을 기록하는 자신만의 새로운 및 삭제 기능을 만들 수 있습니다.
스택의 경우 C에는 현재 기능에 정의 된 첫 번째 로컬 변수의 주소를 살펴보고 현재 스택 포인터가 위치한 위치에 대한 대략적인 아이디어를 얻는 트릭이 있습니다. C ++에서 작동해야하지만 시도하지는 않았습니다.
Linux에서는 읽을 수 있습니다 /Proc /pid
/상태
32 비트 시스템에서 스택이 아래쪽으로 커지고 힙이 위로 커지고 두 사람은 중간 어딘가에 만날 수 있습니다. 그러므로 공간은 쌓거나 힙에 할당 될 수 있지만 동시에 둘 다에 맞지 않을 수 있습니다. 공유 메모리 세그먼트 (사용하는 경우)는 메모리 맵을 복잡하게 만듭니다. 따라서 동적으로로드 (공유) 라이브러리를 사용할 수 있습니다.
+------------+
| stack | high addresses
| | |
| v |
+------------+
| |
| unused |
| |
+------------+
| |
| ^ |
| | |
| heap |
| |
+------------+
| |
| bss |
| |
+------------+
| |
| data |
| |
+------------+
| |
| text |
| | low addresses
+------------+
64 비트 시스템의 경우 충돌이 발생하기 전에 실제 및 가상 메모리가 부족한 주소 공간이 충분합니다.
또한 (적어도 일부 버전의) Linux는 실제로 지원할 수있는 것보다 더 많은 메모리를 할당 할 수 있다고 말할 것입니다. 그것은별로 좋지 않습니다. 그것은 시험 메모리 할당과 같은 실제 실험이 당신에게 잘못된 보안 감각을 줄 수 있음을 의미합니다.
아마도 '당신은'공간 (GB?)의 공간이 얼마나 남아 있는지 '대신'X MB (GB?)가 남아있는 공간 '이라는 묻는 것이 가장 좋습니다. 다른 사람들은 /proc
사용중인 메모리의 양에 대한 정보 소스로서 파일 시스템. 메모리가 얼마나 많은 메모리를 잡을 수 있는지 확실하게 알려주는지 확실하지 않습니다.
이것은 라즈베리 파이에서 자유 메모리의 양을 반환하는 C 함수입니다. /proc /meminfo를 읽어서 작동합니다. 다른 시스템에서 작동하는지 확실하지 않습니다.
#include <stdio.h>
#include <string.h>
// Return the amount of free memory in kbytes.
// Returns -1 if something went wrong.
int getfreememory()
{
int returnValue;
const int BUFFER_SIZE = 1000;
char buffer[BUFFER_SIZE];
FILE *fInput;
int loop;
int len;
char ch;
returnValue = -1;
fInput = fopen("/proc/meminfo","r");
if (fInput != NULL)
{
while (!feof(fInput))
{
fgets(buffer,BUFFER_SIZE-1,fInput);
if (feof(fInput))
{
break;
}
buffer[BUFFER_SIZE-1] = 0;
// Look for serial number
if (strncmp(buffer,"MemFree:",8)==0)
{
// Extract mem free from the line.
for(loop=0;loop<BUFFER_SIZE;loop++)
{
ch = buffer[loop];
if (ch == ':')
{
returnValue = 0;
continue;
}
if (ch == 0)
{
break;
}
if (returnValue >=0)
{
if (ch >='A')
{
break;
}
if ((ch >='0') && (ch <='9'))
{
returnValue = returnValue * 10 + (ch-'0');
}
}
}
break;
}
}
fclose(fInput);
}
return returnValue;
}
/Proc 네임 스페이스 파일 /Proc /를 확인할 수 있습니다.u003Cpid> /smaps 및 /proc /u003Cpid> /지도, 어디에u003Cpid> 현재 프로세스 ID입니다.
확인하다 이 블로그 포스트 밖으로.
Valgrind의 Massif 도구는 스택과 힙을 모두 지원합니다 프로파일 링. 소스 코드를 확인하여 어떻게 작동하는지 확인할 수 있습니다.
힙 부품의 경우 아마도 자원 제한을 치고있을 것입니다. 체크 아웃 이것.
스택 프로파일 링을 위해 Valgrind를 사용할 수 있지만, 당신은 그것으로 무엇을 할 것입니까? 스택은 힙과 같지 않습니다. 당신은 디버깅 목적으로 이것을하고 싶다고 말합니다. 프로그램이 잘 실행되면 스택 문제가 없습니다 (적어도 크기와 관련하여).
생성 된 스레드의 스택 크기를 설정하고 로컬 변수 (최적화되지 않아야 함) 주소를 보면 스택 포인터 값을 검사 할 수 있습니다. 초기 크기, 초기 스택 포인터 값 및 현재 스택 포인터 값을 사용하여 수학을 수행하면 좋은 숫자를 얻을 수 있습니다. 먼저 스택 방향을 찾는 것을 잊지 마십시오. 이것은 플랫폼에서 플랫폼으로 변경 될 수 있습니다.
나는 당신이 힙 사용에 대해 많은 관심을 가지고 있다고 생각한다면, 당신의 프로그램은 아마도 메모리를 유출 할 것입니다. 이 경우 Valgrind는 올바른 방향을 가리킬 수 있습니다. Valgrind
rlimit_stack의 매개 변수가있는 getrlimit는 총 얼마나 많은 스택 공간이 있는지 알려줍니다. rlimit_as의 매개 변수를 사용하면 얼마나 많은 가상 메모리가 있는지 확인할 수 있습니다.
자세한 내용은 참조하십시오 http://linux.die.net/man/2/getrlimit