Linux의 GNU C ++에 얼마나 많은 무료 메모리가 남아 있는지 알아내는 방법

StackOverflow https://stackoverflow.com/questions/391107

  •  23-08-2019
  •  | 
  •  

문제

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top