Computer/Hardware

CPU와 연산

한땀코딩 2020. 8. 6. 23:39

🎛 CPU 이해하기

어찌 보면 개발을 하면서 나를 위해 가장 열심히 뛰고 있는 건 CPU일 것이다. 컴퓨터에 필요한 연산은 대부분 이곳에서 이루어지고, 컴퓨터 구조나 공학을 전공하지 않는 내 입장에서는 그냥 컴퓨터의 뇌 같은 (저장의 관점에서는 조금 다르겠지만) 존재로만 인지하고 있었다. 그러다 문득 현재 사용하고 있는 맥북의 CPU가 궁금하여 찾아보게 되었는데, 내 기준에서는 참 암호 같은 문구이다.

 

2.6 GHz 6‑core Intel Core i7, Turbo Boost up to 4.5 GHz, with 12MB shared L3 cache

복잡하게 생각하지 말고 우선은 CPU 전반에 대해서 간략하게 짚고 넘어가보자.

🎛 CPU의 정의

한국어로는 중앙처리장치. 위키피디아의 정의를 빌리자면, 컴퓨터 시스템을 통제하고 프로그램의 연산을 실행하고 처리하는 가장 핵심적인 컴퓨터의 제어 장치, 혹은 그 기능을 내장한 칩이라고 한다. 어렵게 생각할 거 없이, 어떠한 연산을 하기 위한 장치라는 것이고, '중앙'이라는 말에서 보이듯이 웬만한 연산은 모두 이쪽으로 넘어오게 될 것이다. CPU는 결국 아주아주 성능이 좋고 복잡한 계산기 같은 존재인 것이다.

그럼 CPU가 어떻게 이 연산을 할 수 있을까? 우리가 적는 코드나 프로그램이 어떻게 CPU에게 넘어가게 될까?

만약 C로 코드를 작성하고 실행한다고 치면:

C로 코드 작성 → 컴파일러가 해석 → 어셈블리 코드 → 어셈블러가 기계어로 변환 → 오브젝트 파일 생성 → 링커 → 실행 파일

 

대략 이런 흐름을 따라가게 된다. 여기서 CPU는 기계어를 받아서 작업을 하기 때문에, 어셈블러를 거쳐서 어셈블리 언어를 기계 언어로 바꿔주어야 한다.

🎛 CPU를 구성하는 것

세세하게 들어가기 시작하면 끝이 없기 때문에 위키피디아에서 소개한 안내도와 함께 간략하게 적어보고자 한다.

  • Control unit - 연산을 감독하는 부분이라고 볼 수 있다. 메모리나 ALU, 입출력 장치들이 어떻게 명령에 맞게 작동하면 되는지를 지시한다.
  • Arithmetic logic unit - 비트 연산과 사칙연산을 담당하는 프로세서.
  • Address generation unit - 주기억장치를 접근하기 위한 주소를 계산하는 연산 장치
  • Memory management unit - 실제 RAM 주소에 접근하기 위한 작업을 처리하는 연산 장치
  • cache - 매번 주기억장치에 접근하지 않도록 자주 쓰는 주소로부터 데이터를 가져와 저장해두는 물리적인 공간.

🧮 그래서 연산이란?

https://www.youtube.com/watch?v=Z5JC9Ve1sfI&feature=emb_logo

이 주제가 낯선 사람이라면 위의 영상에서도 굉장히 상세하게 설명하고 있기 때문에 시청을 추천한다.

모든 연산은 소위 말하는 '클락'의 개념과 연결하여 생각하면 된다. 정말 시계의 초침이 탁탁 움직이듯이, CPU도 모든 연산의 과정이 마치 시계처럼 순차적으로 흐르게 된다. CPU의 클락이 한 번 돌 때마다, CPU안에서는 Fetch → Decode → Execute가 각각 수행된다 (클락 3번에 이 3개의 과정이 다 돈다고 보면 된다).

또한, 레지스터라는 것이 있는데, 레지스터에는 작업에 필요한 값을 저장하고 있다. 레지스터에도 종류가 몇 가지 있는데, 이 중에서도 특수한 역할 갖는 것들을 특수 목적 레지스터라고 한다.

  • 메모리 주소 레지스터: (MAR) : 읽고 쓰기 위한 주기억장치의 주소를 저장한다.
  • 프로그램 카운터 (PC) : 다음에 수행할 명령어의 주소를 저장
  • 명령어 레지스터 (IR) : 현재 실행 중인 명령어를 저장
  • 메모리 버퍼 레지스터 (MBR) : 주기억장치에서 읽어온 데이터나 저장할 테이터를 임시로 저장
  • 누산기 (AC, ACCUMULATOR) : 연산 결과를 임시로 저장

그리고 이런 작업을 위한 받아온 명령어가 저장되어 있어야 하는데, 이걸 RAM에서 담당한다. 프로그램 카운터를 알고 있기 때문에, 계속해서 다음 수행할 명령을 받아올 수 있는 것.

결국 컴퓨터가 동작함에 있어서, low-level 단에서는 명령어 하나하나를 풀어서 해독하고 레지스터를 이용하여 값을 구하고, 저장하고, 기타 등등... 이 연산들이 일어나는데 이걸 하나하나 어셈블리어나 기계어로 치고 있는 것은 생산성을 현저하게 떨어뜨리게 된다. 이를 위해 탄생한 것이 C와 같은 high-level 언어인 것. 이런 언어로 작성된 코드가 컴파일될 때, 위의 복잡한 과정에 대해서 자동으로 처리를 해주는 것이고, 우리는 그저 프로그램을 실행하는 것만으로도 CPU에게 필요한 연산을 모두 요청하게 되는 것이다.

🧐 헤르츠

헤르츠 - 신호의 주기가 한번 도는 기준. 1 헤르츠면 1초에 한 번의 주기. 1기가 헤르츠라고 하면 1초에 1기가만큼(1024메가), 즉 10억 번 정도인 셈. 한 클락이 이 주기를 의미하는데, 한 명령어당 한 클락 정도로 생각하면 된다고 한다.