프로세스 메모리 레이아웃 - 힙, 데이터 및 mmap 영역의 차이점

프로세스 메모리 레이아웃 - 힙, 데이터 및 mmap 영역의 차이점

나는 온라인에서 Linux 프로세스의 메모리 레이아웃에 대해 상충되거나 불분명한 설명을 많이 보았습니다. 대개일반적으로 사용되는 사진좋다:

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

또 다른 공통점이 있다설명하다말할 수있다:

데이터 세그먼트에는 미리 정의된 값이 있고 수정될 수 있는 전역 또는 정적 변수만 포함됩니다. 힙에는 일반적으로 데이터 세그먼트가 끝나는 곳에서 시작되는 힙 섹션이라고 하는 메모리 부분에 저장되는 동적으로 할당된 데이터가 포함됩니다.

그리고반품:

일반적으로 힙은 C 런타임에 의해 생성 및 관리되는 특정 메모리 영역입니다 malloc( 시스템 호출을 사용하여 증가 brksbrk축소됨 ).

mmapmalloc힙에 독립적인(따라서 힙 독립적인) 새 메모리 영역을 생성하는 방법입니다. munmap그 반대의 경우에는 이러한 영역을 해제합니다.

이러한 설명 중 상당수는 시대에 뒤떨어진 것 같고 불일치도 많이 발견되었습니다. 예를 들어 위의 답변과 같은 많은 기사에서는 힙이 my 에서 사용된다고 주장 malloc하지만 실제로는 sbrkor 를 사용하는 라이브러리 호출 입니다 mmap.malloc 매뉴얼 페이지설명하다:

일반적으로 malloc()메모리는 힙에서 할당되고 sbrk(2)할당된 메모리 블록이 다음보다 큰 경우 힙은 필요에 따라 크기가 조정됩니다.MMAP_THRESHOLDbytes를 사용하는 경우 glibc malloc()구현은 .bytes를 사용하여 메모리를 개인용 익명 맵으로 할당합니다 mmap(2).

그렇다면 malloc많은 경우에 의해 구현되는 경우 mmap힙과 mmap 영역의 차이점은 무엇입니까 ?

겉보기에 모순되는 또 다른 점은 malloc맨 페이지 자체 와 같은 많은 기사가 힙 크기를 주장 brk/ 조정한다는 것입니다.sbrk매뉴얼 페이지실제로 크기가 조정된다고 하더군요데이터 세그먼트:

brk()그리고 sbrk()위치 변경프로그램 중단, 이는 프로세스 데이터 세그먼트의 끝을 정의합니다(즉, 프로그램 인터럽트는 초기화되지 않은 데이터 세그먼트의 끝 이후 첫 번째 위치입니다).

따라서 저는 오늘날 다양한 세그먼트의 프로세스 메모리 레이아웃에 대한 명확하고 최신의 전반적인 설명을 제공하려고 노력했으며, 이는 또한 이러한 문제도 해결합니다.

  1. 힙 영역과 mmap 영역의 차이점은 무엇입니까? (내가 시도한 일부 테스트에서 얻은 주소를 보고 mmap이를 의 힙 범위와 비교하면 할당된 페이지 중 일부가 실제로 힙 세그먼트 내에 할당된 /proc/self/maps것처럼 보입니다 .)mmap
  2. ~이든나머지끝을 의미한다데이터 세그먼트또는 끝더미?

기타 관련 질문:

관련 정보