본문 바로가기

시스템

메모리 구조 [Memory Structure]

[메모리 구조]

메모리는 크게 커널영역과 유저영역으로 나뉜다.

유저영역은 다시 스택영역, 힙영역, 데이터영역, 코드영역으로 나뉘며, 유저영역을 제외한 영역을 커널영역이라고 한다.

 

커널영역에는 커널(kernel)이 위치하고 있으며 이 커널은 컴퓨터의 운영체제의 핵심이라고 할 수 있다. 

커널은 시스템의 모든 것을 완전히 통제하기 때문에 사용자(유저모드)가 직접 접근할 수 없으며, 접근 시 system call을 통한 커널모드로의 전환이 필요하다.

 

유저영역은 스택영역, 힙영역, 데이터영역, 코드영역으로 나뉜다.

엄밀히 말하자면 하나의 프로세스를 묶어 놓은 세그먼트(Segment)가 존재하는데 이 세그먼트가 스택영역, 힙영역, 데이터영역, 코드영역으로 이루어져 있는 것이다.

즉, 프로세스마다 스택영역, 힙영역, 데이터영역, 코드영역이 존재한다는 것이다. (큰 세그먼트가 4개의 세그먼트로 다시 쪼개짐)

 

커널영역과 유저영역이 이해가 잘 안 가는 사람은 아래 링크를 참조. (만화로 되어 있어 쉽게 이해할 수 있다.)

http://blog.naver.com/PostView.nhn?blogId=sheep_horse&logNo=221271778167

 

코드영역은 말 그대로 시스템이 알아들을 수 있는 명령어가 저장되는 영역으로 CPU가 코드영역의 데이터를 수행할 때 하나의 명령어만을 수행하는 형태로 되어있다.

 

데이터영역은 전역 변수(Global Variable)와 정적 변수(Staticariable)가 저장되는 영역이다.

데이터영역은 다시 초기화된 데이터영역과 초기화되지 않은 데이터영역으로 나눌 수 있는데 초기화되지 않은 데이터 영역을 BSS(Block Started by Symbol)영역이라고 한다. BSS영역이 데이터영역보다 더 높은 주소에 위치한다.

(위 그림에서는 따로 BSS영역과 데이터영역을 구분하지 않았다.)

 

힙영역은 동적할당된 변수가 저장되는 영역이다.

동적할당이란 필요한 크기만큼 만들어 놓는 스택영역과 달리 프로그램이 실행되는 도중에 메모리를 할당하는 것을 말한다. 동적할당 시 포인터가 저장되는 곳은 스택영역이다.

동적할당을 하게 되면 메모리 사용 후 동적할당 해제가 필요한데 만약 해제하지 않는다면 메모리가 부족해져

메모리 누수(memory leak)가 발생할 수 있다.

 

스택영역은 함수(프로시져)내에서 지역변수(Local Variable)와 매개변수(parameter)가 저장되는 영역이다.

스택영역이 처음 생성될 때(함수가 실행될 때) 필요한 크기만큼 만들어지고, 데이터를 저장해 나간다. (C언어에서 변수 선언 시 변수명앞에 자료형을 써주는 것을 생각한다면 쉽게 이해할 수 있다.)

또한 스택영역은 지역변수가 저장되는 영역이기 때문에 함수가 끝나게 되면 스택영역은 소멸된다.

스택영역은 다른 영역들과 달리 높은 주소에서 낮은 주소로 자라나는 형태를 가진다.

이러한 이유는 스택영역이 운영체제의 핵심인 커널영역을 침범할 수 없기 때문인데 이렇게 된다면 스택영역이 엄청나게 커지더라도 커널영역을 침범하지 않게 된다.

다른 이유는 스택영역과(높은 주소에서 낮은 주소로) 힙영역(낮은 주소에서 높은 주소로)이 공간을 공유하면서 사용하게 되면 공간을 효율적으로 사용할 수 있기 때문이다.(위 그림을 보면 쉽게 이해할 수 있을 것이다.)

스택영역은 후입선출, LIFO(Last In First Out)구조를 가지는데 말 그대로 가장 마지막에 들어간 것이 가장 먼저 나오는 것을 의미한다.

예시를 들면 신문을 쌓아놓고 판매하는 곳이 있다면 구입해 가는 사람들은 맨 위에 있는 신문부터 가져가는 것과 같다.

스택영역은 PUSH와 POP 명령을 통해 작동하는데 PUSH란 스택영역에 데이터를 집어넣을 때 사용되며, POP은 스택영역에서 데이터를 꺼낼 때 사용된다.

반응형