본문으로 바로가기
TaeyoungKim.dev

스택·힙·가상 메모리 차이: page fault와 thrashing까지

CS작성 약 3분 읽기TaeyoungKim
LinkedInX

메모리가 부족하다는 메시지를 보고 스택, 힙, 가상 메모리를 모두 같은 공간으로 생각하면 원인을 좁히기 어렵다. 세 용어는 서로 연결되지만 보는 층이 다르다.

아래 그림은 호출 프레임, 동적 객체와 가상 페이지가 연결되고 필요한 페이지가 없을 때 디스크 접근이 생기는 흐름을 묶어 보여 준다.

stack memory와 heap은 무엇이 다를까?

함수 호출의 지역 변수와 반환 위치 같은 실행 문맥은 보통 stack memory에 쌓인다. 호출이 끝나면 해당 프레임이 제거된다. 너무 깊은 재귀 호출은 스택 공간을 소진해 stack overflow로 이어질 수 있다.

heap은 실행 중 크기와 생명주기가 동적으로 달라지는 객체를 두는 데 사용하는 메모리 영역이다. 더 이상 접근할 수 없는 객체를 자동으로 회수하는 런타임도 있고, 개발자가 직접 해제해야 하는 환경도 있다.

memory leak은 필요하지 않은 메모리를 계속 참조하거나 해제하지 않아 사용량이 누적되는 문제다. 가비지 컬렉션이 있어도 불필요한 참조가 남으면 회수되지 않을 수 있다.

virtual memory는 왜 필요할까?

virtual memory는 각 프로세스가 연속된 자신만의 주소 공간을 사용하는 것처럼 보이게 하고, 운영체제가 이를 물리 메모리와 보조 저장장치에 매핑하는 방식이다. 보호와 관리가 쉬워지지만 가상 주소가 곧 물리 RAM 위치라는 뜻은 아니다.

주소 공간은 일정 크기의 page로, 물리 메모리는 대응하는 frame으로 나눌 수 있다. 페이지 테이블은 가상 페이지가 어느 프레임에 있는지 연결한다.

page fault는 항상 오류일까?

page fault는 프로세스가 참조한 가상 페이지가 현재 물리 메모리에 없을 때 발생하는 예외다. 접근이 유효하면 운영체제가 페이지를 적재한 뒤 실행을 이어갈 수 있다. 유효하지 않은 주소라면 프로그램 오류로 처리된다.

따라서 page fault 횟수가 0이 아니라고 곧바로 버그라고 할 수는 없다. 다만 디스크에서 페이지를 가져오는 큰 page fault가 반복되면 지연이 커질 수 있다.

LRU LFU OPT는 무엇을 교체할까?

물리 메모리에 빈 프레임이 없으면 어떤 페이지를 내보낼지 정해야 한다.

  • LRU: 가장 오랫동안 참조되지 않은 페이지를 교체
  • LFU: 참조 횟수가 가장 적은 페이지를 교체
  • OPT: 앞으로 가장 오랫동안 사용되지 않을 페이지를 교체하는 이론적 기준

OPT는 미래 참조를 알아야 하므로 실제 구현보다 비교 기준에 가깝다. LRU와 LFU도 기록 비용과 오래된 패턴의 영향이 있어 근사 구현이나 다른 정책을 사용할 수 있다.

thrashing은 왜 생길까?

작업에 필요한 페이지 집합보다 물리 메모리가 부족하면 page fault와 교체가 지나치게 반복될 수 있다. 실제 계산보다 페이지를 넣고 빼는 데 대부분의 시간을 쓰는 상태가 thrashing이다.

locality는 프로그램이 최근 사용한 주소나 가까운 주소를 다시 사용할 가능성이 높다는 성질이다. 작업 집합과 지역성을 관찰하면 메모리 추가, 동시 작업 수 제한, 알고리즘·데이터 구조 변경 중 무엇이 필요한지 판단할 수 있다.

핵심 요약

스택은 함수 호출 문맥, 힙은 동적 객체의 생명주기와 관련된다. 가상 메모리는 프로세스 주소를 물리 메모리에 매핑하며, 필요한 페이지가 없으면 page fault가 발생한다. 교체가 과도하면 thrashing이 생긴다. 메모리 문제는 단순 사용량뿐 아니라 누수, 접근 패턴, page fault와 작업 집합을 함께 확인해야 한다.

작성자

TaeyoungKim

기초 개념을 구현과 검증, 실제 운영 판단까지 연결해 기록합니다.

#스택 메모리#힙#가상 메모리#page fault#thrashing#운영체제#개발자 영어

함께 읽으면 좋은 글