티스토리 뷰

반응형

메모리 구조에 대해서 어렴풋이만 알고 있는 것 같아 제대로 정리해보려고 합니다.

 

 주 메모리 

메모리는 크게 커널(kernal) 영역과 유저(User) 영역으로 나뉘어지고,

커널 영역에는 운영체제가 적재되고 유저 영역에는 일반 프로세스가 적재됩니다.

 

프로그램이 실행되기 위해서 프로그램이 주 메모리(RAM)에 load되어 프로세스가 되어야합니다.

또한, 프로그램 중에 사용할 변수와 데이터들을 메모리에 저장하여 사용합니다.

 

유저 영역에 적재되는 프로세스의 메모리 구조는 아래와 같습니다.

 

 

 

 

 유저 영역 메모리 구조 

메모리 구조

 

메모리 구조는 크게 코드, 데이터, 힙, 스택 영역으로 나뉩니다.

운영체제가 실행 프로그램을 위해서 공간을 4가지로 할당해줍니다.

 

 

1) 코드(Code) 영역

실행할 프로그램의 코드가 저장되는 영역으로 텍스트 영역이라고도 부릅니다.

한마디로 명령문들이 저장되는 것인데, 제어문이나 함수, 상수들이 여기에 저장됩니다.

CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리합니다.

 

 

2) 데이터(Data) 영역

데이터 영역은 프로그램의 전역 변수, 정적 변수(static), 상수가 저장되는 영역입니다.

즉, 보통 메인(main)함수 전에 선언되어 끝날때까지 남아있는 변수들입니다.

프로그램의 시작과 함께 할당되고, 종료될때까지 메모리상에 존재하게 됩니다.

 

 

3) 힙(Heap) 영역

힙 영역은 사용자가 직접 관리해야하는 메모리 영역입니다.

동적 할당이 되는 변수들은 힙 영역에 저장됩니다.

 

사용자에 의해 공간이 동적으로 할당되고 해제됩니다.(런타임에 크기가 결정)

커널 영역을 보호하기 위해 메모리의 낮은 주소에서 높은 주소 방향으로 할당됩니다.

 

 

4) 스택(Stack) 영역

스택 영역은 함수의 호출과 관계되는 지역변수와 매개변수가 저장됩니다.

 

힙보다 접근 속도가 빠르고, 명시적으로 변수를 할당/해제 할 필요가 없습니다.(컴파일 타임에 크기가 결정)

함수의 호출과 함께 할당되고, 호출이 완료되면 소멸합니다.

커널 영역을 보호하기위해 메모리의 높은 주소에서 낮은 주소 방향으로 할당됩니다.

 

💡 컴파일 타임 vs 런타임
컴파일 타임은 소스코드가 실행 가능한 기계어 코드로 변환되어 머신에서 실행 가능한 프로그램이 되는 과정
런타임은 컴파일 과정을 마친 프로그램이 사용자에 의해 실행되고 동작되는 시점

 

 

 

 

 

 힙(Heap) vs 스택(Stack) 

위에 그림에서 본 것 처럼 스택과 힙 영역은 사실 상 같은 공간을 사용하기 때문에,

스택 영역이 클수록 힙 영역이 작아지고, 스택 영역이 작을수록 힙 영역이 커집니다.

 

유저 영역보다 높은 주소에 커널 영역이 있기 때문에 커널 영역을 보호하기 위해,

유저의 스택 영역은 높은 주소에서 낮은 주소 방향으로 할당되고, 힙 영역은 낮은 주소에서 높은 주소 방향으로 할당됩니다.

커널 영역 반대로 데이터가 저장되기 때문에 커널 영역을 침범할 수 없습니다.

 

스택과 힙의 영역이 서로 상대의 영역을 침범하게 되면,

스택 오버플로우(Stack Overflow)와 힙 오버플로우(Heap Overflow)가 발생합니다.

 

 

 

 커널 영역 메모리 구조 

1) 코드 (커널 코드)

시스템 콜/인터럽트 처리 코드, 자원 관리를 위한 코드, 편리한 인터페이스 제공을 위한 코드

 

2) 데이터

모든 하드웨어들(cpu, 메모리)을 관리하기 위한 자료구조, 

모든 프로세스들을 관리하기 위한 자료구조(PCB)

 

3) 스택 (커널 스택)

각 프로세스마다 별도로 두고 있음(프로세스 커널 스택)

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday