2010-11-20 6 views
2

가능한 중복 :
How is heap and stack memories managed, implemented, allocated?일반적으로 힙은 어떻게 구현됩니까?

안녕하세요, 내 질문에 힙이 아닌 데이터 구조,하지만 동적 메모리 할당에 사용되는 메모리 영역에 관한 것입니다.

C (또는 C++의 경우)와 코드 깊이의 어딘가에 프로그램을 작성한다고 가정하면 malloc()을 호출하거나 C++의 경우 new 연산자를 호출합니다. 이제 할당 된 메모리의 위치는 무엇입니까? 컴파일러 (링커?)가 힙으로 사용되는 데이터 세그먼트를 추가합니까? 해당 세그먼트의 크기는 어떻게 결정됩니까? 전체 "힙 세그먼트"보다 큰 메모리 덩어리를 할당하려고하면 어떻게됩니까? 힙이 확장됩니까? 그렇다면 어떻게?

답변

2

OS는 malloc/free로 반환하는 페이지를 할당하고 메모리에서 요청 된 크기의 블록으로 페이지를 나눕니다. OS는 아직 요청되지 않은 사용자 주소 공간의 페이지를 할당 할 수 있습니다. 힙 세그먼트가 없습니다. 할당 된 메모리는 OS가 결정하는 위치에 있습니다.

+0

그렇다면 보호 기능은 어떻게 작동합니까? 메모리를 동적으로 할당 할 때 프로세스 만이 프로세스에 액세스 할 수 있습니다. 다른 프로세스가 읽기/쓰기 작업을 수행하려고하면 오류가 발생합니다. 페이지가 특정 프로세스에 속하는 것으로 표시되어 있습니까? –

+0

@grigory, 아니요. 페이지는 페이지 테이블 (x86의 경우 P 또는 V 비트)에서 유효 또는하지 않음으로 표시됩니다. PTE의 R/W 비트도 있습니다. '활성'페이지 테이블 세트는 프로세스 컨텍스트 전환시 새로 활성화 된 프로세스의 전환으로 "전환"됩니다. 모든 프로세스는 고유 한 페이지 디렉토리 (== 페이지 테이블 집합, 페이지 집합 + 속성 세트 포함)를 가지고 있습니다. –

+3

@Grigory : 내 프로세스의 페이지가 다른 프로세스에 존재하지 않습니다. 가상입니다. OS는 가상 페이지를 실제 페이지에 매핑합니다. 가상 메모리를 체크 아웃해야합니다. – Puppy

0

오래된 유닉스 구현기구 sbrk() - 마지막 데이터 섹션 경계를 이동하는 시스템 요청을 사용했습니다. 메모리가 할당되면 Tuntime Library는 시스템을 호출하여 데이터 경계를 위로 이동시키고 새로 오는 메모리를 사용합니다.

새로운 운영 체제는 가상 메모리를 사용하므로 malloc은 필요할 때 시스템에서 새로운 무료 VM 페이지를 요청합니다.

독립 실행 형 응용 프로그램 (베어 하드웨어, 마이크로 컨트롤러 등에서 실행)에는 모두 할당 된 메모리가 있습니다. 링커 스크립트는 동적 영역에 대한 심볼을 정의하기 때문에 라이브러리는 모든 메모리를 알고 있습니다. E. g. 가장 낮은 및 가장 높은 사용 가능한 메모리 영역 위치에 대해 freemembotfreememtop과 같은 것입니다.

+0

문자열 해석 기능인'strpbrk '가 아니라'sbrk'라고 생각합니다. :-) –

+0

@R .. : 예, 당신 말이 맞아요, 그것은'sbrk()'입니다. 답변이 수정되었습니다. :) – Vovanium

0

dlmalloc (glibc, uClibc 및 많은 다른 장소에서 사용되는 malloc() 구현)의 내부 동작에 대한 설명이 here입니다.

  • BRK()/상기 데이터 세그먼트를 확장 수축 :

    유닉스와 같은 운영체제는/해제 메모리를 요구하는 두 가지 인터페이스를 갖는다.

  • mmap()/munmap() 추가 메모리 매핑을 요청/해제합니다.

Windows API는 실제로 HeapAlloc()/HeapFree()와 같은 기능을 가진 malloc()/free()입니다.

+0

Glibc의'malloc'은'dlmalloc'에서 꽤 많이 갈라졌습니다. –

관련 문제