해결된 질문
작성
·
678
0
stack은 thread가 사용하고 heap은 process가 사용한다고 말씀하셨고 각 stack별로 용도가 다르고 heap은 공용으로 사용하는 주거 공간이라고 설명해주셨습니다.
비유적으로 설명해주셔서 실제로 다른 곳에서는 어떻게 정리되어있는지 궁금해서 찾아봤는데 stack은 함수가 호출되면서 지역 변수와 매개변수가 저장되는 영역, heap은 사용자에 의해 메모리 공간이 동적으로 할당되고 해제되는 영역이라고 설명이 되어있었습니다.
(찾아본 글: https://junghyun100.github.io/%ED%9E%99-%EC%8A%A4%ED%83%9D%EC%B0%A8%EC%9D%B4%EC%A0%90/)
두 가지의 설명을 어떻게 연결(?)시켜서 이해할 수 있을지 모르겠습니다.
답변 1
3
스레드는 한 프로세스 내부에 존재하는 개별적인 연산흐름입니다. 여기서 연산의 흐름이라는 것은 함수내부 코드 연산을 의미하며 함수가 다른 함수를 호출하는 방식으로 이어집니다. 이 모든 과정에서 함수의 매개변수와 함수 내부 (자동)변수들이 사용할 메모리 영역이 Stack 구조로 관리됩니다. 즉, 한 스레드마다 고유한 스택 메모리를 갖습니다.
한 프로세스(한 가구) 안에 스레드가 3개 실행 중이면 각 스레드(각자 따로 움직이는 사람)는 자신만의 고유한 스택 메모리(각자의 방)를 갖습니다. 그러나 스레드 내부에서 동적 할당하는 메모리는 힙 영역(거실공간)을 사용하며 힙 영역은 특정 스레드에 종속되지 않는 공용 공간으로 이해하시면 되겠습니다.
힙 영역과 스레드 원자성은 관련이 없습니다. 스택은 보통 1MB 정도 밖에 되지 않습니다. 그러나 힙 영역은 수 GB 정도 크기를 갖습니다. 즉, 큰 메모리가 필요할 때 사용하는 것입니다. 그러므로 스레드 동기화 혹은 원자성 등에 관한 것과 힙 메모리 사용은 분리해 생각하시기 바랍니다. 감사합니다.
'각 스레드가 자신만의 고유한 스택 메모리를 갖고 스레드가 힙 영역을 사용하여 메모리를 동적 할당할 수 있다' 라고 이해를 했는데 맞다면 하나의 스레드가 힙 영역 전체를 차지할 수 있나요? 다른 스레드가 사용할 수 있는 힙 영역이 없다면 deadlock이 걸렸다고 볼 수 있을까요?
'스레드가 힙 영역을 사용하여 메모리를 동적 할당 할 수 있다.'라는 내용은 맞지 않습니다. 스레드로 실행 중인 코드에서 메모리를 동적할당 하면 결과적으로 힙영역을 사용하게 되는 것입니다. 말장난같지만 비교해 생각해보시기 바랍니다.
스레드 내부에서 힙영역 전체를 소모 할 수 있습니다. 그렇게 되면 데드락이 걸리는 것이 아니라 메모리 부족에 따른 오류가 발생합니다. 데드락은 동기화와 관련해 발생하는 논리적 오류이며 힙영역과는 관련이 없습니다. 참고하시기 바랍니다.
답변 감사합니다.
스택 영역은 이해가 가는데 힙 영역에 대한 이해가 잘 안됩니다.
힙 영역이 특정 스레드에 종속되지 않는 공간이라면 이 공간이 스레드가 원자성을 가지기위해 만들어진 것인가요?