본문 바로가기

개발정보

메모리

 

프로그램(프로세스)이(가) 실행되면 OS는 메모리에 공간을 할당해준다.

 

공간을 할당하는 것이지 메모리 전체의 영역이 Code, Data, Heap, Stack 으로 이루어진 것이

아닌 일정 공간을 4가지로 나누는 것이다.

 

메모리 영역을 크게 정적인 영역과 동적인 영역으로 나눠보았다. 

 

정적인 영역

프로그램이 시작할 때 할당되고, 프로그램이 종료되면 소멸한다. 

코드 영역 

실행할 프로그램의 코드 즉, 소스코드가 저장되는 영역.

다른 이름으로 텍스트 영역이라고 부르기도 한다.

 

CPU가 코드 영역에서 저장된 명령을 하나씩 가져가서 처리하게 된다.

 

※ JVM, Node or 브라우저에서는 TEXT 영역 X

 

데이터 영역

전역 변수정적 변수가 저장되는 영역

3가지로 나뉜다.

  1. Read-Only : const, final 같은 상수 값들이 저장되며 .rdata라고 한다.
  2. Read & Wright : 기본적인 정적 변수 등이 저장되는 공간 .data라고 한다.
  3. 미할당 : BSS 영역이라고 하며, 선언은 되었으나 값이 할당되지 않은 변수들을 말한다.

주관적인 생각으로 1, 2를 GVAR 섹션, 3을 BSS 섹션이라고 생각..

데이터 영역 VS 스택 영역

데이터 영역은 “ 전역 “ 변수와 정적 변수가 저장되는 영역이다.

스택 영역은 “ 지역 “(매개) 변수가 저장되는 영역이다.

 

동적인 영역

프로그램이 실행되면서 할당과 해제가 일어나며 크기가 변하는 공간

 

스택 영역

지역 변수들이 저장되는 공간으로 빠른 속도로 메모리 필요에 따라 할당과 해제를 반복하는 공간

함수가 호출되면 함수의 매개변수, 호출 후 돌아갈 반환 주소 값, 지역 변수 등이 저장된다.

차례대로 저장되는 함수 호출 정보들을 스택 프레임이라고 한다.

 

재귀 함수 등을 통해서 너무 많은 변수 및 함수를 할당하게 되어서 Stack 영역을 넘어가면

Heap 영역까지 도달하게 되고 이때 stack overflow 문제가 발생한다.

 

레지스터 

Stack 하면 변수, 함수를 할당하고 해제할 때 빠질 수 없는 레지스터가 있다.

핵심 레지스터로는 SP ( Stack Pointer ), BP ( Base Pointer ), IP ( Instruction Pointer ) 등...

SP : 스택 포인터, 스택의 현재 진행 중인 지점을 가리킨다.

BP : 스택의 시작 지점을 가리킨다. 함수 별 구분을 위해 함수의 시작 주소 값을 가리킨다.

function main () {             <---- 제일 처음 BP
	let a = 10;            <---- SP 이동
	let b = 10;            <---- SP 이동

	func1();               <---- SP 이동 & 새로운 함수가 호출되므로 BP는 func1을 가리킴
}

func1() {
	// ...
}                              <---- func1이 종료될 경우 다시 BP는 main을 가리킴

IP : 실행할 다음 명령의 주소를 저장하는 공간

 

힙 영역

동적으로 생성되는 데이터에 대해서 할당을 해주는 메모리 영역

 

Chunk 

힙의 메모리는 Chunk를 Linked List 연결을 통해서 구성되어 있다.

malloc을 통해서 동적 할당을 하면 하나의 Chunk를 할당한다.

Prev_size : 이전 Chunk의 size 값을 가지고 있다.

Size : 현재 Chunk의 Size 값을 나타낸다.

A : 만약 멀티 스레드를 지원하는 프로세스에서 현재 Chunk가 메인 힙에 속하는지 나타냄

M : mmap()를 통해서 할당된 것인지 나타냄, 그럴 경우 다른 방식으로 관리됨

P : 이전 Chunk의 상태를 나타낸다. ( 1 : 사용 중 / 0 : free )

data : 실제 데이터가 들어가는 영역

 

Top Chunk

malloc에 의해 할당된 chunk들의 마지막에 붙는 chunk.

사용자 요청 외 남는 부분이 Top chunk이다.

 

main, thread에서 더 많은 Heap을 요구할 경우 메모리 공간을 추가적으로 제공하기 위해서 이다.

사용자에 의해서 동적 할당 및 해제를 하는 과정에서 잉여 공간이 생길 수 있는데, 잉여 공간에

데이터를 정상적으로 할당하지 못하는 경우( 단편화 등.. )를 대비해서 여유 공간을 만들어준다.

반응형

'개발정보' 카테고리의 다른 글

Babel 끝장보기  (1) 2022.09.25
Git Flow  (1) 2022.09.24
힙 메모리 단편화  (1) 2022.09.16
Github 동작 원리  (0) 2022.09.14
웹소켓  (0) 2022.06.06