들어가며
백엔드 분야를 공부하다보면 꼬리에 꼬리를 물어 하드웨어 레벨까지 내려가는 케이스가 부지기수라 틈틈이 이해한것을 정리해보고자 한다.
CPU 란?
명령어를 해석, 연산, 그 결과를 저장하는 등의 수행을 하는 유닛을 말한다.
아래는 CPU의 대략적으로 표현한 사진이다.
코어와 캐시 메모리 가 눈에 띈다. 이에 대해 알아보자.
코어 (Core) 란?
코어는 CPU 역할을 수행하는 블록이며 블록이란것은 물리적인 단위를 뜻한다.
한 개의 CPU 칩 안에 한개의 코어를 가지는 것을 일반적으로 알고있는 싱글코어라 불리며,
한 개의 CPU 칩 안에 복수개의 코어를 가지는 것을 멀티코어라 하며 코어 개수에 따라 prefix가 달라진다.
(ex 듀얼코어, 쿼드코어, 헥사코어 등)
코어의 요소
1. 제어 장치 (CU, Control Unit)
메모리에서 명령을 가져와 명령어 해독과 해독된 명령어 실행을 지시하는 핵심 장치다.
2. 연산 장치 (ALU, Arithmethic Login Unit)
제어 장치의 지시를 받아 산술, 논리, 비트 연산등의 실제 연산을 수행하는 장치다.
3. 기억장치 (Register)
제어, 연산 장치 등에서 사용하는 임시 기억 장치의 역할을 수행한다. 종류는 다음과 같다.
- PC (Program Counter) : 다음 인출(Fetch) 될 명령어의 주소를 가지고 있는 레지스터
- AC (Accumulator) : 연산 결과 데이터를 일시적으로 저장하는 레지스터
- IR (Instruction Register) : 가장 최근에 인출된 명령어(현재 실행 중인 명령어)가 저장되어 있는 레지스터
- SR (Status Register) : 현재 CPU 의 상태를 가지고 있는 레지스터
- MAR (Memory Address Register) : PC 에 저장된 명령어 주소가 사용되기 전에 일시적으로 저장되는 주소 레지스터
- MBR (Memory Buffer Register) : 기억장치에 저장될 데이터 혹은 읽혀진 데이터가 일시적으로 저장되는 버퍼 레지스터
레지스터의 사용 과정 예시는 다음과 같다.
1) MAR ← PC // 실행할 명령어 주소값을 PC에서 읽어 MAR 에 넣는다.
2) MBR ← M[MAR], PC ← PC + 1 // MAR을 기반으로 Memory 에서 명령어를 읽어 MBR에 넣고, PC 값을 증가시킨다.
3) IR ← MBR // 인출한 명령어를 MBR에 넣는다.
캐시 메모리 란?
코어 내 레지스터는 메인 메모리(RAM)에서 데이터를 읽어 올 수 있지만 메인 메모리는 레지스터 보다 상대적으로 속도가 느리기 때문에 병목현상이 발생할 수 있다. 이 속도 차이를 극복하기 위해 사용되는것이 캐시 메모리다.
코어 밖 그리고 CPU 내에 존재한다.
캐시 메모리 또한 종류가 나뉘는데 L1 Cache는 코어 간 독립적으로 가지며 코어 내 레지스터로 부터 읽히고 쓰이는데 사용된다. 그리고 L2 Cache는 L1 Cache 간 공유되어 읽히고 쓰이는데 사용된다. L3 Cache 역시 L2 Cache 들로부터 부터 읽히고 쓰이는데 사용된다.
다시 정리하자면 코어내 레지스터와 메인 메모리간 속도 차이를 극복하고자 중간에 캐시 메모리를 두는 것이다.
지금 까지 했던 내용을 그림으로 정리하면 아래와 같다.
CPU 기타 용어
스레드 (Thread)
작업을 처리하는 논리적인 단위를 말한다.
하나의 코어에 보통 하나의 스레드가 존재하는것이 일반적이지만 하이퍼 스레딩 기술을 이용해 하나의 코어에 두개의 스레드를 사용하여 성능을 높이는 기술도 존재한다. 이때 운영체제는 코어를 2개로 인식한다고 한다.
추가적으로 프로그래밍 관점에서 멀티스레드 환경의 경우 CPU가 논리적으로 가지는 스레드 개수만큼 병렬적으로 처리가 되지만
CPU가 논리적으로 가지는 스레드 개수보다 초과되어 스레드 작업이 요청되면 논리적인 스레드 개수 이외의 작업들은 동시성으로 처리가된다.
클럭 (Clock)
클럭이라는 수치는 CPU 내부에서 일정한 주파수를 가지는 신호로, 이 신호에 동기화되어 CPU의 모든 명령어가 동작하게 된다.
클럭 수가 2.0GHz라면 초당 20억 번의 명령어를 처리할 수 있다는 의미다.