malloc은 힙에 연속된 가상 메모리를 할당하지 않습니까?

malloc은 힙에 연속된 가상 메모리를 할당하지 않습니까?

커널이 매핑에 적합한 가상 주소를 선택하도록 내부적으로 malloc호출되고 첫 번째 인수로 전달된다는 것을 mmap알고 NULL있습니다 . 이는 매핑이 반드시 힙 영역(brk 포인터로 표시됨)에 생성되지 않음을 의미합니다. 이것이 사실이라면, 여러 번의 호출 후에 가상 메모리의 각 블록 사이에 많은 간격이 있을 것임을 의미합니다. 각 호출은 이전 주소와 연속되지 않는 새로운 가상 주소를 반환하기 때문입니다.mmapmallocmallocmalloc

내 질문:

  1. 각 블록 사이에 틈이 있다면 brk존재할 이유가 있을까요? brk아래 그림과 같이 정의가 힙의 상단을 가리키기 때문입니다 .

    여기에 이미지 설명을 입력하세요.

    첫 번째 블록이 malloc힙(위 그림의 첫 번째 블록)에서 블록을 가져오고 두 번째 블록은 malloc시작 주소가 첫 번째 블록보다 낮은 두 번째 블록을 가져온 다음 brk첫 번째 블록의 끝 또는 끝을 가리킨다 고 가정합니다. 두 번째 블록의? 다음은 문제를 설명하는 그림입니다.

    여기에 이미지 설명을 입력하세요.

  2. 따라서 특정 블록을 해제하면 할당자는 일반적으로 인접한 사용 가능한 블록을 병합하여 이 세 블록을 하나의 큰 사용 가능한 블록으로 결합해야 합니다. 하지만 이제 각 블록은 가상 메모리에서 연속되어 있지 않기 때문에 이러한 블록을 병합하고 해제할 수 없으므로 이러한 동적 메모리 할당은 매우 비효율적이지 않습니까?

답변1

  1. malloc사용시 mmap프로그램 중단에 대해 걱정하지 마십시오. malloc이는 두 가지 메모리 세트를 사용합니다. 즉, 자체적으로 관리하는 힙(프로그램 인터럽트 전 영역)(GNU C 라이브러리의 아레나 사용)과 프로그램 인터럽트가 첫 번째 메모리 세트를 추적하는 mmaped 할당입니다 . mmap, 두 번째는 아닙니다. 두 번째 것이 연속적일 필요는 없습니다.

  2. 해제된 블록은 해당 할당자에 의해 병합됩니다. malloc없이 메모리를 할당한 경우 mmap이는 malloc(또는 s)의 책임 입니다 free. 를 사용하여 메모리를 할당한 경우 mmap이는 (또는 ) mmap의 책임 입니다. ed 블록 munmap의 경우 mmap사용 가능한 블록을 병합하는 것이 의미가 없을 수도 있습니다. 주소 공간에서 제거되면 아무 작업도 수행할 수 없습니다. ed 블록 병합이 발생할 수 있지만 mmap두 개의 주소 공간 할당이 연속적이고 동일한 권한을 갖는 경우 할당 시 발생합니다.

관련 정보