컴퓨터의 4가지 핵심 부품
컴퓨터는 수많은 부품으로 구성되어 있지만, 그중에서도 가장 핵심적인 4가지 부품이 있습니다. 이들은 컴퓨터가 작동하는 데 있어 중심적인 역할을 하며, 서로 유기적으로 연결되어 동작합니다.
- CPU(Central Processing Unit)
- 메모리(Random Access Memory: RAM)
- 스토리지(보조 기억 장치)
- 입출력 장치(I/O Devices)
이러한 핵심 부품들이 서로 소통하려면, 이들을 연결해주는 통로가 필요합니다. 바로 메인보드(Mainboard)와 그 위에 구성된 시스템 버스(System Bus)가 그 역할을 합니다. 메인보드는 모든 부품이 연결되는 중심 회로 기판으로 CPU 소켓, RAM 슬롯, 저장장치 연결 포트, 그래픽 카드 슬롯 등 다양한 커넥터가 존재하며, 전원 공급과 데이터 통신을 조율합니다. 시스템 버스는 CPU와 메모리, 입출력 장치들 간의 데이터를 전달하는 통로입니다.
데이터란 컴퓨터를 동작시키는 실직적인 정보인 명령어와 그 명령어의 대상이 되는 실제 데이터를 모두 포함하는 개념입니다.
메모리, 스토리지, 입출력 장치
4가지 핵심 부품중 메모리와 보조기억장치는 컴퓨터 시스템에서 데이터를 저장하는 두 가지 주요 장치입니다.
메모리는 주 기억장치로, CPU가 실행 중인 프로그램과 데이터를 일시적으로 저장하는 공간으로 빠른 속도를 가지나 휘발성이 있어 컴퓨터가 종료되면 저장된 모든 데이터가 사라집니다. 반면, 스토리지는 보조 기억 장치로 메모리보다 속도는 느리지만 컴퓨터가 꺼져도 데이터가 영구적으로 보관됩니다.
입출력 장치 (I/O devices)는 컴퓨터 시스템과 외부 환경 사이에서 데이터를 입력하거나 출력하는 역할을 하는 장치들입니다. 컴퓨터가 외부와 상호작용할 수 있도록 도와주는 중요한 부품으로, 컴퓨터가 정보를 입력받고 출력하는 모든 작업을 담당합니다.
마지막 핵심 부품인 CPU는 아래에서 자세히 살펴보겠습니다.
CPU
CPU는 컴퓨터에서 프로그램의 명령을 해석하고 실행하는 "두뇌" 역할을 합니다. CPU 내부에는 여러 가지 중요한 부품이 있지만, 가장 핵심적인 3가지 부품은 다음과 같습니다.
- 연산 장치(Arithmetic Logic Unit: ALU)
- 제어 장치(Control Unit: CU)
- 레지스터들(Registers)
연산장치(ALU)는 수학적 계산과 논리 연산을 처리하는 장치입니다. 예를 들어, 덧셈, 뺄셈, 곱셈, 나눗셈과 같은 수학적 연산뿐만 아니라 비교 연산(같음, 크기 비교 등)도 수행합니다.
제어 장치는 프로그램 명령을 해석하고, 그에 맞는 제어 신호를 다른 부품으로 보내어 CPU가 명령을 수행하도록 합니다. 각 명령의 실행 순서를 관리하고, 연산이 이루어질 때 필요한 데이터를 전달하는 역할을 합니다.
레지스터는 CPU 내부에서 매우 빠르게 데이터를 저장하고 처리할 수 있는 작은 메모리 공간입니다. 레지스터는 주로 ALU가 연산을 수행하는 데 필요한 데이터를 일시적으로 저장하거나 제어 장치가 작업을 실행할 때 사용하는 중간 저장소 역할을 합니다.
명령어
명령어란 컴퓨터를 동작시키는 실질적인 정보로 다음과 같은 구성 요소를 갖습니다.
- OpCode(연산코드)
- Operand(피연산자)
Opcode는 명령어의 종류를 지정하는 부분으로 ADD, SUB, LOAD, JMP 등이 있고, Operand는 연산의 대상이 되는 데이터 또는 주소를 의미하며 예를 들어 레지스터(R1), 메모리 주소(100번지), 상수 값(10)등이 있습니다.
명령어의 길이가 한정되어 있기 때문에 Operand에는 대상(데이터)이 직접 명시되기도 하고, 대상의 위치가 명시되기도 합니다.
명령어 사이클
CPU의 명령어 사이클(Instruction Cycle)은 컴퓨터가 프로그램을 실행할 때, 각 명령어를 처리하는 기본적인 작업 과정입니다. 명령어 사이클은 기본적으로 2단계로 요약할 수 있습니다.

- 인출 사이클(Fetch)
- 실행 사이클(Execute)
인출 사이클은 CPU가 메모리에서 실행할 명령어를 가져오는 과정이고, 실행 사이클은 인출된 명령어를 실제로 실행하는 단계입니다.
주소 지정 방식
명령어 사이클에 이어 간접 사이클에 대해 알아보기 전 주소 지정 방식에 대해 간단히 살펴보겠습니다.
주소 지정 방식(Addressing Modes)은 명령어 내에 포함된 주소가 어떻게 해석되어 데이터를 찾을지 결정하는 방법입니다. 즉, 명령어의 Operand에 어떠한 값이 지정되어 있는지를 의미합니다. 이번 글에서는 간단하게 대표적인 5개의 주소 지정 방식만 소개하겠습니다.
- 즉시 주소 지정
- 직접 주소 지정
- 간접 주소 지정
- 레지스터 주소 지정
- 레지스터 간접 주소 지정
즉시 주소 지정은 연산에 사용할 데이터를 Operand 필드에 직접 명시하는 방식입니다. 가장 빠른 주소 지정 방식이나 데이터 크기에 제한이 있습니다.
직접 주소 지정은 Operand 필드에 유효 주소(연산에 사용될 데이터가 저장된 메모리 주소)를 명시하는 방식입니다.
간접 주소 지정은 Operand 필드에 유효 주소의 주소를 명시하는 방식입니다.
레지스터 주소 지정은 연산에 사용할 데이터를 저장한 레지스터를 Operand 필드에 직접 명시하는 방식으로 메모리 접근 보다 빠릅니다.
레지스터 간접 주소 지정은 연산에 사용할 데이터를 메모리에 저장하고 그 유효 주소를 저장한 레지스터를 Operand 필드에 명시하는 방식입니다.
간접 사이클

간접 사이클(Indirect Cycle)은 CPU 명령어가 메모리나 레지스터에 저장된 주소를 참조하여 데이터를 접근하는 과정에서 발생하는 추가적인 사이클을 의미합니다. 주로 간접 주소 지정 방식(Indirect Addressing)을 사용할 때 발생합니다. 즉 두 번의 메모리 접근이 필요할 때 발생합니다.
인터럽트 사이클

인터럽트 사이클 (Interrupt Cycle)은 프로그램 실행 중에 인터럽트가 발생했을 때 CPU가 현재 작업을 중단하고 인터럽트 처리를 수행하기 위한 사이클입니다. 인터럽트란 "방해하다", "중단시키다" 라는 의미를 가지며, CPU의 정상적인 실행 흐름을 방해하는 신호를 의미합니다. 인터럽트 사이클은 주로 인터럽트 중에서 비동기 인터럽트(하드웨어 인터럽트)에 해당하는 입출력 장치에 의해서 발생합니다.
입출력 장치가 CPU에게 인터럽트 요청 신호를 보내면 CPU는 인출 사이클에 진입하기 전에 인터럽트 여부를 확인하여 인터럽트가 가능하다면 지금까지의 작업을 메모리 스택 영역에 백업하고 ISR(Interrupt Service Routine)을 실행합니다. ISR이 끝나면 CPU는 백업한 작업을 복구하여 실행을 계속합니다.
클럭
클럭은 CPU 내부에서 모든 동작의 속도를 제어하는 신호입니다. CPU는 클럭 신호에 따라 명령어 사이클에 맞춰 명령어를 실행하기 때문에 이 신호는 초당 몇 번의 연산이 가능한지를 나타내며, Hz(헤르츠) 단위로 측정됩니다. 따라서 클럭 속도가 빠를 수록 CPU는 더 많은 작업을 더 빨리 처리할 수 있습니다.
아키텍처
ISA(Instruction Set Architecture)는 CPU가 이해하고 실행할 수 있는 명령어 집합을 정의하는 아키텍처, 즉 설계 기준입니다. 프로그래밍 언어로 작성된 코드가 실행되기 위해서는 결국 이 ISA 형식의 명령어로 변환되어야 하며, CPU는 이를 기반으로 명령어를 해석하고 동작합니다. ISA는 소프트웨어와 하드웨어 사이의 인터페이스 역할을 하며, 어떤 명령어가 있고, 그 명령어가 어떤 방식으로 인코딩되고 실행되는지를 규정합니다.
설계 철학
ISA는 명령어의 종류와 구조를 정의하는데, 이를 설계하는 방식에는 크게 RISC와 CISC라는 두 가지 철학이 있습니다.
RISC (Reduced Instruction Set Computer)
명령어를 단순하고 적게 만들어, 하나의 명령어가 하나의 클럭 사이클 안에 실행되도록 합니다. 특징으로는 명령어 개수가 적어 메모리 접근을 최소화할 수 있고 구조가 단순하며 대부분의 명령어가 고정 길이를 갖기 때문에 명령어 파이프라이닝에 유리합니다. 대표적인 예시로 ARM64(AArch64)이 있습니다.
CISC (Complex Instruction Set Computer)
복잡한 연산을 하나의 명령어로 처리할 수 있도록 명령어를 풍부하게 제공합니다. 특징으로는 명령어 개수가 많고 구조가 복잡하며 명령어마다 길이가 달라 명령어 파이프라이닝에는 불리합니다. 하나의 명령어가 여러 클럭 사이클에 걸쳐 실행됩니다. 대표적인 예시로 x86, x86-64(AMD64)가 있습니다.
* ARM(Advanced RISC Machine)
* AMD(Advanced Micro Devices)
ISA와 CPU
대표적인 CPU 제조 회사로는 Intel, AMD, Apple, Samsung, Qualcomm 등이 있으며, 각 회사에서 어떠한 아키텍처(ISA)를 기반으로 제품을 만드는지 살펴보겠습니다.
- Intel : x86 / x86-64(Intel64)
- AMD : x86 / x86-64(AMD64)
- Apple : ARM64 (Apple Silicon)
- Samsung : ARM
- Qualcomm : ARM
Samsung과 Qualcomm은 모바일용 CPU인 Soc(System on Chip)을 만드며, Intel과 AMD는 데스크탑용 CPU뿐아니라 서버용 CPU도 만듭니다.
AMD가 x86을 64비트로 확장한 AMD64를 먼저 발표하고, Intel이 뒤이어 자체적인 64비트 아키텍처인 Intel64를 발표했으나 실패하여 결국 AMD64를 기반으로 호환되는 64비트 아키텍처를 채택했습니다. 이 때문에 일반적으로 x86-64와 AMD64는 동일한 의미로 사용됩니다.
Amazon Graviton과 같은 ARM64 기반의 서버도 있지만, 현재 대부분의 서버는 x86-64 아키텍처 기반입니다.
ISA와 OS
OS(Operating System)은 특정 ISA를 기반으로 하드웨어 자원을 효율적으로 관리하며 소프트웨어를 실행할 수 있는 환경을 제공합니다. 그렇기 때문에 OS는 ISA에 종속된다고 볼 수 있습니다.
- Window : 기본적으로 x86(32-bit), x86-64(64bit)를 기반으로 동작하며, 일부 버전은 ARM 기반으로도 동작합니다.
- macOS : M1 부터는 ARM(Apple Silicon)을 기반으로 동작하며, 그 이전 버전들은 x86-64(64bit) 기반으로 동작합니다.
- Linux : x86, x86-64, ARM 등 다양한 ISA를 지원합니다.
- Android & iOS : 기본적으로 ARM 기반으로 동작합니다.
ISA와 Docker
Docker 이미지
Docker 이미지는 실행할 애플리케이션, 라이브러리, 파일 시스템, 실행 환경을 포함한 읽기 전용 템플릿입니다. 즉, 이미지는 컨테니어의 청사진으로 특정 환경에서 애플리케이션을 실행할 수 있도록 필요한 모든 종속성을 포함하고 있습니다. 그렇기 때문에 Docker 이미지는 특정 ISA에 맞춰 빌드됩니다. 예를 들어, x86 아키텍처 기반의 시스템에서 빌드된 이미지는 x86 명령어 세트를 따르며, ARM 아키텍처 기반의 시스템에서 빌드된 이미지는 ARM 명령어 세트를 따릅니다.
Docker 컨테이너
Docker 컨테이너는 실행 중인 인스턴스로, Docker 이미지에서 만들어집니다. 이미지를 기반으로 실행되며, 애플리케이션과 그에 필요한 모든 환경을 포함하는 격리된 실행 환경을 제공합니다. 컨테이너는 쓰기 가능한 파일 시스템을 가지며, 필요한 실행이 이루어집니다. 컨테이너는 실행 중인 환경이므로, 해당 컨테이너가 실행될 때, 사용하는 호스트 시스템의 ISA에 맞게 실행됩니다. 즉, 호스트 시스템의 ISA에 맞는 이미지를 실행해야 합니다.
그러나 Docker는 멀티 아키텍처를 지원하여 다른 아키텍처의 이미지를 실행할 수 있도록 --platform 옵션을 제공합니다. 이 옵션을 통해 ARM 시스템에서 x86 이미지를 실행하거나, x86 시스템에서 ARM 이미지를 실행할 수 있습니다.
macOS와 x86-64
앞에서 살펴보았듯이 Mac(Apple Silicon)은 ARM64 기반의 아키텍처입니다. 그럼에도 불구하고 x86-64(또는 AMD64) 아키텍처용 소프트웨어가 동작하는 이유는, Apple이 제공하는 Rosetta 2라는 이진 번역기 덕분입니다. 과거 Mac은 Intel 기반의 x86-64 아키텍처를 사용해왔기 때문에, 여전히 많은 macOS용 소프트웨어가 x86-64용으로 배포되고 있습니다. 이를 위해 Apple은 Rosetta 2라는 호환 계층을 제공하여 x86-64 명령어를 ARM64에서 실행 가능하게 해주었습니다.
이와 유사하게, Docker에서는 QEMU 기반의 에뮬레이터를 제공하여 linux/amd64 플랫폼으로 빌드된 이미지를 Mac(Apple Silicon)에서 실행할 수 있도록 해줍니다. 컨테이너를 띄울 때, --platform linux/amd64 옵션을 사용하면, Docker는 QEMU를 이용하여 x86-64 아키텍처 이미지를 ARM64 아키텍처에서 실행할 수 있도록 해줍니다.