작년 전공 수업인 운영체제에서 메모리 구조 힙(heap)을 배웠다. 또는 C++, JAVA에서 메모리 구조를 배울때도 heap을 할당 받는 과정을 공부하였다.
나는 동시에 자료구조에서 나오는 스택, 큐, 힙, 해시 테이블 등 이런데서 나오는 힙이랑 같은 이름을 가졌길래 서로 같은거라던지 매우 연관있는 줄 알았다.
나랑 비슷하게 생각하는 분들 또는 누구나 궁금할 부분인거같아 간단하게 정리를 해보았다.
먼저, 답부터 말하자면 서로 다른 의미이다.
메모리 구조에서 데이터 영역, 스택 영역, 힙 영역이 있는데, 힙 영역은 운영체제에서 프로세스가 동적으로 할당 받는 메모리 영역 중 하나이다. 프로세스가 실행하는 동안 할당된 메모리를 보관한다. malloc(),calloc(), realloc() 같은 함수를 이용하여 메모리를 동적으로 할당할때 사용되는 메모리영역이다. 따라소 힙 영역은 프로세스마다 각 별도로 존재하고 각각의 프로세스는 독립된 힙 영역을 갖는다.
반면, 자료구조에서 나오는 힙은 특정한 규칙을 가지는 완전 이진 트리(Complete Binary Tree)를 기반으로 구현되었으며, 주로 우선 순위 큐(Priority Queue)를 구현할 때 사용한다.
요약하자면, 메모리 구조에서 힙 영역은 운영체제에게 프로세스가 동적으로 할당 받는 메모리 영역이고, 알고리즘에서의 힙은 추상적인 자료구조를 의미한다.
결론적으론 같은 개념이다.하지만 , 나의 생각은 살짝 좀 더 스택 정의 자체의 의미는 자료구조의 스택이고, 메모리 구조에서의 스택은 자료구조 스택의 원리와 같은 함수 호출과 관련하여 사용되는 메모리 영역이다. 특히, 대표적으로 재귀호출 같은 함수를 저장할 때 쓰인다고 보면된다. 함수가 호출 될 때는 해당 함수의 지역 변수와 매개변수 등이 스택에 저장되는데, 함수의 실행이 완료되면 스택에서 이 값들이 제거가 된다. 이러한 스택의 특성 때문에 함수 호출과 반환에 관리가 필요해서 스택을 이용한다.
자료구조의 스택에서는 데이털르 저장하고 꺼내는 작업이 주요 기능이며, 후입선출(LIFO,Last In First Out)의 구조를 가지고 있다. 이러한 스택의 특성 때문에 스택은 대표적으로 함수 호출 스택, 웹 브라우저의 페이지 이전 기능, 미로 찾기 등 다양한 문제를 해결하는데 사용한다.
요약하자면, 메모리 구조의 스택은 함수 호출과 관련된 메모리 영역을 의미하고, 자료구조의 스택은 데이터를 저장하는 자료구조를 의미한다.
프로세스와 스레드의 차이점 중 하나가 스레드는 각각 스택 메모리와 PC(Program counter)를 갖고 있지만, 힙 영역과 코드영역은 프로세스 내에서 공유한다.
즉, 프로세스와 스레드의 가장 큰 차이점은 메모리와 자원의 공유 여부이다. 프로세스는 각각 독립된 메모리 공간을 갖고 완전히 분리되어있는 반면, 스레드는 하나의 프로세스 내에서 공유된 자원을 이용한다. 상대적으로 가벼워 빠르게 생성되고 삭제도 된다.
이해가 잘 가네요! 잘 보고 갑니다~!