cs
프로세스의 메모리 구조
ssoonn
2024. 7. 30. 17:59
시스템은 프로그램을 실행할 때 해당 프로그램을 메모리에 로드한다.
프로세스
실행되고 있는 프로그램으로, 프로세스는 각 메모리 공간을 시스템으로부터 할당받는다.
프로세스의 메모리 영역
메모리는 코드, 데이터, 힙, 스택 영역으로 구성되어 있다.
Code 영역
- 실행할 프로그램의 코드가 저장된다.
- CPU는 코드 영역에서 명령어를 하나씩 가져와 처리하게 된다.
- 컴파일 타임에 결정된다.
- 중간에 코드 변경이 불가하도록 Read-Only로 되어있다.
Data 영역
- 전역변수와 정적변수 등 프로그램이 사용하는 데이터를 저장한다.
- 이 변수들을 참조한 코드는 컴파일이 완료될 시 data 영역의 주소값을 가르키도록 바뀐다.
- 변수가 변경될 수 있기 때문에, Read-Write로 되어있다.
- Data 영역은 다시 BSS 영역과 Data(GVAR) 영역으로 나누어짐
- 초기화된 데이터는 Data 영역에 저장
- -> 비휘발성 메모리인 ROM에 저장됨
- 초기화되지 않은 데이터는 BSS 영역에 저장
- RAM에 저장됨
- 영역 구분 이유:
- ROM에 저장할 시 비용이 많이 들기 때문에, RAM에 저장될 부분과 구분하기 위함
- 초기화된 데이터는 Data 영역에 저장
Stack 영역
- 지연변수, 매개변수, 리턴값 등 잠시 사용되었다가 사라지는 데이터를 저장하는 영역이다.
- 함수 호출 시 할당되고 함수 반환 시 소멸된다.
- 로드 시(컴파일 타임) 크기가 결정 -> 런타임 시 stack 사이즈 변경 불가
- 메모리의 높은 주소에서 낮은 주소의 방향으로 할당
메커니즘: 자료구조(stack)의 LIFO(Last In First Out)
컴파일 시 stack 영역의 크기가 결정되기 때문에 무한정 할당 불가.
따라서 재귀함수가 반복해서 호출되거나 함수가 지역변수를 메모리를 초과할 정도로 너무 많이 가지고 있다면stack overflow가 발생한다.
Heap 영역
- 동적 데이터 영역 (필요에 의해 메모리를 동적으로 할당할 때 사용하는 메모리 영역)
- 메모리 주소 값에 의해서만 참조되고 사용되는 영역 -> 프로그램 동작 시(런타임)에 크기가 결정된다.
- ex. stack에서 pointer 변수를 할당 -> pointer가 가리키는 heap 영역의 임의의 공간부터 원하는 크기만큼 할당, 사용
- 메모리의 낮은 주소에서 높은 주소의 방향으로 할당
- stack과 heap영역은 사실 같은 공간을 공유: heap이 메모리의 낮은 주소부터 할당되면 stack은 높은 주소부터 할당되는 식
- 각 영역이 상대 공간을 침범하는 일이 발생할 수 있는데 이를 각각 stack overflow, heap overflow라고 부른다.
ref.
https://velog.io/@cchloe2311/운영체제-프로세스-메모리-구조
https://zangzangs.tistory.com/107
https://velog.io/@iamgroot1231/프로세스-메모리-구조