Code (코드영역)
- 개발자가 작성한 모든 코드가 기계어(0101…)로 변환되어 올라가 있는 공간
- 컴파일 타임에 결정 (코드영역의 크기, 코드가 기계어로 변환)
- Read-Only로 중간 코드를 바꿀 수 없음
- 텍스트 영역이라고도 함
- 프로그램이 시작하고 종료될 때 까지 메모리에 남아있음
- CPU는 코드 영역에 저장된 명령어를하나씩 가져가서 처리함
Data (데이터 영역)
- 프로그램이 종료될 때까지 지워지지 않을 데이터 저장 (전역변수, static변수 등이 저장되어 있는 공간)
- 컴파일 타임에 결정
- 코드영역과 마찬가지로 프로그램이 시작하고 종료될 때 까지 메모리에 남아있음
Heap (힙 영역)
- 런타임 시점에 힙이 현재 사용하고 있는 크기가 결정됨
- 메모리 할당을 사용하지 않은 영역을 찾아 할당하는 방식(동적할당)이므로 좀 복잡함 (속도가 느림)
- 프로그래머가 직접 공간을 할당, 해제함
- 데이터를 저장하긴 하는데 조금 오래 저장해야하는 데이터를 저장함 → 필요 없어지면 할당 해제 해야함
- 파이썬과 같이.. 메모리 공간의 자료형을 바꿔 저장해도 되는 이런 언어들은 데이터를 힙에 저장함
- (swift 외에도 적용되는지 모르겠지만..) swift에서 길이가 긴 문자열(15개정도 이상)을 저장하면 stack이 아닌 heap에 저장됨
Stack (스택 영역)
- 스택영역의 최대 제한 크기: 컴파일 시점에 결정 스택영역의 사용중인 크기: 런타임 시점에 결정
- 최대 크기가 제한되어 있음
- LIFO 방식으로 메모리 구조가 단순함
- 메모리 주소 끝부터 스택이 쌓임(높은 주소부터 메모리 할당)
- push로 데이터를 저장, pop으로 데이터를 인출
- 잠깐 사용하고 삭제하는 데이터(지역변수와 매개변수)가 할당되는 영역 → 함수 호출시 할당되며, 함수가 끝나면 지역변수, 매개변수를 포함한 함수의 메모리 공간이 사라진다.
내가 궁금했던 점들..^^
Q. 스택이 위에서 아래로 쌓이는 그림도 있는데 왜 아래로 쌓이는가?
A. 메모리 주소 끝부터 스택이 쌓이기 때문 (위 그림은 반대로 그려둠)
Q. 스택영역은 컴파일 시점에 결정된다고 하는데 스택오버플로우가 런타임 시점에 발생하는 이유?
A. 컴파일 시점에 결정되는 스택영역은 스택영역의 최대 크기가 결정되는것 스택영역의 사용중인 크기는 런타임 시점에 결정됨 컴파일 시점에 정해진 최대 공간을 넘었을 때 스택오버플로우가 발생함 무한루프가 발생하는 함수는 컴파일 시점에 알 수 없음 (그 함수를 호출하지 않으면 무한루프 함수가 실행될 일이 없기 때문)
Q. 컴파일 시점에 결정되는 스택 영역의 최대 제한 크기는 어떻게 결정되는가?
A. 컴파일러가 알아서 결정해 줌. (어떤 알 수 없는 조건에 따라..) 이 스택의 최대 크기는 프로그래머가 원한다면 설정을 통해 변경할 수 있음 (언어마다 다르긴함)
Q. 스택의 현재 사용중인 영역은 계속 변하는가?
A. 함수를 호출하고 종료하는 과정이 반복되기 때문에 계속해서 스택의 크기는 바뀜
Q. 프로그램이 동작할 때 발생할 수 있는 스택 영역의 최대 크기는 알 수 없는가?
A. 알 수 없음. 그걸 알아서 그 크기로 제한해두면 스택오버플로우도 발생하지 않고 좋겠지만 알 수 없음
Q. 컴파일 시점에 결정되는 코드영역과 데이터 영역은 런타임시 메모리 공간 크기 변화가 있을 가능성이 있는가?
A. 없음. 스택과 힙 영역만 런타임시 계속해서 크기가 바뀜
Q. 스택오버플로우
A. 스택영역이 컴파일러가 설정해준 최대 제한 크기를 넘어가면 스택오버플로우가 발생함
'Computer Science > Operating System' 카테고리의 다른 글
[OS] CPU 스케줄링 (0) | 2023.12.13 |
---|---|
[OS] 컴퓨터의 구조와 성능 향상 (0) | 2023.11.01 |
Chapter 1. UNIX System Overview (0) | 2022.03.05 |