질문
프로그래밍 언어 책은이 두 가지 가이 두 가지가 무엇인지 설명하지 않고도 가치 유형이 스택에 작성되고 참조 유형이 힙에 생성된다는 것을 설명합니다.나는 이것에 대한 명확한 설명을 읽지 못했습니다.나는 스택이 무엇인지 이해합니다.하지만,
- Where and what are they (physically in a real computer's memory)?
- To what extent are they controlled by the OS or language run-time?
- What is their scope?
- What determines the size of each of them?
- What makes one faster?
답변
스택은 실행 스레드를위한 스크래치 공간으로 제외 된 메모리입니다.함수가 호출되면 블록은 로컬 변수 및 일부 부기 데이터의 스택 상단에 예약되어 있습니다.이 함수가 반환되면 블록이 사용되지 않고 다음에 함수가 호출 될 때 사용할 수 있습니다.스택은 항상 Lifo (마지막으로 처음 출력) 순서로 예약됩니다.가장 최근에 예약 된 블록은 항상 해제 할 다음 블록입니다.이렇게하면 스택을 추적하는 것이 정말 간단합니다.스택에서 블록을 해제하는 것은 하나의 포인터를 조정하는 것 이상입니다.
힙은 동적 할당을 위해 모뎀이 설정된 메모리입니다.스택과 달리 힙에서 블록의 할당 및 할당에 적용되는 패턴이 없습니다.언제든지 블록을 할당하고 언제든지 무료로 할 수 있습니다.이렇게하면 주어진 시간에 힙의 일부가 할당되거나 자유롭게되는지를 추적하는 것이 훨씬 더 복잡해집니다.다양한 사용 패턴에 대한 힙 성능을 조정할 수있는 많은 사용자 정의 힙 할당자가 있습니다.
각 스레드는 일반적으로 응용 프로그램에 대해 일반적으로 하나의 힙이 있지만 (다른 유형 할당 유형에 대해 여러 개의 힙을 갖는 것이 아플 꺼리는 것이 아닙니다).
귀하의 질문에 직접 답변하려면 다음을 수행하십시오.
To what extent are they controlled by the OS or language runtime?
OS는 스레드가 생성 될 때 각 시스템 레벨 스레드에 대한 스택을 할당합니다.일반적으로 OS는 응용 프로그램의 힙을 할당하기 위해 언어 런타임에 의해 호출됩니다.
What is their scope?
스택이 스레드에 부착되므로 스레드가 스택을 빠져 나가면 다시 회복됩니다.힙은 일반적으로 런타임에 의해 응용 프로그램 시작시에 할당되며 응용 프로그램 (기술적으로 프로세스)이 종료 될 때 재생됩니다.
What determines the size of each of them?
스택의 크기는 스레드가 생성되면 설정됩니다.힙의 크기는 응용 프로그램 시작시 설정되지만 공간이 필요하므로 성장할 수 있습니다 (할당자는 운영 체제에서 더 많은 메모리를 요청합니다).
What makes one faster?
액세스 패턴은 액세스 패턴으로 인해, 힙은 할당 또는 할당 위치에 훨씬 더 복잡한 부기가 훨씬 더 복잡하거나 딜할로운에 관여하는 동안 액세스 패턴이 사소한이므로 스택이 더 빠릅니다.또한, 스택의 각 바이트는 매우 자주 재사용되는 경향이 있으며, 이는 프로세서의 캐시에 매핑되는 경향이 있으므로 매우 빠르게 만듭니다.힙에 대한 또 다른 성능은 대부분 전역 자원이되는 힙은 일반적으로 다중 스레딩 안전이어야한다는 것입니다. 각 할당 및 할당은 일반적으로 프로그램의 "모든"다른 힙 액세스와 동기화되어야합니다.

Image source: vikashazrati.wordpress.com
Image source: vikashazrati.wordpress.com
출처:
https://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap
최근댓글