컴퓨터 프로세스의 메모리 구조에는 네 가지 영역이 있다.
텍스트(TEXT) 영역, 데이터(DATA) 영역, 스택(STACK) 영역, 힙(HEAP) 영역을 말한다.
텍스트 영역과 데이터 영역은 정적 할당 영역이며, 힙 영역과 스택 영역은 동적 할당 영역이다.
텍스트(코드) 영역
프로그램의 본문이 기계어 코드 형태로 저장된다.
프로그램 시작과 함께 로딩괴며, 프로그램 종료 시까지 메모리에 남아있는다.
텍스트 영역에 저장된 코드를 하나씩 가져다 실행한다.
읽기만 가능한 메모리 영역이기 때문에 데이터를 저장하려고 하면 분할 충돌을 일으켜 프로세스가 중지된다.
수정을 할 수 없으므로 프로그램의 무결성을 유지한다.
데이터 영역
데이터 영역은 프로그램의 전역 변수와 정적 변수 등의 변수나 파일 등의 각종 데이터가 저장되는 영역이다.
프로그램 시작과 같이 할당되고, 프로그램이 종료되면 소멸한다.
전역변수나 static 값을 참조한 코드가 컴파일이 끝나면 데이터 영역의 주소값을 가리키도록 바뀐다.
전역변수가 바뀔 때도 있으므로 읽기와 쓰기 권한 모두가 주어져 있다.
힙 영역
C에선 malloc()이나 new 연산자 명령에 의해 영역이 생성되며, free()나 delete 연산자를 통해 메모리를 해제한다.
(코틀린은 GC가 직접 처리한다.)
프로그래머가 직접 공간을 할당, 해제한다.
네 영역들 중 유일하게 런타임 시에 크기가 결정된다.
메모리 주소 값에 의해서만 참조되고 사용되는 영역이다.
스택 영역
OS가 프로세스를 실행하기 위해 부수적으로 필요한 데이터(지역 변수, 매개변수 등)를 모아놓은 곳
프로세스마다 각각 사이즈가 할당되지만, 프로세스가 메모리로 로드될 때는 고정되어 있어서 런타임에는 사이즈 수정이 안된다.
함수를 호출하면 수행하고 원래 프로그램으로 되돌아올 위치를 이 영역에 저장(프로그램 카운터)
OS가 user 프로세스를 작동하기 위해 유지시키는 영역
프로그램 카운터 (PC : Program Counter)
CPU의 레지스터 중 하나로, 명령어 포인터 라고도 한다.
프로세스가 실행되면서 다음에 실행할 명령어의 위치 코드(메모리 주소)를 저장한다.
각 명령어가 실행될 때마다 프로그램 카운터는 자동으로 증가하여 다음 명령어의 주소를 가리킨다.
-> 실행 순서를 추적하고, 순서대로 명령어를 실행하도록 함
CPU가 명령어를 실행하기 전, 메모리에서 다음 명령어를 가져오는 과정을 수행하는데
이때 프로그램 카운터에 저장된 주소를 사용하여 명령어를 가져온다.
프로그램 카운터는 프로그램 제어 흐름을 결정하는 데 중요한 역할을 하는데,
분기 명령어 등을 만나면 프로그램 카운터의 값이 바뀌어 다른 곳으로 점프하여 실행을 이어나갈 수 있다.
NULL
없음, 아무것도 아님, 비어있는 값을 의미하며, 0과는 다르다.
프로그래밍이나 수학, 데이터베이스 등에서 사용되며, 각각 다른 의미로 해석될 수 있다.
Garbage Collection
힙 영역에서 이야기 했던 개발자가 C언어에서 malloc()이나 new, free()나 delete를 사용해서 메모리 할당에 관여했던 부분을
코틀린에서는 GC가 직접 해준다.
개발을 하다 생기는 유효하지 않은 메모리(이하 쓰레기 메모리)가 발생하면
JVM의 가비지 컬렉터가 쓰레기 메모리를 알아서 정리해준다.
Stack Overflow
초보들은 존재하지 않는 인덱스나 주소를 참조하려고 할 때 오류가 발생한다.
스택 영역의 메모리가 지정된 범위를 넘어갈 때 발생한다.
한 함수에서 너무 큰 지역변수를 선언하거나 함수를 재귀적으로 호출할 때
끝을 내는 조건이 없으면 Stack Overflow가 발생할 수 있다.
해결책은 Stack 영역에 넘쳐나지(Overflow) 않도록 코드를 수정한다.
또는 Stack의 크기를 늘려준다.
'코딩공부' 카테고리의 다른 글
iOS 1주차 (0) | 2025.09.01 |
---|---|
가상 메모리 (0) | 2025.05.13 |
물리 메모리 (1) | 2025.04.29 |
정규표현식, XML과 JSON, Tokenizer, Lexer, Parser, AST (2) | 2025.04.29 |
코틀린으로 서버 대기열 구축하기 (0) | 2025.04.18 |