본문 바로가기
PROGRAMMING/C

컴퓨터 메모리 시스템 (메모리 구조와 체계의 이해, 레지스터, L1 L2 L3 캐시메모리)

by 쪼렙엔지니어 2022. 1. 8.
반응형

 

오늘은 컴퓨터시스템에서 메모리 부분에 대해 이야기 해 보려고 합니다.

차근차근 하나씩 비전공자도 이해할 수 있는 설명으로

풀어서 설명해 보겠습니다.

 

 

 

 

메모리의 체계

이전 포스팅에서 프로그램을 실행하면 실행되는 부분들이 CPU에서 연산되기 전에

메모리에서 순서대로 대기하고 있다고 했었지요?

메모리에도 종류가 있고, 종류마다 성능과 용량이 제각각 입니다.

일단 메모리의 전체적인 구조를 보자면 아래와 같습니다.

가장 CPU에 가까이 위치해 있는 메모리는 Register(레지스터)입니다.

그럼 위 그림에서 보자면 가장 멀리 있는 건 SSD나 Hard Disk가 되겠지요.

물론 ODD (CD나 DVD같은 외부 저장매체)가 속도는 더 느리고

CPU에서의 접근성은 더 멀어지겠지요.

 

 

여튼  전체적인 개념도는 위와 같습니다.

현재 CPU의 연산속도는 굉장히 빠른편입니다.

그러나 메모리의 성능이 CPU의 연산속도를 따라가지 못하고 있어

대역폭 딜레이가 발생하고 그걸 매꿔주기 위해 중간에 캐시메모리가

존재합니다.

 

즉 보조기억장치 (HDD, SSD)의 데이터를 CPU에서 사용하기 위해서

주기억장치 (RAM)을 거쳐서 CPU의 내부 메모리인 Cache Memory를 통해서

CPU로 데이터가 이동됩니다.

 

보조기억장치인 HDD나 SSD의 데이터는 우리가 컴퓨터 전원을 꺼도 데이터가 살아 있지만

주 기억장치인 RAM 부터는 우리가 컴퓨터 전원을 끄면 가지고 있던 데이터가

모두 소멸되어 버립니다.

 

자 그럼 메모리 중에서도 Cache Memory와 우리가 RAM이라고 부르는 Memory의 

차이점에 대해서 이야기 해 보겠습니다.

 

 

 

 

 

 

SRAM과 DRAM

메모리에는 정적램(SRAM)과 동적램(DRAM)이 있는데

SRAM은 용량은 적고, 속도는 빠르고, 비쌉니다.

DRAM은 용량은 크지만, 속도가 SRAM에 비하여

상대적으로 느리고, 비교적 가격이 저렴합니다.

 

SRAM은 캐쉬 메모리에 제한적으로 사용되고,

DRAM은 우리가 일반적으로 부르는 메모리로 사용됩니다.

캐쉬메모리는 L1, L2, L3로 계층이 분리되어 있고,

L1이 가장 빠른 속도를 가지고, 프로세서에

가장 근접한 위치를 가지지만 용량은 가장 작습니다.

 

읽는 순서는 CPU가 연산에 필요한 데이터를 가장 먼저 L1에 요청하고 L1에 없으면

L2에 요청하고 L2에도 없으면 L3, 그 다음은 메모리에 요청하는 방식입니다.

이 과정 중에 일어나는 일이 캐쉬미스이며,

이 캐쉬미스를 줄이기 위하여 많은 노력이 필요합니다.

CPU가 요청한 정보가 L1에 없으면 캐쉬미스가 일어나고

L2에도 없으면 다시 캐쉬미스가 일어납니다.

캐쉬미스를 줄이기 위한 알고리즘은 굉장히 중요하고 어렵고 난해합니다.

이것이 곧 프로세서의 성능을 좌우하는 중요한 요소이기 때문입니다.

 

읽어 들일 때는 L1에 없는 데이터를 L2에 요청하는 경우

L2의 데이터가 L1으로 복사된 뒤 CPU로 전송됩니다.

L2에도 없다면 L3에서 L2로 복사되고 다시 L1으로 복사되는 과정을 거치게 됩니다.

 

 

 

 

 

 메모리와 데이터의 단위

이전 포스팅에서도 이야기 했지만

CPU는 "0" 과 "1" 밖에 모르는 바보입니다.

그래서 우리가 "5"라고 인식하는 수의 크기를

0101 이라는 2진수로 인식을 합니다.

3+2 = 0011 + 0010 으로 인식을 하는거죠.

다만 그 속도가 어마어마하게 빠릅니다.

 

그럼 수의 크기에 따라 데이터 단위가 어떻게 바뀌는지 알아보겠습니다.

 

1) 1 Bit (비트)

2가지 수를 표현가능 하며 숫자 0과 1을 표현 할 수 있습니다.

2) 1 Nibble (니블)

4bit 크기이며

16가지 수를 표현가능 하고 0 ~15까지 표현 가능합니다.

3) 1 Byte (바이트)

8bit 크기이며

256가지 수를 표현가능 하고 0 ~ 255까지 표현 가능합니다.

단 0 ~ 255의 표현은 부호가 없는 0을 포함하는 양의 정수일때의 영역이고,

부호를 포함하여 정수(음의 정수와 양의 정수 모두를 포함)를 표현하고 싶을때는

-128 ~ 127까지의 표현이 가능합니다.

(부호가 있고 없고를 어떻게 나타내는지는 다음 포스팅에서 자세히 다루도록 하겠습니다.)

4) 1 Word (워드)

16bit 크기이며

65,536가지 수를 표현가능 하고 0 ~ 65,535까지 표현이 가능합니다.

단 바이트와 마찬가지로 부호를 포함한 전체영역의 정수 표현은

-32,768 ~ 32,767까지의 표현이 가능합니다.

5) 1 Double Word (더블 워드)

32bit 크기이며

4,294,967,296가지 수를 표현가능 하고 0 ~ 4,294,967,2985 까지 표현이 가능합니다.

바이트나 워드와 마찬가지로 부호를 포함한 전체영역의 정수 표현은

-2,147,483,648 ~ 2,147,483,647까지 표현이 가능합니다.

6) 1 Long Word (롱워드)

64bit 크기이며

사실 롱워드까지는 잘 사용하지 않습니다.

표현가능한 수는

입니다. 손으로 풀어서 쓰거나 계산하기에도 어마어마하게 큰 값이죠.

바이트나 다른 워드종류들과 마찬가지로 부호를 포함한 전체영역의 정수 표현은

-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 입니다.

 

일단 여기까지가 메모리를 쪼개어 사용하는 데이터의 단위 입니다.

그럼 이 데이터의 단위를 C언어에서 어떻게 활용하는지를

알아보겠습니다.

 

 

 

 

 

데이터 단위의 활용 (feat. C언어의 자료형)

사실 이건 프로그래밍 언어나 프로세서 마다 약간씩 다릅니다.

그러나 하나만 감을 잡으면 다른 프로그래밍 언어도 거의 비슷하기 때문에

쉽게 감을 잡을 수 있습니다.

일단 C언어 기준으로 설명드리겠습니다.

 

우리가 저장하고자 하는 데이터의 종류(크기)에 맞는 메모리의 크기가 자동 할당 되는데

이때 저장하고자 하는 데이터의 종류를 자료형이라고 부르고

자료형에 따라서 구분합니다.

 

C언어에서의 자료형의 종류는 아래와 같습니다.

 

1) int

4byte (32bit) 크기이며, 정수 데이터를 저장할 때 사용합니다.

 

2) char

1byte (8bit) 크기이며, 문자를 저장할 때 사용합니다.

문자는 아스키 코드값으로 저장됩니다.

 

3) short

2byte (16bit) 크기이며, 정수 데이터를 저장할 때 사용합니다.

 

4) long

4byte (32bit) 이상의 크기이며, 정수 데이터를 저장할 때 사용합니다.

int도 4byte크기를 사용하기 때문에 거의 사용하지 않습니다.

 

5) longlong

8byte (64bit) 크기이며 C언어에서 제일 긴 자료형입니다.

정수를 저장할 때 사용하는데,

-922경에서 922경까지 저장할 수 있습니다.

잘 쓸일은 없겠죠....

 

6) float

4byte (32bit) 크기이며, 소수점숫자(실수)를 저장할 때 사용합니다.

 

7) double

8byte (64bit) 크기이며, float보다 더 큰 실수를 저장할 때 사용합니다.

 

8) long double

컴파일러마다 할당되는 메모리크기가 다릅니다.

TC++ : 10byte

Dev C++ : 12byte

gcc : 16byte

Visual Studio : 8byte 

실수를 저장할 때 사용합니다.

 

자료형과 데이터의 단위를 잘 매칭시켜 보면

표현하거나 저장하고자 하는 수를 어떤 자료형의 어떤 크기로

저장할 수 있는지 감이 잡히실 겁니다.

 

그럼 컴퓨터에서 수의 저장방법에 대해 좀 더 자세히 알아보겠습니다.

 

 

 

 

 

수의 저장

만약 187이라는 숫자를 저장하고 싶다고 하면

어떤 자료형과 데이터 사이즈는 얼마나 할당해야 하는지 알아보겠습니다.

 

만약 이진수가 10111011 로 되어 있다면,

제일 오른쪽 첫번째 자리는 2의 0제곱의 자리

제일 오른쪽부터 두번째 자리는 2의 1제곱의 자리

제일 오른쪽부터 세번째 자리는 2의 2제곱의 자리가 됩니다.

 

따라서 정수 10진수인 187은 2진수 1011 1011이 됩니다.

이해가 되시나요???

 

 

 

 

오늘 내용은 일단 여기까지 입니다.

CPU와 메모리의 관계, 메모리의 체계와 데이터의 단위에 대해서는

잘 알고 계셔야 합니다.

반복해서 읽어보시면서 감을 잡으시길 바랍니다.

반복과 연습 만큼 빠르게 강해지는 길은 없습니다.

 

다음시간에는 이제 컴파일러를 하나 설치해 보는 시간을 갖도록 하겠습니다.

 

제 블로그를 방문해 주셔서 감사합니다.

함께 성장 해 나갈 수 있도록 노력하겠습니다.

반응형

댓글