티스토리 뷰

🟩 학습 목표

  • CPU의 물리적 구성 요소인 ALU, 제어장치, 레지스터의 역할을 이해한다.
  • 시스템 버스를 통해 데이터가 이동하는 경로와 명령어 사이클의 단계를 파악한다.
  • 언리얼 엔진의 Tick()과 블루프린트 로직이 하드웨어 계층에서 어떻게 처리되는지 연결하여 학습한다.

🟧 1. CPU의 내부 구조와 핵심 부품

🟦 ALU (산술논리연산장치)

  • CPU 내에서 유일하게 값이 실제로 변하는 장소이며 하드웨어 회로 뭉치로 구성된다.
  • 레지스터에 있는 숫자를 가져와 더하기, 빼기, 비교 연산을 수행한다.
  • 계산 직후 결과의 상태(0 여부, 마이너스 여부 등)를 플래그 레지스터에 기록한다.

🟦 제어장치 (CU)

  • 전기 신호를 보내 CPU의 모든 부품을 깨우고 움직이게 만드는 지휘자 역할을 한다.
  • 클럭에 맞춰 모든 부품이 동시에 움직이도록 박자를 맞춰준다.
  • 명령어 해독기를 통해 메모리에서 가져온 기계어를 번역하고 각 장치에 전기 신호를 보낸다.

🟦 레지스터 (Registers)

  • 메모리까지 가기엔 너무 멀어서 CPU가 품 안에 들고 있는 작은 데이터 바구니들이다.
  • PC (프로그램 카운터): 다음에 실행할 명령어의 메모리 주소를 가리키는 포스트잇이다.
  • IR (명령어 레지스터): 현재 실행 중인 명령어를 담아두는 독서대 역할을 한다.
  • MAR 및 MBR: 메모리 창고의 주소와 실제 데이터를 주고받기 위한 임시 쟁반이다.

🟧 2. 시스템 버스: 정보의 이동 통로

🟦 주소 버스 (Address Bus)

  • CPU가 데이터를 읽거나 쓰려는 메모리의 주소를 지목하는 단방향 통로다.
  • 버스의 폭이 CPU가 한 번에 지정할 수 있는 메모리 용량을 결정한다.

🟦 데이터 버스 (Data Bus)

  • 실제 명령어와 데이터 내용물이 이동하는 양방향 핵심 통로다.
  • 도로가 넓을수록(폭이 클수록) 한 번에 더 많은 데이터를 운반할 수 있다.

🟦 제어 버스 (Control Bus)

  • 읽어라, 써라 같은 명령이나 인터럽트 신호를 전달하는 신호등 역할을 한다.
  • 각 부품이 일을 마쳤는지 혹은 오류가 났는지 보고받는 무전기 기능도 겸한다.

🟧 3. 명령어 사이클: CPU의 무한 루프

🟦 인출 (Fetch)

  • 메모리에 저장된 레시피(명령어)를 가져와 IR에 펼쳐 놓는 단계다.
  • PC는 다음 작업을 위해 주소 값을 1 증가시킨다.

🟦 해독 (Decode)

  • IR에 담긴 암호 같은 기계어를 분석하여 구체적인 실행 계획으로 분해한다.
  • 이 명령을 위해 어떤 부품이 움직여야 할지 결정하는 단계다.

🟦 실행 (Execute)

  • ALU가 연산을 수행하거나 데이터를 전송하며 실제로 몸을 움직여 일하는 단계다.
  • 조건문에 따라 PC 값을 강제로 바꿔 코드의 실행 흐름을 점프시키기도 한다.

🟧 4. 언리얼 엔진 인사이트 (하드웨어 관점)

🟦 Tick() 루프의 실체

  • Tick은 하드웨어의 명령어 사이클을 엔진 수준에서 추상화한 거대한 프레임 단위 박자다.
  • 하드웨어의 무한 루프가 멈추면 게임의 Tick도 멈추고 화면은 정지한다.

🟦 블루프린트 VM이 느린 이유

  • C++은 요리사가 바로 읽는 익숙한 레시피지만, 블루프린트는 통역사(가상 머신)가 한 문장씩 번역해줘야 하는 외국어 레시피와 같다.
  • VM이 바이트코드를 하드웨어가 이해하는 신호로 다시 번역하는 해독 과정이 추가되기 때문이다.

🟦 캐시 효율과 데이터 로컬리티

  • TArray 사용을 권장하는 이유는 메모리에 데이터를 순서대로 배치하여 한 번에 여러 데이터를 MBR에 담아오기 위해서다.
  • 재료들이 흩어져 있으면 요리사(CPU)가 창고(RAM)를 계속 왔다 갔다 해야 하므로 요리 시간이 길어진다.

🟧 핵심 요약 및 주의사항

  • ALU : 유일하게 값이 변하는 계산기.
  • 제어장치 : 전기 신호로 부품을 조종하는 스위치 관리자.
  • 레지스터 : CPU 옷 주머니에 든 가장 빠른 저장소.
  • 버스의 병목 : CPU 속도보다 메모리 전송 속도가 느리므로 데이터를 뭉쳐서 관리하는 배려가 효율적인 코드의 본질이다.
  • if 조건문 : 계산 결과(플래그)를 보고 다음에 읽을 페이지(PC)를 결정하는 행위다.