CPU Register

CPU에는 레지스터라고 불리는

특수한 메모리가 있습니다.

 

컴퓨터에 메모리가 있는 것은 누구나

잘 아는 사실입니다. 메모리라고

판매를 하기 때문이지요.

CPU는 메모리에 값을 넣고 계산하면

될텐데 왜 레지스터가 다시 필요한가?

하는 문제는 병목현상 때문입니다.

우리가 눈에 보이지 않아서 잘 못느끼지만

메모리의 동작속도 보다 CPU의 동작속도가

더 빠르기 때문에(bus의 속도 차이)

그냥 메모리만 사용해도 컴퓨터는 돌아가지만

CPU가 가만히 있는 시간이 길어져서

효율이 좋지 않습니다. 성능을 끌어올리기

위해 L1 캐시 메모리라는 것을 만들었고

다시 L1 캐시 메모리를 레지스터와 연결하여

병목현상을 개선한 모델입니다.

 

여기서 L1, L2 캐시 메모리는 몰라도 되지만

레지스터는 x86 CPU가 원초적으로 작동하는

원리입니다. 어셈블리어 코드를 사용하면

직접 기계어를 CPU에 넣어서 프로그래밍하는

것돠 같습니다. 어셈블리어의 니모닉(명령어)은

기계어와 1대1 대등하기 때문입니다.

(물론 컴파일러의 지시자 등은 다를 수 있다)

 

 

mov rax, 1

mov eax, 1

...

 

이런 명령어(instruction)들은 레지스터를

조작하는 코드입니다.

 

64비트 레지스터를 그려보면 아래와 같습니다.

 

rax가 64비트 그 안에 오른쪽 32비트가

eax, 그 안에 16비트가 ax 그 안에 오른쪽

8비트가 al 이라고 합니다.

 

ax 는 16비트로 오른쪽 8비트를 al (lower)

왼쪽 8비트를 ah(higher)라고 부릅니다.

 

CPU는 이것들을 조작해서

온갖 숫자를 계산합니다.

 

x86 레지스터 모델

 

범용 레지스터 16개의 이름은 아래와 같습니다.

 

뭔가 복잡해 보이지만 각각의 레지스터는

사용 목적이 있습니다. 일단 16개의 64비트

레지스터가 있다는 정도를 알아둡니다.

 

al, ax, eax 는 rax와 별도가 아니라

rax의 내부를 부르는 이름입니다.

예를 들어 eax를 사용하면 오른쪽 비트

32비트를 사용하지만 이는 rax의 일부입니다.

 

몇몇 레지스터의에 대해서 알아보면...

 

Stack Pointer Register - rsp

CPU가 현재의 스택의 탑을 가리키는 용도입니다.

(스택은 접시 처럼 쌓아놓는 자료구조)

Base Pointer Register - rbp

함수를 호출할 때 기본 포인터로 사용합니다.

 

Instruction Pointer Register - rip

다음에 실행할 명령어의 주소를 가지고 있습니다.

CPU의 명령어라는 건 기계어 instruction set 을

의미합니다. 프로그램이 순차적으로 실행되는 것은

이 rip 레지스터를 증가시키기 때문입니다.

명령어 세트의 종류에 따라 바이트 개수가

다르기 때문에 꼭 rip 가 +1 바이트 단위로

증가하지는 않습니다. 또 rip의 주소는

아직 실행되지 않은 코드의 위치입니다.

방금 실행된 위치가 아니라 바로 다음에

실행될 코드의 위치입니다.

 

Flag Register

플래그 레지스터는 레지스터와 비슷한 것으로

CPU 상태와 제어 정보를 포함합니다.

Carry, Parity, Zero 등의 상태를 표현합니다.

이 포스팅에서는 자세히 다루지 않겠습니다.

 

XMM Register, MMX Register

x86 아키텍쳐에 도입된 레지스터인데

이것들에는 별도의 instruction이 있습니다.

역시 여기서는 다루지 않습니다.

 

캐시 메모리(Cache Memory)

캐시 메모리는 레지스터는 아니지만

알아둬야할 개념입니다. CPU 설계시

내부에 L1, L2의 이름으로 메모리를

탑재하는데 일반 메모리보다 동작속도가

빠릅니다. 빈번하게 사용되는 명령어,

코드 등을 여기서 돌리면 훨씬 빨라집니다.

 

CPU연산이 많은 프로그램은 캐시메모리를

사용함으로써 성능을 향상시킬 수 있습니다.

 

CPU - 레지스터 - L1 - L2 - 메모리 버스 

 

이런 식으로 연결되어 있습니다.

다만 칩디자인은 계속 바뀔 것이기 때문에

새로운 칩이 나올 때 해당 CPU의

사양을 참고하는게 좋을 겁니다.

 

x86은 아니지만 애플의 M1 칩이 나오고 나서

뭔가 오랫동안 절대적이라고 믿어왔던

인텔의 이 디자인이 과연 옳은 것인가?

앞으로도 지속될 것인가에 대한 의문은 듭니다.

 

물론 IBM호환 PC라는 가치는 애플처럼

한 회사에게 종속되는 그런게 아니긴 합니다

신형 CPU가 무거워지는 것은 기존의

호환성을 가져가야 하기 때문에 필연적인 것인데

순수하게 CPU의 성능만으로 따질 수는 없을겁니다.

 

어셈블리어를 배우면 알게되지만 CPU가 바뀌면,

정확히는 instruction set 이 바뀌면 기존의

프로그램의 모든 코드들을 다 수정하던가

중간에 OS가 알아서 에뮬레이션을 하던가

가상화 프로그램을 사용하던가 해야 합니다.

 

하드웨어든 소프트웨어는 뭐든 업그레이드를

하다보면 시간이 지날 수록 무거워집니다.

우리가 나이를 먹는 것과 비슷한지도 모릅니다.

 

암튼 이런 디자인을 현재 x86에서 사용하고 있다.

 

캐시 메모리를 사용해서 성능을 올릴 수 있다 -

정도를 이해하면 충분할 것 입니다.

 

요약 & 정리

좀 쉬운 비유를 해볼까요? 도서관에서 숙제를

하는 학생이 있습니다. 도서관의 여러 책들을

참고해서 과제를 완성해야 합니다.

 

도서관은 방대한 책이 꽂혀 있어서 컴퓨터의

메모리 같은 곳입니다. 용량이 100기가는 하겠네요.

그런데 그 모든 책을 한번에 볼 수는 없습니다.

한번에 가져와서 볼 수 있는 책은 많아봐야

5권 10권 정도일 겁니다. 책을 가져와서

책상에 앉아서 작업을 해야겠지요. 이 책상이

바로 레지스터입니다. 책을 옆에 쌓아놨다면

L1 캐시 메모리 정도 되겠네요.

자료를 찾다가 지금 보는 책에서 없으면

옆의 책더미에서 찾고(L1 캐시) 여기서도

없으면 이제 넓은 도서관을 찾아 헤메여야 합니다.

시간이 많이 걸리겠지요. CPU도 마찬가지 입니다.

 

어셈블리어는 프로그래머가 레지스터에

직접 접근하여 조작할 수 있는 권한을

주기 때문에 강력하고 그 대신 어렵고

코드를 설계하고 작성하는데 시간이 오래걸립니다.

 

하지만 CPU를 가장 잘 이해할 수 있는

언어인 것은 확실합니다.

공유하기

facebook twitter kakaoTalk kakaostory naver band