malloc()에 의해 할당된 메모리 영역은 무엇입니까?

malloc()에 의해 할당된 메모리 영역은 무엇입니까?

나는 library 를 사용하여 다중 스레드 C 프로그램을 작성하고 있습니다 pthread. 프로그램은 malloc()스레드와 메인 스레드에서 호출됩니다. 반환된 메모리 주소를 확인해 보니 malloc()메인 스레드에 반환된 주소는 malloc()프로그램의 힙 부분 주소인 일반적인 주소(예: 0x80874a0)입니다. 그러나 malloc()(생성된) 다른 스레드에 의해 반환된 주소는 pthread_create()약간 특이합니다. 주소는 주소 공간에서 높습니다(0x7ffa87000a60은 스택 섹션의 주소와 약간 비슷해 보입니다). 스레드 스택 변수 중 하나의 주소를 분석한 후 반환된 주소가 malloc()스레드 스택 근처에 있는 것으로 나타납니다.

내가 아는 한 혼란스러워서더미프로그램의 일부는 프로그램의 모든 스레드에서 공유되므로 모든 호출은 malloc()서로 가까운 주소를 반환해야 합니다. 주소에서 시작하는 주소를 반환해야 합니다. 그러나 그것은 확실히 사실이 아닙니다.

답변1

정의에 따르면, malloc에서 얻는 것은 "힙"입니다. 그래서 이것들은 모두 힙입니다.

GNU libc에 대한 문서 에서는 이 작업을 "경기장"( )에서 수행한다고 malloc설명합니다 .man malloc

다중 스레드 애플리케이션에서 메모리 할당을 확장 가능하게 처리하기 위해 glibc는 뮤텍스 경합이 감지되면 추가 메모리 할당 영역을 만듭니다. 각 경기장은 시스템에서 내부적으로 할당( brk(2)OR 사용 mmap(2))하고 자체 뮤텍스를 사용하여 관리되는 대규모 메모리 영역입니다.

내가 아는 한 프로그램의 힙 부분은 프로그램의 모든 스레드에서 공유되기 때문에 혼란스럽습니다.

"힙"은 일반적으로 내가 가장 좋아하는 용어가 아닙니다. 다양한 개념을 결합합니다.

  • (더미데이터 구조입니다. 커널의 메모리 관리 데이터 구조 및/또는 malloc힙에 의해 생성된 메모리 관리 데이터 구조가 힙인지 여부는 확실하지 않습니다(대개는 그렇지 않습니다). 따라서 이는 이미 혼란의 원인입니다. )
  • 더미메모리 보호 및 가상 주소가 있는 운영 체제에서 청크를 가져와 내부적으로 사용 중인 것으로 표시하는 프로세스 공간의 특정 영역 malloc(별도의 테이블, 힙,... 또는 프로세스가 시작되기 전의 헤더) 자체). 그러므로 모호한 용어이다. brk실제 메모리를 실제로 점유하지 않고도 필요에 따라 프로세스 가상 메모리를 확장 할 수 있습니다 . 따라서 추가로 10GB의 공간을 얻은 다음 두 개의 서로 다른 시작 주소(5GB 간격)가 있는 두 개의 서로 다른 메모리 영역을 할당합니다. 이것은 하나의 힙이고 두 개의 영역입니까? 각각 자체 힙이 있는 두 지역이 있습니까? 문학계는 이에 동의하지 않는다. 가상 메모리 공간의 끝을 확장하여 두 곳의 메모리 지원을 중단 brk하기로 결정 하면 mmap어떻게 되나요 ? 그럼 이 두 더미는요?

따라서 "힙"이 무엇을 의미하는지로 요약됩니다.당신의책 및 특정 malloc구현이 실제로 메모리를 예약하는 방법에 대해 설명합니다.

답변2

"큰" 할당(페이지 크기에 비해 큰)의 경우 GNU C 라이브러리 구현malloc 사용mmap. 아마도 이것이 여러분이 여기서 보고 있는 것일 것입니다. 첫 번째 할당은 malloc아레나를 사용하여 처리되고, 두 번째 할당은 mmap더 높은 주소를 사용하여 처리됩니다.

바라보다커널에서 프로세스 메모리 측정값이 얼마나 빠르고 자주 업데이트됩니까?이 동작을 설명합니다.

관련 정보