문제

가능한 복제물 :
힙과 스택 메모리는 어떻게 관리되고, 구현되고, 할당 되었습니까?
C ++의 스택, 정적 및 힙

C/C ++에서는 변수, 기능, 멤버 기능, 클래스 인스턴스를 스택 또는 힙에 저장할 수 있습니다.

각각은 어떻게 구현됩니까? 어떻게 관리됩니까 (높은 수준)? GCC가 스택과 힙에 사용될 메모리 덩어리를 Preallocing으로, 요청시 Doles를 배치합니까? 원래 메모리가 RAM에서 나오고 있습니까?

스택 대신 힙에 함수를 할당 할 수 있습니까?

             --Clarification--

힙 및 스택 추억의 구현 및 관리에 대해 정말로 묻고 있습니다. 참조 된 질문을 읽은 후 나는 그것을 다루는 것을 찾지 못했습니다 ... 링크 감사합니다

도움이 되었습니까?

해결책

나는 당신의 질문에 하나가 운영 체제에 관한 책의 적어도 일부 장을 쉽게 쓸 수 있다고 생각합니다. Tanenbaum : 현대 운영 체제를 읽는 것이 좋습니다.

힙과 스택의 주요 차이, 하나는 프로세스마다, 다른 하나는 스레드 항목 당입니다. 처음에 프로그램이 시작되면 최소 힙과 스택 세그먼트가됩니다. 힙은 성장하고 스택은 정적입니다 (각 스레드마다). 종료되지 않는 재귀 함수를 쓰면 (끝없는 재귀) 스택 오버 플로우가 나타납니다.) 함수 호출은 스택 세그먼트에 스택 프레임이 있습니다. 함수가 잎이 풀리면 스택이 풀리고 프레임이 무료로 사용할 수 있습니다. 다음 기능. 스택은 연속 선형 구조입니다. Linux에서는 환경 변수를 통해 프로세스의 스택 세그먼트 크기를 구성 할 수 있습니다. Windows에서 (적어도 MS Visual C ++의 경우) 스택 세그먼트 크기의 링커 플래그를 전달할 수 있습니다. 컴파일 타임에 할당 할 때 스택 오버 플로우를 생성 할 수도 있습니다.

char test[1000000];

힙은 다른 이야기입니다. 프로세스가 힙 크기를 시작하면 일부 기본값이며 해당 OS에서 OS에 대한 양식 OS 또는 구성을 변경할 수 있습니다 (예 : Windows의 구성은 기본적으로 2MB입니다). 또한, 더 많은 힙이 필요하면 변수 등을위한 더 많은 공간을 할당하기 위해 더 많은 공간을 할당합니다. 프로그램이 힙 메모리를 자유롭게하지 않으면 (또는 힙 스페이스) 프로그램이 떨어집니다. 힙 구현을위한 다른 데이터 구조가 있습니다. 그중 일부는 이진 트리 파생 상품이며, 일부는 피보나키 힙 (Trees of Trees)이 아닙니다. 메모리 할당자를 작성하는 방법에 대한 기사 등을 읽을 수 있습니다. 이 데이터 구조는 할당 된 청크를 할당 할당하거나 새로운 힙 공간이 필요한 경우 추가 (무료 청크 찾기)가 필요할 때 힙 노드를 찾기 위해 최적화되어야합니다.

32 비트 OS의 각 프로세스에는 4GB의 가상 주소 공간이 있습니다. 당신이 상상할 수 있듯이, 4GB의 가상 주소 공간이 적합한 모든 프로세스가 적합한 곳은 너무 많을 수 없습니다. OS 메모리는 페이지로 구성되어 있으며 더 이상 필요하지 않거나 만료되지 않은 경우 HD로 교체됩니다. 페이징이 시작되는 곳입니다. 모든 것이 페이지에 매핑됩니다 : 스택 또는 힙이 증가하는 프로세스. 힙의 구조로 인해 동적으로 자라는 구조로 인해 여러 페이지에 배치 할 수 있습니다. 페이지가 메모리에 있지 않으면 페이지 오류가 발생하고 OS가 디스크에서 페이지를로드해야하기 때문에 힙 액세스가 매우 비쌀 수 있습니다. 실행중인 스레드의 스택 프레임은 프로세서 캐시에 있으며 RAM과 같이 훨씬 빠릅니다.

다른 힙 유형이 가능하며, 다중 스레드 환경에서 매우 효율적인 작은 물체 또는 힙에 대해 매우 빠른 힙이있을 수 있습니다. Alexandrescu는 "현대 C ++ 디자인"에서 작은 물체 할당자를 개발하는 방법과 작은 물체를 관리하는 힙을 설명합니다. 이 구현은 그의 Loki C ++ 라이브러리에서 제공됩니다. 일부 임베디드 시스템은 물리적으로 다른 메모리 영역을 제공하며, 여기서 다른 힙 유형을 ONTOP로 구현할 수 있습니다. 컴파일러를이기려면 자체 할당 자 (힙 관리자 등)를 작성하는 것은 어려운 일입니다.

문안 인사,
난소

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top