2011-11-17 3 views
25

가능한 중복 :
What and where are the stack and heap왜 메모리가 스택과 힙으로 분할 되었습니까?

나는 힙 대 스택에 대한 몇 가지 질문이 있습니다.

알아야 할 기본 사항은 스택이 힙보다 빠르지 만 제한적이라는 것입니다. (틀 렸으면 고쳐줘).

그러나 스택과 힙이 어떻게 작동하는지 항상 궁금해했습니다. RAM은 단지 하나의 메모리 덩어리이며, '스택'과 '힙'으로 나뉘어져 있지 않습니다. 그렇다면 왜 처음부터 스택과 힙의 메모리를 분할합니까?

OS는 스택에서 모든 것을 할당 할 수 있습니다 -> 모든 것이 더 빨라집니다 -> 행복한 세상?

나는 그게 사실이 아니라고 확신합니다. 하지만 왜!? 아무도 나에게 심층적 인 대답을 줄 수 있습니까?

죄송합니다.이 게시물이 어떤 사람이 만든 게시물의 복제본 인 경우 스택 및 힙과 관련된 많은 것들이 있으므로 정확한 질문을 찾을 수 없습니다. 당신이 그 중 하나를 알고 있다면, 가서 그것을 연결하십시오.

+3

http://stackoverflow.com/questions/7123936/why-is-there-a-stack-and-heheap – drdwilcox

+2

http://stackoverflow.com/questions/79923/what-and-where-are -the-stack-and-heap –

답변

6

스택은 후입 선출 할당 & 해제 순서를 필요로하기 때문에 당신은, 스택을 사용할 수 없습니다 (당신은 단지 새로운 할당 된 데이터의 할당을 해제 할 수 있습니다 즉, 스택의 일부 이전 데이터의 할당을 해제하고 일부를 유지할 수 없습니다 새로운 것).

실제로 스택을 제거 할 수 있습니다 (힙만 유지). Appel의 논문 Garbage Collection Can Be Faster Than Stack Allocation과 그의 Compiling with Continuation을 참조하십시오.

힙에는 잘 정의 된 의미가 없습니다 ("스택에없는 동적 할당 메모리"제외). 실제로 리눅스 시스템에서 mmap 시스템 호출을 사용하여 큰 메모리를 할당하는 것은 매우 빠릅니다 (그러나 malloc 구현은 mmap을 피하고 free -d 메모리를 다시 사용하는 것을 선호합니다). 문제는 작은 메모리 영역 할당입니다.

그리고 garbage collection techniques에 대해 자세히 알아보십시오. C 또는 C++에서 사용할 수 있습니다. Boehm's GC

스택은 종종 재귀 함수 호출에 유용합니다. 오늘날의 프로세서는 대개 전용 스택 포인터 레지스터 (CALL & RET 머신 명령어를 사용하여 &를 반환하는 데 사용)를 가지고 있으므로 매우 유용합니다 (예 : C). 그러나 이것이 항상 그런 것은 아닙니다. 일부 프로세서 (예 : IBM360)에서 스택 포인터는 하드 코딩 된 레지스터가 아닌 기존 레지스터입니다.

+0

매우 도움이되는 정보, thanks :) – xcrypt

0

메모리는 두 메모리에서 모두 동일하지만 스택과 힙은 서로 다른 용도로 유용한 두 가지 데이터 구조입니다.

스택은 두 개의 피연산자 (일반적으로 프로세서 레지스터 또는 메모리 주소)에 대한 명령어를 실행하기 위해 모든 마이크로 프로세서에서 필요로하는 매우 원시적 인 추상화입니다.

힙은 일반적으로 스택에 바인딩되지 않은 데이터를 저장하려는 일반 할당 메모리 영역입니다. 즉, 스택에 저장되어 있거나 다른 방법으로 데이터가 이동중인 경우 수명이 길어집니다. 코드의 다른 부분에 의한 액세스.

+0

글쎄, 나는 단지 주 함수의 스택에 어떤 객체를 할당하고, 전체 프로그램에서 그것을 사용할 수있다. 나는 그것을 위해 힙을 필요로하지 않는다. 당신의 주장은 스택이 제한적일 수 있다는 것이 었습니다. 그러나 제 질문으로 질문하고자했던 것 중 하나는 스택이 제한되어있는 이유는 무엇입니까? (위에 언급 된 이유로) – xcrypt

+0

스택은 메모리 공간 주소의 극단에서 다른 극단으로 커지기 때문에 제한적입니다. 무제한의 경우 중단이 발생하면 힙에 저장된 날짜가 손상 될 수 있습니다 (중단으로 인해 CPU 상태가 스택에 저장되므로)이를 피하기 위해 인공 한계가 있어야합니다. 그 한계에 도달하면 유명한 '스택 오버플로'메시지). –

23

스택 : 스택은 현재 실행중인 코드 블록과 현재 블록이라고하는 블록과 그 블록을 호출 한 블록 등에서 사용하기위한 일종의 임시 스크래치 패드로 사용됩니다. 현재 블록이 종료되면 사용중인 로컬 변수는 잊어 버리게됩니다. 이름에서 알 수 있듯이 스택은 마지막 선입 선출 방식으로 사용됩니다.

스택의 가장 중요한 용도 중 하나는 현재 호출 체인을 추적하는 것입니다. 한 함수가 다른 함수를 호출 할 때 호출자는 다음 명령어의 주소 (반환 주소)를 스택에 푸시합니다. 각 함수가 종료되면 호출자의 리턴 주소가 스택에서 꺼내고 그 주소에서 시작하는 코드를 계속 실행합니다. 또한 함수 매개 변수를 전달하고 호출자와 수신자간에 값을 전달하는데도 사용됩니다.

힙 : 힙은 다릅니다. 특별한 순서는 없습니다. 한 블록의 코드에 메모리를 할당하고 해당 블록의 끝을 넘어서 메모리를 사용하려면 힙에 할당해야합니다. 물론, 다른 코드가 메모리를 찾을 수 있도록 포인터/참조를 어딘가에 저장해야합니다. 대부분의 언어는 그 조절을 제공합니다.

속도 : 속도의 차이는 메모리 자체의 특성 때문이 아닙니다. 질문에서 말한 것처럼 스택과 힙 모두 일반적으로 동일한 실제 메모리에 존재합니다. 스택에 공간을 할당하는 것은 스택이 빠르기 때문에 빠릅니다. LIFO 특성 : 스택에 무언가를 밀어 넣으면 끝낼 수있는 곳이 하나뿐입니다. 반대로 힙에 블록을 할당하려면 메모리에서 충분히 큰 연속 자유 영역을 찾아야합니다. 스택 할당은 단일 명령어만큼 빠릅니다. 힙 할당은 malloc()과 같은 메모리 할당 함수를 호출해야합니다.

정적 정적 동적 : 힙의 메모리 할당은 동적입니다. 블록을 할당할지 여부와 블록의 크기는 프로그램 실행 중에 입력에 따라 결정할 수 있습니다. 힙에 할당 된 메모리 영역은 필요한 경우 크기를 조정할 수도 있습니다. 도 동적으로 스택에 메모리를 할당 할 수 있지만 (C 표준 라이브러리 함수 alloca() 참조) 현재 함수가 종료 되 자마자 해당 메모리가 손실됩니다. 스택 할당은 대개 정적입니다. 컴파일러는 (등록되지 않은) 매개 변수, 반환 데이터 및 로컬 변수에 필요한 공간을 결정하고 함수가 호출 될 때 스택에 필요한 공간을 예약하는 코드를 생성합니다.

예 : 워드 프로세서를 생성한다고 가정 해보십시오. 문서가 얼마나 큰지 미리 알 수 없으며, 동시에 얼마나 많은 문서가 사용될 지 알 수 없습니다. 동시에 사용자가 문서를 열어두기를 원할 때까지는 사용자 문서가 메모리에 남아 있기를 원합니다. 스택에있는 문서에 메모리를 할당하려고하면 한 번에 두 개 이상의 문서를 열지 못하기 때문에 문서를 작성, 편집, 저장 및 닫는 단일 함수를 만들어야합니다. 힙에 공간을 할당하면 원하는만큼 많은 문서를 만들 수 있습니다. 각각의 문서는 포함 된 데이터에 맞게 크기가 정해지고 특정 기능의 수명이 다할 때까지 문서의 수명이 다하는 것을 피할 수 있습니다.

요약 :요약하면 스택에는 현재 블록의 수명이 다 된 메모리를 할당하는 데 사용되는 변수 값 (레지스터가 사용되는 경우도 있음)이 포함됩니다.

+0

힙을 사용해야하는 지점에 대한 예를 들어 주시겠습니까? 예를 들어, 부모 함수에서 전체 프로그램에 필요한 스택에 모든 것을 할당 할 수 있으며 모든 것을 주소로 하위 함수에 전달할 수 있습니다. 편집 : 질문을 위해서 스택이 RAM 메모리가 꽉 차는 것 이외의 것으로 제한된다는 것을 무시합시다. – xcrypt

+0

@xcrypt 그러면 프로그램에서 수행 할 수있는 모든 메모리 할당을 미리 알고 있어야합니다. 또는 나중에 동적으로 메모리를 할당 할 수있는 거대한 블록을 스택에 할당 할 수 있습니다. 이 블록은 힙과 기능상 동일합니다. 위의 예제를 추가하겠습니다. – Caleb

+0

당신은 컴파일러가 런타임 전에 필요한 스택 공간의 양을 파악했다고 언급 했습니까? 재귀의 경우에도 마찬가지입니까? 그것이 맞다면 컴파일러가 코드를 컴파일 한 후에 무한 재귀를 재촉해서는 안되기 때문에? – Dubby

관련 문제