2017-11-27 28 views
1

나는 연속적으로 메모리를 할당하고 다른 스레드가 관련 데이터를 처리 한 후에 그것을 해제 할 프로세스가있다. 데이터 처리 속도가 느릴 때 RES 메모리가 증가하는 것을 볼 수 있습니다. 그러나 모든 데이터가 처리 된 후에 RES는 다운되지만 원래 RES 값으로 돌아 가지 않습니다 (10 분을 기다린 후에도).메모리가 해제 된 후 프로세스의 RES 메모리가 삭제됩니까?

10MB (원본) => 50MB (피크) => 30MB (모든 데이터가 해제 된 후)

valgrind를 대용량 메모리와 함께 사용하면 모든 데이터가 해제 된 것처럼 보입니다. 제 질문은 RES가 원래의 10MB로 돌아 가지 않는 이유입니다.

+0

힙의 메모리가 OS에 정확하게 반환 될 때 메모리 할당자가 처리되기 때문입니다. 그러나'mmap()/munmap()'을 사용하여 메모리 할당을 스스로 관리 할 수있다. – Ctx

+0

C 또는 C++? 나는. 'new' 또는'malloc'? – MSalters

답변

1

난 그냥 당신에게 가장 일반적인 두 사람 목록을 것입니다, 그래서 여러 가지 이유가 있습니다 :

  • 페이지 현명한 할당 및 조각가 : 운영 체제가 페이지의 관점에서 메모리를 할당, 적어도 현대 시스템에서는 MMU을 사용합니다. 표준 라이브러리의 malloc() (또는 C++의 new 용 할당 자)은 임의의 크기를 처리하고 내부적으로 관리합니다. 페이지를 점유하는 마지막 할당이 반환 될 때만 페이지를 운영 체제로 되돌릴 수 있습니다. 페이지의 단일 할당 만 활성 상태 인 경우 프로세스는이 페이지를 유지해야합니다.

  • 라이브러리 : 많은 라이브러리가 C 표준 라이브러리에서도 자체 동적 메모리 할당을 수행합니다. Ctx commented로 말했다


, 당신 mmap()를 사용하여 Linux에 직접 페이지 할당 자신을 어쩌면 효율적으로이 페이지를 사용하여 단편화 문제를 피할 수 있습니다. 이것은 물론 표준 C의 경로를 남겨 두는 것을 의미하지만 최소한 mmap()이 많은 시스템에서 작동 할 수 있도록 POSIX에 지정되어 있습니다.

1

free()이 호출 될 때 OS에 메모리를 다시 제공하지 않는 OS의 예가 많이 있습니다.

그러나 malloc() 또는 realloc()을 호출하면 사용 가능한 메모리가 사용 가능한 것으로 표시됩니다.

퍼포먼스와 페이징이 이에 대한 이유입니다. Memory usage doesn't decrease when free() used에서 자세히보기.

그게 당신이 목격 한 내용입니다 (메모리를 비우더라도 프로그램 외부의 메모리 사용은 줄어들지 않습니다. 프로그램의 범위 내에서만 무료로 표시 될 수 있기 때문입니다).