programing

malloc은 메모리를 할당하는 동안 더 많은 공간을 확보합니까?

stoneblock 2023. 11. 5. 10:52

malloc은 메모리를 할당하는 동안 더 많은 공간을 확보합니까?

테스트 프로그램에서 다음 동작을 관찰하고 있습니다.

하고 있습니다.malloc()1MB 정도의 용량을 제공됩니다.free()그후에sleep(10). 다섯 번 하고 있어요.메모리 소모량을 관찰하고 있습니다.top프로그램이 실행되는 동안.

한번만free()-d, 프로그램의 가상 메모리(VIRT) 사용량이 1MB 줄어들 것으로 예상하고 있습니다. 하지만 실제로는 그렇지 않습니다.안정적으로 유지됩니다.이러한 행동에 대한 설명은 무엇입니까?한다malloc()메모리를 할당하는 동안 약간의 예약을 합니까?

한번만free()-d, 프로그램의 가상 메모리(VIRT) 사용량이 1MB 줄어들 것으로 예상됩니다.

음, 이것은 C 표준으로는 보장되지 않습니다.한 번만, 한 번만free()메모리, 당신은 더 이상 그것에 접근하지 말아야 합니다.

메모리 블록이 실제로 사용 가능한 메모리 풀로 반환되는지 아니면 향후 할당을 위해 따로 보관되는지는 메모리 관리자가 결정합니다.

C 표준은 시행자에게 강요하지 않습니다.malloc그리고.free메모리를 OS에 직접 반환합니다.따라서 서로 다른 C 라이브러리 구현은 다르게 동작할 것입니다.직접 돌려주는 사람도 있고 안 돌려주는 사람도 있습니다.사실, 동일한 구현은 할당 크기와 패턴에 따라 다르게 동작할 것입니다.

물론 이러한 행동은 정당한 이유가 있습니다.

  1. 그것이 항상 가능한 것은 아닙니다.OS 수준의 메모리 할당은 일반적으로 페이지(4KB, 4MB 또는 ...크기) 단위로 수행됩니다.또한 페이지의 작은 부분이 다른 부분을 해제한 후에도 여전히 사용 중인 경우, 해당 부분도 해제될 때까지 페이지를 운영 체제에 반환할 수 없습니다.
  2. 효율성.응용프로그램이 메모리를 다시 요청할 가능성이 높습니다.그렇다면 왜 OS에 돌려주고 곧 다시 요청을 하는 것일까요.(물론 유지되는 메모리의 크기에 제한이 있을 수 있습니다.)

대부분의 경우, 당신은 당신의 기억에 대해 책임을 지지 않습니다.free구현이 이를 유지하기로 결정한 경우(assuming 좋은 구현입니다).조만간 재할당되거나 OS로 반환됩니다.따라서 메모리 사용량을 최적화하는 것은 보유한 양을 기준으로 해야 합니다.malloc-에드, 넌 안해봤잖아요.free-d. 이것에 대해 걱정해야 하는 경우는 할당 패턴/크기가 메모리 조각화를 일으키기 시작할 때이며, 이는 그 자체로 매우 큰 주제입니다.

그러나 임베디드 시스템에 있는데 사용 가능한 메모리 양이 제한되어 있고 메모리가 할당되고 해제되는 시기와 방법에 대한 제어력이 더 필요한 경우에는 OS에서 직접 메모리 페이지를 요청하고 수동으로 관리해야 합니다.

편집: 나는 당신이 왜 당신이 당신의 자유로운 기억에 대해 책임을 지지 않는지 설명하지 않았습니다.그 이유는 현대 OS에서 할당된 메모리는 가상이기 때문입니다.즉, 32비트 시스템에 512MB를 할당하거나 64비트 시스템에 10TB를 할당하는 경우 해당 메모리를 읽거나 쓰지 않는 한 해당 메모리를 위한 물리적 공간을 예약하지 않습니다.실제로는 전체 블록이 아닌 해당 큰 블록에서 터치하는 페이지에 대해서만 물리적 메모리를 예약합니다.그리고 "그 메모리를 사용하지 않는 동안"이 지나면 해당 메모리의 내용이 디스크에 복사되고 기본 물리적 메모리가 다른 용도로 사용됩니다.

이는 실제 사용 중인 malloc 구현에 매우 의존적입니다.

리눅스 아래에는 임계값이 있습니다.MMAP_THRESHOLD특정 메모리의 위치를 결정합니다.malloc()요청이 들어옵니다.

요청금액이 이하인 경우MMAP_THRESHOLD, 요청은 메모리 블록이 이미 존재하는 경우 소위 "free list"에서 가져옴으로써 충족됩니다.free()d. 그렇지 않으면, 프로그램의 "브레이크 라인"(즉, 데이터 세그먼트의 끝)이 증가하고 이 프로세스에 의해 프로그램이 사용할 수 있게 된 메모리가 요청에 사용됩니다.

free(), 프리 메모리 블록이 프리 리스트에 추가됩니다.데이터 세그먼트의 맨 끝에 충분한 여유 메모리가 있는 경우, 브레이크 라인(위에서 언급)을 다시 이동하여 데이터 세그먼트를 축소하고, 초과 메모리를 OS로 반환합니다.

요청금액이 초과하는 경우MMAP_THRESHOLD, 별도의 메모리 블록이 OS에 의해 요청되고 다음 기간 동안 다시 반환됩니다.free().

자세한 내용은 https://linux.die.net/man/3/malloc 도 참조하십시오.

언급URL : https://stackoverflow.com/questions/55294985/does-malloc-reserve-more-space-while-allocating-memory