본문 바로가기
SW/Kernel

메모리구조

by FastBench 2023. 5. 19.

초안 :  2023.05.19

 

프로세스는 생성되면 사용자 영역에 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나뉘어 저장된다.

(물론 지난 게시글에서 언급했듯, 커널영역에는 PCB 가 생성된다.) 

아래 그림의 메모리 address 는 각각의 영역의 위치를 표현하기 위해 가정한 것이니 참고만 하기 바란다. 

code 영역 (code segment)

code 영역은 text 영역이라고 부르기도 한다. 기계어로 이루어진 '명령어'가 저장된다.

즉, 코드 영역에는 '데이터'가 아닌 CPU 가 실행할 '명령어'가 저장되어 있기 때문에 '쓰기'가 금지되어 있다. (read-only space)

 

data 영역 (data segment)

데이터 영역은 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간이다. 예를들어 전역변수가 저장된다.

code 영역과 data 영역은 그 크기가 변하지 않는 것이 특징이다. 프로그램이 컴파일 되는 순간 코드의 길이는 정해지게 되고, 전역변수 또한 마찬가지 이기 때문이다. 

따라서 code 영역과 data 영역을 '정적 할당 영역' 이라고 부르기도 한다.

좀더 엄밀히 들어가자면 data 영역과 bss 영역이 따로 존재한다.
data 영역에는 초기화 된 데이터가 저장되고
bss(block started symbol) 영역에는 초기화 되지 않은 데이터가 들어간다. 
초기화 되지 않았으므로 bss 영역에 저장된 변수는 0의 값을 가질 것이다.

 

 

heap 영역 (heap segment)


힙영역은 프로그래머가 직접 할당할 수 있는 공간이다. 

코드를 작성하다보면 특정 데이터의 크기를 정하기 난감할 때가 있다. 만약 크기를 100바이트로 지정했지만, 실제로 사용되는 크기는 10바이트라면 그만큼 데이터는 낭비되는 것이다. 반대로 110 바이트가 필요할 경우, 크기가 맞지 않아 에러가 발생할 것이다. 이를 해결하기 위해 '동적 할당'이라는 개념이 생겼고, 동적 할당을 하는 변수들은 메모리의 heap 영역에 저장이 된다. (C언어에서는 malloc 함수로 데이터를 동적할당 할 수 있다.)

 

프로그래머는 코드를 짜면서 힙영역에 메모리 공간을 '할당'할 수 있고, 더이상 해당 변수가 필요 없으면 반환을 할 수 있다.

만약 반환을 하지 않는다면 할당된 공간은 계속 메모리 내에 남아 메모리 낭비를 초래하게 된다.(메모리 누수, memory leak) (C언어에서는 free 함수로 동적 할당된 공간을 해제할 수 있다) 

 

즉, heap 영역은 프로그램이 실행되는 시간 동안 가변적인 크기의 메모리 주소의 '할당'과 '해제'가 반복되는 영역이다.

 

 

stack 영역 (stack segment)

스택 영역은 데이터를 일시적으로 저장하는 공간이다. data 영역에 담기는 값들과 반대라고 생각하면 된다.

예를들어 함수의 실행이 끝나면 사라지는 매개변수와 지역변수가 대표적이다. 이런 변수들은 data 영역에 담겨 프로그램이 실행되는 내내 메모리에 저장되어 있을 필요가 없다.

 

Stack 이라는 용어자체는 LIFO(Last In, First Out) 이라고 불리는 자료구조 이다. 즉 메모리의 Stack 영역은 모두 LIFO 형태로 동작한다.

 

A 함수의 안에서 B 함수가 실행되는 상황을 가정해보자. 

A함수 도중에 B함수가 실행되었지만 (B함수가 나중에 실행되었지만), B함수가 당연히 먼저 처리 되어야 한다.

따라서 각 함수 내의 변수들은 아래의 그림과 같이 stack 영역에 쌓이고 (스택 영역에 push 된다고 한다) , 함수의 처리가 끝나면 stack 영역에서 빠지게 된다 (pop 된다고 한다) 

heap 영역과 stack 영역은 실시간으로 그 크기가 변할 수 있기 때문에 '동적 할당 영역' 이라고 부른다.

따라서 이 두 영역이 충돌하게 되는 일도 종종 발생하는데, 이를 어느 영역이 범위를 넘어갔냐에 따라 heap overflow 또는 stack overflow 라고 한다.

Reference

  • 혼자 공부하는 컴퓨터 구조 + 운영체제, 한빛미디어, 강민철
  • 임베디드 레시피, snowbook, 히언

'SW > Kernel' 카테고리의 다른 글

PCB & Context Switching  (0) 2023.05.10
운영체제와 커널(Kernel) - Dual Mode 란?  (0) 2023.04.15

댓글