야금야금

#3(2) 컴퓨터 구조 - 메모리 구조 & 레지스터 종류 본문

SWING/컴퓨터구조

#3(2) 컴퓨터 구조 - 메모리 구조 & 레지스터 종류

hyk0425 2020. 5. 23. 22:01

메모리 구조

프로그램이 실행되기 위해서는 먼저 프로그램이 메모리에 로드되어야 한다. 또한, 프로그램에서 사용되는 변수들을 저장할 메모리가 필요하다. 따라서 컴퓨터의 운영체제는 프로그램의 실행을 위해 다양한 메모리 공간을 제공하고 이는 다음과 같다

출처 : http://tcpschool.com/c/c_memory_structure

 

Code 영역

: 메모리의 실행할 프로그램의 코드가 저장되는 영역으로 텍스트(code) 영역이라고도 부른다.

기계어로 저장되어 있으며 프로그램이 시작하고 종료될 때 까지 메모리에 존재한다.

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

 

Data 영역

: 프로그램의 전역 변수와 정적(static)변수가 저장되는 영역이다.

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

 

Stack 영역

: 함수의 호출과 관계되는 지역 변수와 매개 변수가 저장되는 영역이다. 스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다. 이렇게 스택 영역에 저장되는 함수의 호출 정보를 스택 프레임(stack frame)이라고 한다.

 

스택 영역은 푸시(push) 동작으로 데이터를 저장하고 팝(pop) 동작으로 데이터를 인출한다. 이러한 스택은 후입 선출(LIFO, Last-In-First-Out) 방식에 따라 동작하므로 가장 늦게 저장된 데이터가 가장 먼저 인출된다.

스택 영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다.

 

낭비되는 공간이 없고 하나의 명령만으로 메모리 조작과 주소 조작이 가능하다는 장점이 있고

한계가 존재하여 한계를 초과하도록 삽입할 수 없다는 단점이 있다

 

Heap 영역

: 프로그래머가 할당/해제하는 메모리 공간이다. 이 공간에 메모리를 할당하는 것을 동적할당(Dynamic Memory Allocation)이라고도 부른다. 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.

malloc() 또는 new 연산자 등을 통해 할당하고 free() 또는 delete 연산자 등을 통해서 해제가 가능하다.

런타임 시에 크기가 결정된다.

 

프로그램에 필요한 개체의 개수나 크기를 미리 알 수 없는 경우와 개체가 너무 커서 스택 할당자에 맞지 않는 경우 사용 가능하다.

 

위의 Heap 영역과 Stack 영역은 같은 공간을 공유한다.

Heap 영역이 메모리 위쪽 주소부터 할당되면 Stack 영역은 메모리의 아래쪽부터 할당되는 식이다.

따라서 각 영역이 상대 공간을 침범하는 일이 발생할 수 있는데 Heap이 Stack 영역을 침범하는 경우 Heap overflow라 하고, Stack이 Heap 영역을 침범하는 경우Stack overflow라고 한다.


레지스터

: CPU가 요청을 처리하는데 필요한 데이터를 일시적으로 저장하는 기억장치이다. 

 

1) 범용 레지스터 (General-Purpose Register)

: 연산처리, 연산 결과, 복귀 주소 등의 데이터를 기억하는 레지스터이다.

산술 연산 레지스터

① EAX (Extended Accumlator Register) : 산술 연산 시 연산 결과와 함수의 반환 값 저장

② EBX (Extended Base Register) : 산수/변수 저장, 간접 주소 지정

③ ECX (Extended Counter Register) : 반복문(loop)에서 반복 횟수로 사용되는 값 저장

④ EDX (Extended Data Register) : EAX 보조

 

인덱스 레지스터

⑤ ESI (Extended Source Index) : 복사 또는 비교시 출발지 주소 저장

⑥ EDI (Extended Destination Index) : 복사 또는 비교 시 목적지 주소 저장

 

스택 포인터 레지스터

⑦ ESP(Extended Stack Pointer) : Stack Pointer의 가장 최근에 저장된 공간의 주소 저장. 스택이 쌓일 때마다 1씩 증가

⑧ EBP(Extended Base Pointer) : Stack Pointer의 기준점을 저장

 

 

2) 플래그 레지스터(Flag Register)

: 여러 가지의 상태 값을 저장하는 레지스터로 각 비트마다 1 또는 0 의 값을 가지며 True/False를 표시한다. 각 비트가 서로 다른 의미를 갖고 있어서 각각 독립적으로 사용된다. 일부 비트는 시스템에서 직접 세팅하고 일부 비트는 프로그램에서 사용된 명령의 수행 결과에 따라 세팅된다.

 

3) 세그먼트 레지스터 (Segment Register)

: 세그먼트(프로그램에 정의된 특정 영역으로 코드, 데이터, 그리고 스택을 포함한다)에 대한 주소 지정을 제공한다.

CS(Code Segment) : 코드 영역의 시작 주소 저장

DS(Data Segment) : 데이터 영역의 시작 주소 저장

ES(Extra Segment) : 비디오 영역의 시작 주소 저장

SS(Stack Segment) : 스택 영역의 시작 주소 저장

FS, GS : 기타 영역의 시작 주소 저장

 

4) 명령 포인터 레지스터 

EIP(Extended Instruction Pointer) : 다음 명령어의 위치 저장. 프로그램 카운터(PC)라고도 함

 

 


문제

더보기

Q1.  다음을 읽고 O/X를 표기하시오.

-Heap 영역은 런 타임에 크기가 결정된다 (O/X)

-스택은 선입선출(FIFO, First-In-First-Out)방식에 따라 동작한다 (O/X)

 

Q2. 다음을 읽고 알맞은 보기에 표기하시오.

Heap영역은 메모리의 (위/아래)쪽 부터(위/아래) 쪽부터 할당되고, Stack영역은 메모리의 (위/아래) 쪽부터 할당된다.
Heap이 Stack영역을 침범한 경우를 (Heap overflow/Stack overflow)라 한다.

 

Q3. 반복문에서 반복 횟수로 사용되는 값을 저장하는 레지스터는?

① EAX  ② EBX  ③ ECX  ④ EDX

 

Q4. 코드 영역, 데이터 영역, 스택 영역, 힙 영역 중 코드 영역이 가장 ____주소에 담긴다.

 

Q5. CPU가 요청을 처리하는데 필요한 데이터를 일시적으로 저장하는 기억장치를 ______라 한다

 

해설

더보기

A1.

- (O)

: Heap 영역은 사용자에 의해 동적할당 받는 메모리 공간이며 컴퓨터 프로그램이 실행되고 있는 동안(=런타임 중) 크기가 결정된다.

 

- (X)

: 스택은 책을 쌓는 것 처럼 차곡차곡 쌓아 올린 형태의 자료구조를 말한다. 같은 구조와 크기의 자료를 정해진 방향으로만 쌓을 수 있고 top으로 정한 곳을 통해서만 push와 pop연산을 이용하여 자료의 삽입 및 삭제가 가능하다. 이러한 구조적 특징에 따라 스택은 후입 선출(LIFO, Last-In-First-Out) 방식에 따라 동작한다.

 

A2. 위, 아래, Heap overflow

: Heap 영역과 Stack 영역은 같은 공간을 공유하며 Heap영역은 메모리 위쪽부터, Stack 영역은 메모리의 아래쪽부터 할당된다.

두 영역 모두 크기가 가변적이고 이로 인해 서로의 영역을 침범하는 overflow현상이 발생한다. 이때, Heap이 Stack영역을 침범하는 것을 Heap overflow라 한다.

 

A3.

① EAX (Extended Accumlator Register) : 산술 연산시 연산 결과와 함수의 반환 값 저장

② EBX (Extended Base Register) : 산수/변수 저장, 간접 주소 지정

③ ECX (Extended Counter Register) : 반복문(loop)에서 반복 횟수로 사용되는 값 저장

④ EDX (Extended Data Register) : EAX 보조

 

A4. 낮은

: 코드, 데이터, 힙, 스택 영역 순서로 높은 메모리 주소에 담긴다.

 

A5. 레지스터

: CPU가 요청을 처리하는 과정에서 필요한 데이터를 일시적으로 저장하는 기억장치를 레지스터라 하며

레지스터는 그 쓰임에 따라 여러 가지 종류로 나뉜다.