메모리 구조
운영체제 메모리 구조는 유저영역, 커널영역 2가지로 나뉩니다.
(만약 운영체제가 커널 영역에 올라가 있는데 사용자가 마음대로 접근할 수 있다면 시스템이 안정적으로 운용될 수 없을 것이다. 그렇기 때문에 사용자가 함부로 커널 영역에 접근할 수 없도록 2가지 영역으로 나누어 사용하는 것이다. )
유저영역
프로그램이 실행되기 위해선, 먼저 프로그램이 메모리에 로드되어야 합니다.
이때, 프로그램에서 사용되는 변수들을 저장할 메모리도 필요합니다.
따라서 운영체제는 실행시킨 프로그램들에게 각각 메모리 공간을 할당해줍니다.
할당되는 메모리 공간은 크게 code영역, data영역, stack영역, heap영역 4가지로 이루어져 있습니다.
이 메모리 공간은 용도에 따라 할당시기, 할당장소가 정해집니다.
Code( text ) 영역
- 실행할 프로그램의 코드가 저장되는 영역
- 명령문들이 저장되는 곳으로 제어문, 함수, 상수들이 존재
- CPU는 코드 영역에 저장된 명렁어를 하나씩 가져가 처리합니다.
- 컴파일 시 크기가 결정됨
Data 영역
- 전역 변수, 정적 변수, 정적 배열, 정적 구조체 등이 할당되는 영역
- 프로그램이 시작과 동시에 할당되고, 종료될 때 메모리에서 소멸됨
- 컴파일 시 크기가 결정됨
Stack 영역
- 함수 호출 시 지역변수, 매개변수, 리턴 값과 같은 임시로 사용하는 것들에 대한 영역
- 함수 호출과 함께 할당되고, 함수 호출이 완료되면 소멸됨
- 스택 프레임 : 스택 영역에 저장되는 함수의 호출 정보
- 후입선출 방식 : 메모리의 높은 주소 → 낮은 주소 방향으로 할당
- 컴타임 시 크기가 결정
- 장점 : 낭비되는 공간이 없습니다, 하나의 명령만으로 메모리 조작과 address 조작이 가능합니다.
- 단점 : 한계가 있어 초과하도록 삽입이 불가능, 유연성이 부족
Heap 영역
- new, malloc 등을 활용한 동적 할당 객체에 대한 영역
- 힙 영역은 사용자가 직접 관리할 수 있고 '꼭 해야만 하는' 메모리 영역으로 사용자에 의해 메모리 공간이 동적으로 할당되고 해제됩니다.
- malloc(),new 연산자를 통해 할당 , free(), delete 연산자를 통해 해제 ( C++ )
- ARC처럼 가비지 컬렉션이 존재하여 자동으로 해제합니다. ( iOS )
- 메모리의 낮은 주소 → 높은 주소 방향으로 할당
- 왜 필요하지?
- 할당해야 할 메모리의 크기를 프로그램이 실행되는 동안 결정해야 하는 경우인 런타임에 사용되는 공간
- 런타임 시 크기가 결정
- 장점 : 프로그램에 필요한 개체의 개수나 크기를 미리 알기 어려울때 사용, 개체가 너무 커서 스택 할당자에 맞지 않는 경우에 사용
- 단점 : 할당 작업으로 인한 속도 저하, 힙 손상으로 인한 속도 저하, 힙 경합으로 인한 속도 저하
Stack 영역이 클수록 Heap 영역이 작아지고
Heap 영역이 클수록 Stack 영역이 작아집니다.
Overflow
- Heap overflow : Heap이 위에서부터 주소값을 채워져 내려오다가 Stack영역을 침범하는 경우
- Stack overflow : stack 영역이 Heap을 침범하는 경우
⇒ 메모리 용량을 넘어선 값이 들어가 생기는 오류
Q. 스택과 힙 영역 중 할당 속도가 빠른 영역은?
A : 스택은 이미 할당되어 있는 공간을 사용하는 것이고 힙은 따로 할당해서 사용하는 공간이기 때문에 스택 영역이 더 빠릅니다. 다만, 스택은 공간이 매우 적기 때문에 모든 응용 프로그램에서 스택을 사용할 순 없습니다. 이때 스택에서의 할당이란 이미 생성되어 있는 스택에 대한 포인터의 위치만 바꿔주는 단순 CPU Instruction이고, 힙에서의 할당이란 요청된 chunk의 크기, 현재 메모리의 fragmentation 상황 등 다양한 요소를 고려하기에 더 많은 CPU Instruction이 필요합니다.
프리 영역
Class는 참조타입
→ Stack영역에 class에 대한 정보를 저장하고 있는 메모리 주소(위치,Heap)가 있고
→ Heap영역에 클래스에 대한 직접적인 정보들이 존재
예를 들어 A 클래스 존재할때 → 이를 사용하고 싶다 → 그러면 참조해야겠지 → Stack영역 안에 A 클래스를 직접적으로 접근할 수 있는 2이란 메모리 주소가 존재하는데 이게 Heap 주소다. 그러면 Heap안에 2이란 주소를 찾아 A클래스에 대한 직접적인 정보들을 얻을 수 있다?
나중에 더 참고할 자료
메모리 구조