Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

후레임의 프로그래밍

스택과 힙은 무엇이며 어디에 있습니까? 본문

스택오버플로우(Stack Overflow)

스택과 힙은 무엇이며 어디에 있습니까?

후레임 2020. 10. 25. 21:17
질문

 

프로그래밍 언어 책에서는 값 유형이 스택에 생성되고 참조 유형이 에 생성된다고 설명하지만이 두 가지가 무엇인지 설명하지 않습니다. 나는 이것에 대한 명확한 설명을 읽지 못했습니다. 스택이 무엇인지 이해합니다. 하지만

  • 물리적으로 실제 컴퓨터의 메모리에있는 위치와 내용
  • OS 또는 언어 런타임에 의해 어느 정도 제어됩니까?
  • 범위는 무엇입니까?
  • 각 항목의 크기는 어떻게 결정 되나요?
  • 무엇이 더 빨라지나요?



답변

스택은 실행 스레드를위한 스크래치 공간으로 따로 설정 한 메모리입니다. 함수가 호출되면 스택의 맨 위에 지역 변수와 일부 부기 데이터를 위해 블록이 예약됩니다. 해당 함수가 반환되면 블록은 사용되지 않고 다음에 함수가 호출 될 때 사용할 수 있습니다. 스택은 항상 LIFO (last in first out) 순서로 예약됩니다. 가장 최근에 예약 된 블록은 항상 해제 될 다음 블록입니다. 이렇게하면 스택을 추적하는 것이 정말 간단 해집니다. 스택에서 블록을 해제하는 것은 하나의 포인터를 조정하는 것입니다.

힙은 동적 할당을 위해 따로 설정 한 메모리입니다. 스택과 달리 힙에서 블록을 할당 및 할당 해제하는 데 적용되는 패턴이 없습니다. 언제든지 블록을 할당하고 해제 할 수 있습니다. 이로 인해 주어진 시간에 힙의 어떤 부분이 할당되었는지 또는 해제되었는지 추적하는 것이 훨씬 더 복잡해집니다. 다양한 사용 패턴에 대해 힙 성능을 조정하는 데 사용할 수있는 많은 사용자 정의 힙 할당자가 있습니다.

각 스레드는 스택을 가져 오지만 일반적으로 애플리케이션에 대해 하나의 힙만 있습니다 (다양한 유형의 할당에 대해 여러 힙을 갖는 것은 드문 일이 아닙니다).

질문에 직접 답변하려면 :

OS 또는 언어 런타임에 의해 어느 정도까지 제어 되나요?

OS는 스레드가 생성 될 때 각 시스템 수준 스레드에 스택을 할당합니다. 일반적으로 OS는 애플리케이션에 힙을 할당하기 위해 언어 런타임에 의해 호출됩니다.

범위는 무엇입니까?

스택은 스레드에 연결되므로 스레드가 종료되면 스택이 회수됩니다. 힙은 일반적으로 런타임에 응용 프로그램 시작시 할당되며 응용 프로그램 (기술적 프로세스)이 종료 될 때 회수됩니다.

What determines the size of each of them?

스레드 크기는 스레드가 생성 될 때 설정됩니다. 힙의 크기는 애플리케이션 시작시 설정되지만 공간이 필요할 때 커질 수 있습니다 (할당자가 운영 체제에서 더 많은 메모리를 요청 함).

무엇이 더 빠르게 만들까요?

스택은 액세스 패턴이 메모리를 할당하고 할당 해제하는 것을 사소하게 만들기 때문에 (포인터 / 정수는 단순히 증가 또는 감소됨) 힙에는 할당 또는 할당 해제와 관련된 훨씬 더 복잡한 부기가 있습니다. 또한 스택의 각 바이트는 매우 자주 재사용되는 경향이 있으므로 프로세서의 캐시에 매핑되는 경향이있어 매우 빠릅니다. 힙의 또 다른 성능 저하는 대부분 전역 리소스 인 힙이 일반적으로 다중 스레딩 안전해야한다는 것입니다. 즉, 각 할당 및 할당 해제는 일반적으로 프로그램의 "모든"다른 힙 액세스와 동기화되어야합니다. 

 

A clear demonstration:


Image source: vikashazrati.wordpress.com



출처 : http://stackoverflow.com/questions/79923