단순히 코딩만 하던 지난날을 반성하며, 더 좋은 엔지니어가 되기 위해 기초부터 이해하며 정리해보려고 한다.
-목차-
1. 메모리
위 그림과 같이, 프로그램이 실행되기 위해서는 운영체제(OS)가 프로그램의 정보를 메모리에 로드 해야 한다.
프로그램의 실행은 두가지 중요한 의미를 가진다.
- 파일 시스템에 존재하던 실행파일이 메모리에 적재된다는 의미
- 프로그램이 CPU를 할당받고 명령을 수행하고 있는 상태
파일 시스템에 있는 실행 파일이 메모리에 적재될 때, 실행파일 전체가 메모리에 올라가지 않는다. 일부분만 메모리에 올라가고 나머지는 디스크의 특정역역인 스왑 영역에 존재한다.
참고 : 스와핑(Swapping)
이와 같이 실행중인 프로그램을 프로세스라고 하는데 프로세스는 메모리와 CPU의 자원을 할당받는다.
운영체제로부터 할당받은 프로세스의 메모리 주소 공간은 코드(code), 데이터(data), 힙(heap), 스택(stack) 영역으로 구분된다. 이러한 주소 공간을 가상 메모리 (또는 논리적 메모리 : logical memory)라고 부른다.
2. 코드(code) 영역
- 코드 영역은 실행할 프로그램의 코드가 CPU에서 수행할 수 있는 기계어로 변환되어 저장되는 영역이다.
- 컴파일(compile) 타임에 결정된다.
- 중간에 코드를 변경할 수 없게 Read-Only인 영역이다.
- 텍스트 영역이라고 부르기도 한다.
- 프로그램이 시작하고 종료될 때 까지 메모리에 계속 남아있는다.
3. 데이터(data) 영역
- 데이터 영역은 프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역이다.
- 프로그램의 시작과 함께 할당되며 프로그램이 종료되면 소멸한다.
- 전역 변수 또는 static 값을 참조한 코드는 컴파일이 완료되면 data 영역의 주소값을 가리키도록 바뀐다.
- 전역 변수가 변경 될 수도 있어 Read-Wirte가 가능하다.
4. 힙(heap) 영역
- 힙 영역은 프로그래머가 직접 공간을 할당, 해제하는 메모리 공간이다.
- 힙 영역에서 malloc() 또는 new 연산자를 통해 메모리를 할당하고, free() 또는 delete 연산자를 통해 메모리를 해제한다.
- heap 영역은 런타임에 결정된다. 자바에서는 객체가 heap영역에 생성되고 GC에 의해 정리된다.
- 이 공간에 메모리 할당하는 것을 동적 할당(Dynamic Memory Allocation)이라고도 부른다.
- 런타임 시에 크기가 결정된다.
5. 스택(stack) 영역
- 호출된 함수의 수행을 마치고 복귀할 주소 및 데이터(지역변수, 매개변수, 리턴값 등)를 임시로 저장하는 영역이다.
- 함수 호출 시 생성되는 지역 변수와 매개변수가 저장되는 영역이므로, 함수 호출이 완료되면 사라진다.
- 후입 선출(LIFO, Last-In First-Out) 의 방식을 따른다. (재귀 함수를 예로들면 가장 마지막에 호출된 함수가 가장 먼저 반환값을 가진다.)
- 재귀함수가 반복해서 호출되거나 함수의 지역변수가 메모리를 초과할 정도로 너무 많아지게 되면 stack overflow가 발생한다.
6. 오버 플로우
- 오버 플로우는 힙 오버 플로우와 스택 오버 플로우가 있다.
- 힙은 메모에서 낮은 주소부터 큰 주소로 할당되고, 스택은 메모리의 큰 주소부터 낮은 주소로 할당되기 때문에 각 영역이 상대 공간을 침범하는 일이 발생할 수 있다.
- 이때 힙이 스택을 침범하는 경우를 힙 오버 플로우라 하고, 스택이 힙을 침범하는 경우를 스택 오버 플로우라고 한다.
- Stack 영역이 크면 클 수록 Heap 영역이 작아지고, Heap 영역이 크면 클수록 Stack 영역이 작아진다.
7. 코드 예시
위 이미지처럼 상수, 함수는 Text 영역에, 전역, 정적변수는 Data 영역에, 지역변수들은 Stack 영역에, 동적할당이 되는 변수들은 Heap영역에 위치하게 된다. (참고로 malloc 함수는 런타임(실행중)에 메모리를 동적으로 할당할 수 있는 함수이다.)
참고 자료
https://all-young.tistory.com/17
'운영체제' 카테고리의 다른 글
프로세스 동기화(Process Synchronization) [파이썬(Python)] (0) | 2022.02.03 |
---|---|
Blocking, Non-blocking, Sync, Async 의 차이 (0) | 2022.02.02 |
스케줄러 (0) | 2022.01.27 |
운영체제란 무엇인가? (0) | 2022.01.27 |
프로세스와 스레드 (0) | 2022.01.26 |
댓글