본문 바로가기
컴퓨터 구조

컴퓨터 구조 3주차(2)

by 몰라몰라개복치 2020. 5. 23.

메모리의 구조

 

 

프로그램이 실행되기 위해서는 먼저 프로그램이 메모리에 로드(load)되어야 하며 프로그램에서 사용되는 변수들을 저장할 메모리도 필요하다. 따라서 컴퓨터의 운영체제는 프로그램의 실행을 위해 다양한 메모리 공간을 제공하고 있다. 프로그램이 운영체제로부터 할당받는 대표적인 메모리 공간은 다음 4개로 말할 수 있다.

 

1. 코드(code) 영역

2. 데이터(data) 영역

3. 스택(stack) 영역

4. 힙(heap) 영역

 

운영체제가 제공하는 메모리 공간

 

(1) 코드(code) 영역

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

CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리하게 된다. 코드영역은 실행 파일을 구성하는 명령어들이 올라가는 메모리 영역으로 함수, 제어문, 상수 등이 여기에 지정된다.

 

(2) 데이터(data) 영역

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

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

import Foundation

var a: Int = 10;	// 데이터 영역에 할당
var b: Int = 20;	// 데이터 영역에 할당

func dataFunc()  -> Bool {
    return true
}

 

 

 

(3) 스택(stack) 영역

메모리의 스택(stack) 영역은 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역이다.

스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다.

(스택 프레임(stack frame): 스택 영역에 저장되는 함수의 호출 정보)

import Foundation

var a: Int = 10;	// 데이터 영역에 할당
var b: Int = 20;	// 데이터 영역에 할당

func dataFunc() -> Bool {

  someFunc1(3)
  someFunc2(5)

  return true
}

func someFunc1(c: Int) {
  int d = 30;	
  // 매개변수 c와 지역변수 d가 스택영역에 할당
}

void someFunc2(e: Int) {
  int f = 40;	
  // 매개변수 e와 지역변수 f가 스택영역에 할당
}

장점

  • 낭비되는 공간이 없다.
  • 하나의 명령만으로 메모리 조작과 어드레스 조작이 가능하다.

단점

  • 한계가 있어 한계를 초과하도록 삽입할 수 없다.
  • 즉, 유연성이 부족하다.

 

 

(4) 힙(heap) 영역

메모리의 힙(heap) 영역은 사용자가 직접 관리할 수 있는 '그리고 해야만 하는' 메모리 영역이다.

힙 영역은 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다.

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

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

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

 

장점

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

단점

  • 할당 작업으로 인한 속도 저하

  • 해제 작업으로 인한 속도 저하

    주로 병합을 사용할 때 해제 작업에 더 많은 주기가 소요된다.
  • 힙 손상으로 인한 속도 저하

    응용 프로그램에서 힙 블록을 적절하게 사용하지 않을 경우 힙이 손상된다.

    가장 많이 발생할 수 있는 힙 손상 문제로는 이중 해제, 해제 후 블록 사용, 블록 경계를 벗어나 덮어쓰기 등이 있다.

  • 힙 경합으로 인한 속도 저하

    두 개 이상의 쓰레드에서 동시에 데이터에 액세스하려고 하면 경합이 발생하여 한 쪽 쓰레드의 작업이 완료되어야 다른 쪽 쓰레드의 작업이 진행될 수 있다.

    이 문제는 현재 다중 프로세서 시스템에서 일어나는 문제 중 가장 큰 문제다.

    경합은 일반적으로 쓰레드와 프로세스의 컨텍스트 스위칭을 가져온다. 컨텍스트 스위칭에도 리소스가 많이 소모되지만 프로세서 캐시에서 데이터가 손실되어 나중에 해당 쓰레드가 다시 살아날 때 이 데이터를 다시 작성하는 데에 리소스가 훨씬 많이 소모된다.

 

2. Stack vs Heap

Stack 영역이 클 수록 Heap 영역이 작아지고 Heap 영역이 클 수록 Stack 영역이 작아진다.

 

스택 할당 속도와 힙 할당 속도를 비교해보면 스택이 훨씬 빠르다.

이유- 스택은 이미 할당 되어있는 공간을 사용하는 것이고 힙은 사용자가 따로 할당해서 사용하는 공간

 

BUT, 스택은 공간이 매우 적기 때문에 모든 응용에서 스택을 사용할 수 없다.

 

좀 더 자세히 알아보면,

스택에서 할당의 의미는 이미 생성되어 있는 스택에 대해 포인터의 위치만 바꿔주는 단순한 CPU Instruction(덧셈과 뺄셈 연산, 일반적으로 단일 Instruction)이다.

반면 힙에서의 할당은 요청된 chunk의 크기, 현재 메모리의 fragmentation 상황 등 다양한 요소를 고려하기 때무에 더 많은 CPU Instruction이 필요하다.

 

 

 

레지스터 구조

-  CPU(Central Proceessing Unit)가 요청을 처리하는 데이터의 임시저장 공간이다.
-  레지스터는 공간은 작고 가격은 비싸지만 CPU에 직접 연결되어 있어서 연산 속도가 RAM, HDD, SDD 보다 빠르다.
-   CPU는 자체적으로 데이터를 저장할 수 없으므로 레지스터를 이용하여 연산처리 및 번지 지정을 도와준다.
-  컴퓨터 장치들을 제어한다.

 

 

범용 레지스터 
 범용적으로 사용되는 레지스터들이다. IA-32에서 각 범용 레지스터들의 크기는 32비트이다. 

 

 
EAX(Accumulation)
 
-  산술연산에 사용되는 레지스터이다.(상수/변수 값의 저장 용도)
-  함수의 return 값 지정한다.
 
 
EBX(Base Register)
 
-   간접 번지지정에 사용된다.
-   산수 / 변수를 저장한다.
 
 
ECX(Counter Register)
 
- 반복(Loop)에서 반복 Count 역할을 수행
REP(반복 레지스터)에 얼마나 반복할 것인지를 ECX 레지스터에 저장한다.
 
EDX(Data Register)
 
-   EAX를 보조하는 역할을 수행한다.
-   4byte * 4byte를 연산하면 EAX에 담기지 않을 수 있다 → EDX(상위 bit), EAX(하위 bit)를 이용하여 8byte에 저장한다.
-   나누기를 진행할 경우 몫은 EAX 나머지는 EDX에 저장이 된다.

 

 

 

 

인덱스 레지스터


 
ESI(Source Index)
 
-   복사나 비교를 할 경우 출발지 주소를 저장하는 레지스터이다.
 
EDI(Destination Index)
 
-  복사나 비교를 할 경우 목적지 주소를 저장하는 레지스터이다.
-   stos, movs를 사용할때 마다 1씩 증가한다.

 

 

 

 

포인터 레지스터 

 
ESP(Stack Pointer)
 
-   Stack Pointer의 가장 최근에 저장된 공간의 주소를 저장하는 레지스터이다. 
-   스택이 쌓일때 마다 ESP 값이 1씩 증가한다.
 
EBP(Base Pointer)
 
-   Stack Pointer의 기준점(바닥 부분)을 저장하는 레지스터이다.
-   EBP 및에는 Return값이 존재한다.

 

 

 

 

명령어 레지스터  

 

EIP(Instruction Pointer)
 
-   다음 명령어의 위치를 저장하는 레지스터이다.
-   PC (Program Counter) 라고도 불린다.
-   다음 명령어의 위치를 저장하는 레지스터이다.



세그먼트 레지스터

 

세그먼트는 프로그램에 정의된 메모리 상의 특정 영역으로 코드, 데이터, 스택 등을 포함하며 메모리의 대부분에 위치할 수 있다. 각 세그먼트 레지스터는 자신에게 지정된 주소를 가리키고 있으며, 기본적으로 CS, DS, SS 3개의 레지스터가 사용되며 이외에 ES, FS, GS 레지스터가 필요에 따라 사용될 수 있다.

 

CS (Code Register): CS 레지스터는 코드 세그먼트의 시작 주소를 가리키며, 해당 세그먼트 주소에 EIP 레지스터의 오프셋 값을 더하면, 실행하기 위해 메모리로부터 가져와야 할 명령어의 주소가 된다. 일반적인 프로그래밍에서는 이 레지스터를 직접 참조할 필요가 없다.

 

DS (Data Register): DS 레지스터는 프로그램의 데이터 세그먼트의 시작 주소를 포함한다. 명령어는 이 주소를 사용하여 데이터의 위치를 알아내며, 이 주소에 EIP 값을 더하면 데이터 세그먼트에 속한 특정 바이트 위치에 대한 참조가 생성된다.

 

SS (Stack Register): SS 레지스터는 메모리 상에 스택의 구현을 가능하게 한다. 프로그램은 주소와 데이터의 임시 저장 목적으로 스택을 사용한다. 

 

ES & FS & GS: 이 3개의 레지스터는 Extra Segment로 여분의 데이터 세그먼트다.

 

 

 

 

 

플래그 레지스터

 

32비트 플래그는 다양한 컴퓨터 행동의 상태를 나타내는 비트를 포함하고 있다. 

 

Sign Flag
 
-   연산결과 최상위 bit가 1인 경우 1로 설정된다.
 
Overflow Flag
 
-   연산의 결과가 용량을 초과하였을 경우 1로 설정된다.
 
Zero Flag
 
연산의 값이 0일 경우 1로 설정된다.
 
Carry Flag
 
-   덧셈과 뺄셈에서 빌림수(Borrow) 발생 시 1로 설정된다.
 

 

 

문제

더보기

Q1. 다음 괄호에 들어갈 단어는 메모리의 어떤 특정한 영역 중 하나이다. (          )안에 들어갈 단어는?

 

Q2~Q3.  다음은 스택과 힙을 비교한 설명이다. 맞으면 O, 틀리면 X를 대답하시오

  1. Stack 영역이 클 수록 Heap 영역이 작아지고 Heap 영역이 클 수록 Stack 영역이 작아진다. (     )
  2. 스택 할당 속도와 힙 할당 속도를 비교해보면 힙이 훨씬 빠르다. (    )

Q4. 보기 중 세그먼트 레지스터가 아닌 것을 고르시오

  1. AS
  2. CS
  3. DS
  4. GS
  5. SS

Q5. 다음은 플래그 레지스터에 대한 설명이다. 이중 틀린 설명을 고르시오.

1. Sign Flag: 연산결과 최상위 bit가 1인 경우 1로 설정된다.
2. Overflow Flag: 연산의 결과가 용량을 초과하였을 경우 1로 설정된다.
3. Zero Flag: 연산의 값이 0일 경우 1로 설정된다.
4. Carry Flag: 덧셈과 뺄셈에서 빌림수(Borrow) 발생 시 0으로 설정된다

 

정답

더보기

A1. 다음 괄호에 들어갈 단어는 메모리의 어떤 특정한 영역 중 하나이다. (          )안에 들어갈 단어는?

데이터 영역

 

A2~A3.  다음은 스택과 힙을 비교한 설명이다. 맞으면 O, 틀리면 X를 대답하시오

  1. Stack 영역이 클 수록 Heap 영역이 작아지고 Heap 영역이 클 수록 Stack 영역이 작아진다. (   O    )
  2. 스택 할당 속도와 힙 할당 속도를 비교해보면 힙이 훨씬 빠르다. (  X  )

스택 할당 속도와 힙 할당 속도를 비교해 보면 스택이 훨씬 빠르다 스택은 이미 할당 되어있는 공간을 사용하는 것이고 힙은 사용자가 따로 할당해서 사용하는 공간이기 떄문이다

 

A4. 보기 중 세그먼트 레지스터가 아닌 것을 고르시오 1

  1. AS
  2. CS
  3. DS
  4. GS
  5. SS

AS는 세그먼트 레지스터가 아니다. 세그먼트 레지스터의 종류는 CS, DS, ES, SS, FS, GS가 있다

 

A5. 다음은 플래그 레지스터에 대한 설명이다. 이중 틀린 설명을 고르시오. 4

1. Sign Flag: 연산결과 최상위 bit가 1인 경우 1로 설정된다.
2. Overflow Flag: 연산의 결과가 용량을 초과하였을 경우 1로 설정된다.
3. Zero Flag: 연산의 값이 0일 경우 1로 설정된다.
4. Carry Flag: 덧셈과 뺄셈에서 빌림수(Borrow) 발생 시 0으로 설정된다

 

Carry Flag는 덧셈과 뺄셈에서 빌림수 발생시 0이 아니라 1로 설정된다

 

 

출처:

http://tcpschool.com/c/c_memory_structure

https://jinshine.github.io/2018/05/17/%EC%BB%B4%ED%93%A8%ED%84%B0%20%EA%B8%B0%EC%B4%88/%EB%A9%94%EB%AA%A8%EB%A6%AC%EA%B5%AC%EC%A1%B0/

https://wooeong.tistory.com/entry/%EB%A6%AC%EB%B2%84%EC%8B%B1-%EA%B8%B0%EC%B4%88-%EC%A7%80%EC%8B%9D-%EB%A0%88%EC%A7%80%EC%8A%A4%ED%84%B0Register

peemangit.tistory.com/37

securityfactory.tistory.com/182

https://kali-km.tistory.com/entry/CPU-레지스터 

'컴퓨터 구조' 카테고리의 다른 글

컴퓨터 구조 5주차  (0) 2020.06.05
컴퓨터 구조 4주차  (0) 2020.05.28
컴퓨터 구조 3주차(1)  (0) 2020.05.23
컴퓨터 구조 2주차(2)  (0) 2020.04.16
컴퓨터 구조 2주차(1)  (0) 2020.04.16