Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

KH_C++

메모리 구조 이해 본문

C++

메모리 구조 이해

kanghou 2022. 10. 26. 21:10

메모리란?

작업을 처리하기 위한 기억 장치로 물리(메인) 메모리(RAM), 가상 메모리(SSD, HDD의 swap 영역)가 존재한다.

가상 메모리 : 필요한 내용만 물리 메모리에 올려 메모리를 관리하는 기법으로 요구 페이징 기법을 사용한다. (가상 메모리에는 방어적 코드와 같이 불필요할 수 있는 코드가 올라감)

 

요구 페이징 기법 : 유-무효 비트(valid, invalid)로 페이지가 메모리에 존재하는지 확인 후 없으면 보조저장장치에서 가져오는 기법

 

1 .CPU는 작업을 수행할 때 메인 메모리까지만 참조 가능하다.

2. 각 프로세스는 자신 만의 메모리를 할당 받는다.

3. 프로세스는 메모리를 사용하여 동작을 수행한다.

메모리의 구조

프로그램이 실행되기 위해서는 먼저 프로그램이 메모리에 로드(load)되어야 한다.

또한, 프로그램에서 사용되는 변수들을 저장할 메모리도 필요하다.

따라서 컴퓨터의 운영체제는 프로그램의 실행을 위해 다양한 메모리 공간을 제공하고 있다.

프로그램이 운영체제로부터 할당받는 대표적인 메모리 공간은 다음과 같다.

 

1. 코드(code) 영역

2. 데이터(data) 영역

3. 스택(stack) 영역

4. 힙(heap) 영역

코드(code) 영역

코드 영역은 실행할 프로그램의 코드가 저장되는 영역이다.

텍스트 영역이라고 부르기도 한다.

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

프로그램이 시작하고 종료될 때 까지 메모리에 계속 남아있는다.


데이터(data) 영역

메모리의 데이터(data) 영역은 프로그램의 전역 변수정적(static) 변수가 저장되는 영역이다.

데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸한다.


힙(heap) 영역

힙 영역은 프로그래머가 직접 공간을 할당, 해제하는 메모리 공간이다.

힙 영역에서 malloc() 또는 new 연산자를 통해 메모리를 할당하고, free() 또는 delete 연산자를 통해 메모리를 해제한다.

힙 영역은 선입선출(FIFO, First-In First-Out)의 방식으로, 가장 먼저 들어온 데이터가 가장 먼저 인출 된다.

이는 힙 영역이 메모리의 낮은 주소에서 높은 주소의 방향으로 할당되기 떄문이다.

위의 그림으로 설명하면, 위(낮은 주소)부터 차곡차곡 아래(높은 주소) 방향으로 데이터가 쌓인다고 생각하면 된다.


스택(stack) 영역

스택 영역은 프로그램이 자동으로 사용하는 임시 메모리 영역이다.

함수 호출 시 생성되는 지역 변수 매개 변수가 저장되는 영역이고, 함수 호출이 완료되면 사라진다.

이때 스택 영역에 저장되는 함수의 호출 정보를 스택 프레임(stack frame) 이라고 한다.

스택 영역에서 푸시(push)  데이터를 저장하고, 팝(pop) 으로 데이터를 인출한다.

스택 영역은 후입 선출(LIFO, Last-In First-Out) 의 방식으로, 가장 나중에 들어온 데이터가 가장 먼저 인출 된다.

이는 스택 영역이 메모리의 높은 주소에서 낮은 주소의 방향으로 할당 되기 때문이다.

위의 그림으로 설명하면, 가장 아래(높은 주소)부터 차곡차곡 위(낮은 주소)의 방향으로 데이터가 쌓인다고 생각하면 된다.


오버 플로우

오버 플로우란 영어로 넘쳐흐른다는 뜻 이다.

말 그대로, 한정된 메모리 공간이 부족하여 메모리 안에 있는 데이터가 넘쳐 흐르는 현상이다.

오버 플로우의 종류 중에 힙 오버 플로우 스택 오버 플로우가 있다.

힙은 메모리 위쪽 주소부터 할당되고, 스택은 메모리 아래쪽 주소부터 할당되기 때문에 각 영역이 상대 공간을 침범하는 일이 발생할 수 있다.

이때 힙이 스택을 침범하는 경우를 힙 오버 플로우라 하고, 스택이 힙을 침범하는 경우를 스택 오버 플로우라고 한다.

 

'C++' 카테고리의 다른 글

오답노트  (0) 2022.11.11
벡터(Vector)의 멤버함수  (0) 2022.11.09
STL 구성요성  (0) 2022.11.09
자료형, 연산자 우선순위  (0) 2022.10.11
Compile 과정 조사 및 정리  (0) 2022.10.09
Comments