동적 메모리 할당에 힙은 언제 사용됩니까?

동적 메모리 할당에 힙은 언제 사용됩니까?

메모리 할당에 관한 모든 기사는 메모리 할당 방법을 설명하거나 힙과의 관계를 고려하지 않고 사용하는 mmap방법을 설명하는 것 같습니다 .sbrk

나는 힙이 메모리 할당에서 거의 중요하지 않은 역할을 한다는 것을 알았습니다. 사실, 그것이 무엇을 하는지는 잘 모르겠습니다 :D, 누군가 나를 혼동하지 말라고 간청합니다.


이것이 내가 이해하는 방법입니다.

1) 메모리가 할당되면 초기화되지 않은 데이터 세그먼트의 끝인 BSS가 확장됩니다. 이러한 확장( x예: 주소 이동 x-n)은 호출의 결과로 발생합니다 sbrk. 이 모델에서는 nBSS 세그먼트 시작 부분의 바이트 수를 줄이기 위해 메모리가 할당됩니다(각 주소에 대해 1바이트 가정). sbrk이 모델은 이제 더 이상 사용되지 않습니다. 어떤 사람들은 힙을 그러한 모든 확장의 집합 공간으로 정의합니다. 다른 사람들은 그렇지 않습니다. 후자의 경우 힙은 무엇을 합니까?

2) 최신 메모리 할당 체계에서는 힙이 존재합니다(무슨 이유인지 저도 잘 모르겠습니다). 메모리를 할당하기 위해 데이터는 페이지 모음으로 메모리 영역에 malloc내부적 으로 저장됩니다. mmap이러한 메모리 영역은 힙과 독립적입니다.


요약:

이전 시스템의 경우: 끝 BSS에서 오프셋을 증가시킨 후 얻은 주소 공간에 메모리 할당이 저장되면 힙이 사용됩니까?

최신 시스템의 경우: mmap이 주로 메모리 할당에 사용된다고 가정하면 힙의 목적은 무엇입니까?

두 경우 모두 힙이 실제로 어떤 용도로 사용됩니까?

답변1

mmapsbrk프로세스에 주소 공간을 할당하기 위해 커널이 제공하는 시스템 호출입니다 . 이러한 호출은 가상 주소의 매핑을 물리적 페이지 프레임으로 변경합니다. 이러한 맵의 주소 제한을 벗어나는 메모리 주소 지정은 엄격히 금지되며 분할 오류가 발생합니다. 이것은 커널이 프로세스에 제공하는 저수준 인터페이스입니다. brk주소로 끝나는 메모리 영역을 일반적으로 힙이라고 합니다.

malloc커널은 또는 에 대해 아무것도 모릅니다 free. 이는 libc의 라이브러리 함수입니다. Libc는 데이터 구조를 유지하고 메모리 할당 관점에서 어떤 메모리 영역이 비어 있는지 기록합니다. 예를 들어 Libc 가 동적 메모리 할당을 구현하는 방법에 malloc따라 매핑을 확장합니다.sbrkmmapmalloc

답변2

"힙"은 낮은 수준의 구현이 아닌 높은 수준의 아이디어입니다. C 언어에서 힙은 malloc()할당을 제공하는 데 사용되는 메모리 풀입니다.

다음은 재미있고 간단한 메모리 할당자 구현입니다.

static char *heap[1000000];
int top = 0;

void *malloc(int size) {
    void *ret = &heap[top];
    top += size;
    return ret;
}

void free(void *ptr) {
    /* Eh; freeing is too hard */
    return;
}

이는 나쁜 할당자이지만 올바른 종류의 프로그램의 경우 시스템과 컴파일러가 메모리 정렬과 같은 사항을 허용한다면 작동할 수 있습니다 . 힙은 배열이며 , 배열을 heap[]사용하거나 어셈블하는 대신 배열 선언을 사용하여 컴파일 타임에 이를 빌드합니다 .sbrk()mmap()

"실제" 할당자는 동일한 방식으로 작동합니다. 호출 되면 malloc()메모리 풀(힙)의 작은 부분을 차지하고 해당 할당을 위해 예약합니다. 두 가지 중요한 차이점이 있습니다.

  • 실제 할당자는 free()나중에 다시 사용할 수 있도록 할당하는 방법을 알고 있습니다.
  • 기존 블록이 모두 가득 차면 실제 할당자는 sbrk()운영 체제에 더 많은 메모리를 요청하여(또는 사용) 힙 크기를 늘릴 수 있습니다.mmap()

관련 정보