1.4 Processors Read and Interpret Instructions Stored in Memory
1.4 프로세서가 메모리에 저장된 명령어를 읽고 해석한다
이 시점에서, 우리의 hello.c 소스 프로그램은 컴파일 시스템에 의해 실행 가능한 객체 파일인 hello로 변환되어 디스크에 저장됩니다. 이 실행 파일을 유닉스 시스템에서 실행하려면, 쉘(shell)이라는 애플리케이션 프로그램에 파일 이름을 입력합니다.
linux> ./hello
hello, world
linux>
쉘(shell)은 명령어를 해석하는 프로그램으로, 프롬프트를 출력하고, 사용자가 명령어를 입력할 때까지 기다린 후, 해당 명령어를 실행합니다.
만약 명령어의 첫 번째 단어가 쉘의 내장 명령어에 해당하지 않는다면, 쉘은 그것이 실행 파일의 이름이라고 가정하고, 해당 파일을 로드하여 실행합니다.
이 경우, 쉘은 hello 프로그램을 경로상에서 로드하고 실행한 뒤, 프로그램이 종료될 때까지 기다립니다.
이후, hello 프로그램은 메시지를 화면에 출력한 후 종료됩니다. 그 후 쉘은 프롬프트를 다시 출력하고, 사용자가 다음 명령어를 입력할 때까지 기다립니다.

CPU (Central Processing Unit)
Register file
- CPU 내부에서 데이터를 저장하고 처리하는 레지스터들입니다.
Program Counter (PC)
- 실행할 명령어의 주소를 저장하는 레지스터로, 명령어를 순차적으로 실행할 때 사용됩니다.
ALU (Arithmetic/Logic Unit)
- 산술 연산 및 논리 연산을 수행하는 장치입니다.
Bus interface
- CPU가 다른 시스템 구성 요소와 데이터를 주고받을 수 있게 해주는 인터페이스입니다.
시스템 버스 (System Bus)
- CPU와 메모리, 그리고 다른 장치들이 데이터를 주고받을 수 있게 해주는 데이터 전송 경로입니다.
메모리 버스 (Memory Bus)
- Main memory (주기억장치)와 연결되어, 데이터를 빠르게 읽고 쓸 수 있게 해줍니다. 실행 중인 프로그램과 데이터를 저장하는 곳입니다.
입출력 브리지 (I/O bridge)
- I/O 장치와 시스템 버스 간의 연결을 관리하는 브리지입니다. CPU와 다른 장치들 간의 데이터 전송을 관리합니다.
I/O 버스 (I/O Bus)
- 다양한 입출력 장치들이 연결된 경로로, USB 컨트롤러, 그래픽 어댑터, 디스크 컨트롤러 등 다양한 하드웨어 장치들이 포함됩니다.
입출력 장치 (I/O devices)
- USB 컨트롤러: 마우스, 키보드 등의 USB 장치를 제어합니다.
- Graphics adapter: 화면에 이미지를 출력하는 그래픽 카드입니다.
- Disk controller: 디스크 장치에서 데이터를 읽고 쓰는 역할을 합니다.
디스크 (Disk)
- hello 실행 파일이 저장된 디스크를 나타냅니다. 디스크는 프로그램과 데이터를 영구적으로 저장하는 장치입니다.
확장 슬롯 (Expansion slots)
- 네트워크 어댑터와 같은 추가 장치를 연결할 수 있는 슬롯입니다.
1.4.1 Hardware Organization of a System
1.4.1 시스템의 하드웨어 구성
hello 프로그램을 실행할 때 무엇이 일어나는지 이해하려면, 전형적인 시스템의 하드웨어 구성을 이해해야 합니다. 이 그림(Figure 1.4)은 최근 Intel 시스템을 모델로 하지만, 대부분의 시스템이 이와 같은 유사한 구조를 갖고 있다는 점을 보여줍니다.
이 그림의 복잡성에 대해서는 지금 당장 걱정하지 마세요. 책을 진행하면서 점차적으로 이 그림의 세부 사항들을 다룰 예정입니다.
1. 버스(Buses)
버스는 시스템 내에서 데이터 전송을 위한 전기적 도관입니다. 컴퓨터 시스템의 각 구성 요소는 데이터를 주고받기 위해 버스를 사용합니다. 버스는 일반적으로 워드(word) 단위로 데이터를 전송하며, 워드 크기는 시스템마다 다를 수 있습니다. 대부분의 컴퓨터 시스템에서 워드 크기는 4바이트(32비트) 또는 8바이트(64비트)입니다.
- 워드 크기: 시스템마다 다를 수 있으며, 이는 시스템 성능에 중요한 영향을 미칩니다.
- 책에서는 워드 크기에 대한 고정된 정의를 사용하지 않고, 문맥에 맞게 정의하려 합니다.
2. 입출력(I/O) 장치
입출력 장치는 컴퓨터 시스템과 외부 세계를 연결하는 역할을 합니다. 여기에는 사용자 입력을 위한 키보드와 마우스, 출력 장치인 디스플레이, 그리고 데이터를 저장하는 디스크 드라이브가 포함됩니다.
- I/O 장치의 연결: 각 I/O 장치는 컨트롤러 또는 어댑터를 통해 I/O 버스에 연결됩니다.
- 컨트롤러는 장치에 내장된 칩 또는 시스템의 메인 인쇄 회로 기판에 위치한 칩 세트입니다.
- 어댑터는 마더보드의 슬롯에 장착되는 카드입니다.
- I/O 장치는 시스템과 외부 장치 간에 정보를 주고받는 역할을 합니다.
관련 장에서 다룰 내용
- 6장: I/O 장치가 어떻게 작동하는지에 대해 다룰 것입니다.
- 10장: 애플리케이션 프로그램에서 장치에 접근하는 방법을 다룰 것입니다.
3. 주기억장치(Main Memory)
주기억장치는 프로그램과 그 프로그램이 처리하는 데이터를 임시 저장하는 공간입니다. 이는 동적 랜덤 접근 메모리(DRAM) 칩으로 구성되어 있으며, 메모리는 고유한 주소를 가진 바이트들의 배열로 조직됩니다.
- 자료형에 따른 데이터 크기: 예를 들어, x86-64 시스템에서:
- short는 2바이트
- int와 float는 4바이트
- long과 double은 8바이트
- 주기억장치는 프로세서가 프로그램을 실행하는 동안 필요한 데이터를 빠르게 접근할 수 있도록 제공합니다.
관련 장에서 다룰 내용:
- 6장: DRAM 칩과 메모리 기술이 어떻게 작동하는지 다룰 것입니다.
4. 프로세서(Processor)
프로세서(CPU, 중앙 처리 장치)는 메모리에 저장된 명령어를 읽고 해석하여 실행하는 컴퓨터 시스템의 핵심 구성 요소입니다.
이때 프로세서의 핵심은 프로그램 카운터(PC)라는 레지스터로, 실행 중인 명령어의 주소를 메모리에서 가리킵니다.
명령어 실행 모델
프로세서는 명령어 집합 아키텍처(ISA: Instruction Set Architecture)에 정의된 간단한 명령어 실행 모델에 따라 동작합니다.
명령어 집합 아키텍처(ISA)는 컴퓨터 프로세서가 이해하고 실행할 수 있는 명령어들의 형식과 동작을 정의하는 규약이며, 이러한 명령어들이 어떻게 실행되는지를 설명하는 실행 모델을 포함하는 구조입니다.
이 모델은 명령어를 엄격한 순서로 하나씩 실행하는 방식이며, 단일 명령어의 실행은 다음과 같은 단계로 구성됩니다:
- PC가 가리키는 메모리 주소에서 명령어를 읽는다.
- 읽어온 명령어의 비트를 해석하여 어떤 동작을 할지 결정한다.
- 해당 명령어가 지시하는 작업을 수행한다.
- PC를 업데이트하여 다음 명령어로 이동한다.
이 명령어들은 메모리 내에서 반드시 연속적인 주소에 있을 필요는 없으며, 점프 명령 등을 통해 비연속적인 흐름도 가능합니다.
프로세서 동작
- 프로세서는 프로그램 카운터(PC)가 가리키는 메모리에서 명령어를 읽고, 그 명령어를 실행합니다.
- 명령어를 실행한 후, 프로그램 카운터를 업데이트하여 다음 명령어를 가리킵니다.
프로세서 구성 요소 및 연산 유형
프로세서가 명령어를 실행하는 과정에서 수행하는 기본적인 작업들은 다음과 같은 핵심 하드웨어 구성 요소들을 통해 이루어집니다
- 주기억장치(Main Memory): 실행할 명령어와 프로그램 데이터가 저장되는 공간입니다.
- 레지스터 파일(Register File): 여러 개의 고속 워드 크기 레지스터로 이루어진 저장소로, 연산 중간 결과나 주소 등을 임시로 저장합니다.
- 산술 논리 장치(ALU, Arithmetic Logic Unit): 덧셈, 뺄셈, 논리 연산(AND, OR, 비교 등)과 같은 산술 및 논리 연산을 수행합니다.
ISA는 프로세서가 수행할 수 있는 기본 연산의 종류를 정의하며, 일반적으로 다음과 같은 범주로 분류됩니다:
기본적인 연산 작업 예시
- 로드(Load): 메인 메모리에서 데이터를 레지스터로 복사합니다. 기존 레지스터 값은 덮어씌워집니다.
- 스토어(Store): 레지스터에 있는 데이터를 메모리의 특정 위치로 복사합니다. 기존 메모리 값은 덮어씌워집니다.
- 연산(Operate): 두 개의 레지스터 값을 ALU(산술/논리 유닛)로 보내 연산한 후, 결과를 레지스터에 저장합니다.
- 점프(Jump): 명령어 내의 주소(워드)를 프로그램 카운터(PC)에 복사하여 다음 실행 위치를 변경합니다.
프로세서의 명령어 집합 아키텍처(ISA)와 마이크로아키텍처
우리는 프로세서가 자신의 명령어 집합 아키텍처(ISA, Instruction Set Architecture)의 간단한 구현처럼 보인다고 말할 수 있습니다. 그러나 사실, 현대의 프로세서들은 프로그램 실행 속도를 높이기 위해 훨씬 더 복잡한 메커니즘을 사용합니다.
따라서 우리는 명령어 집합 아키텍처(ISA)와 마이크로아키텍처를 구분할 수 있습니다.
1. 명령어 집합 아키텍처 (ISA)
ISA는 프로세서가 이해하고 실행할 수 있는 명령어의 집합을 정의합니다. 각 기계어 명령어(machine code instruction)가 어떤 작업을 수행하는지를 설명합니다.
예를 들어, MOV, ADD, JMP와 같은 명령어들이 ISA에 정의됩니다.
ISA는 추상적인 개념으로, 프로세서가 지원하는 명령어들을 나열하는 것으로, 프로그래머가 소스 코드를 작성할 때 사용하는 명령어 규격입니다.
2. 마이크로아키텍처
마이크로아키텍처는 ISA가 어떻게 구현되는지에 대한 설명입니다. 마이크로아키텍처는 프로세서의 실제 내부 구현을 다룹니다. 예를 들어, ALU(산술 논리 장치), 레지스터 파일, 캐시 메모리 등 프로세서의 물리적 구성 요소들이 어떻게 설계되어 ISA의 명령어를 실행하는지 설명합니다.
즉, 마이크로아키텍처는 하드웨어적 구현을 다루며, ISA는 추상적인 명령어 집합을 정의하는 것입니다.
3장과 4장, 5장에서 배우게 될 내용
- 3장에서는 기계어(machine code)를 공부하면서, 명령어 집합 아키텍처(ISA)가 제공하는 추상화(Abstraction)를 다룹니다.이 장에서는 프로세서가 ISA 명령어를 어떻게 실행하는지에 대한 기초적인 이해를 다룹니다.
- 4장에서는 프로세서의 실제 구현 방식, 즉 마이크로아키텍처에 대해 더 깊이 다룹니다. 이 장에서는 프로세서가 어떻게 실제로 명령어를 실행하는지, 하드웨어 설계의 중요성에 대해 배울 것입니다.
- 5장에서는 현대 프로세서가 어떻게 작동하는지에 대한 모델을 다루며, 이를 통해 기계 언어 프로그램의 성능을 예측하고 최적화하는 방법을 배울 수 있습니다.
1.4.2 Running the hello Program
1.4.2 hello 프로그램 실행
hello 프로그램 실행은 시스템의 하드웨어 구성과 동작에 대한 간단한 관점을 바탕으로 이해할 수 있습니다. 많은 세부 사항은 생략되었지만, 전체적인 그림을 간단하게 넘기셔도 됩니다.
처음에, 쉘 프로그램은 명령어를 실행하며 우리가 명령을 입력하기를 기다리고 있습니다. 우리가 키보드에서 ./hello라는 문자를 입력하면, 쉘 프로그램은 각 문자를 레지스터에 읽어 들인 후, 그것을 메모리에 저장합니다.
이때는 그냥 문자 그대로 저장하게 됩니다.
이 과정은 그림 1.5에서 보여지는 방식입니다.

Enter 키를 누르면, 쉘은 우리가 명령어 입력을 끝냈다는 것을 알게 됩니다. ./hello는 실행 파일을 지정하는 경로입니다. 여기서 .은 현재 디렉터리를 의미하고, hello는 실행할 프로그램이라는 의미입니다. 쉘은 실행 파일 hello를 로드하기 위해 일련의 명령어를 실행합니다. 이 명령어들은 디스크에서 메인 메모리로 hello 객체 파일의 코드와 데이터를 복사하는 작업을 합니다.
그 데이터에는 hello, world\n 라는 문자열이 포함되어 있으며, 이 문자열은 나중에 화면에 출력됩니다.
직접 메모리 접근(DMA)라는 기술을 사용하여, 데이터는 디스크에서 메인 메모리로 직접 이동합니다. 이 과정에서는 프로세서를 거치지 않습니다. ( DMA는 프로세서를 거치지 않고 데이터를 빠르고 효율적으로 전송하기 때문에, CPU의 부하를 줄이고 전송 속도를 높이는 데 유리합니다. )
DMA는 디스크에서 메모리로 데이터를 복사하는 실제 데이터 전송 작업을 직접 처리( 디스크에서 읽은 데이터(예: hello 실행 파일의 코드와 데이터, 그리고 hello, world\n 문자열)는 DMA 기술을 통해 메모리로 직접 전송 )합니다. 이때 CPU는 데이터 전송 과정에 관여하지 않습니다.
대신, DMA 컨트롤러가 데이터 전송을 처리하고, 전송 완료 후 인터럽트를 통해 CPU에 알립니다.
이 과정은 그림 1.6에서 보여집니다.

hello 객체 파일의 코드와 데이터가 메모리에 로드되면, 프로세서는 hello 프로그램의 주 루틴(Main 함수)에서 머신 언어 명령어들을 실행하기 시작합니다.
이 명령어들은 메모리에 있는 hello, world\n 문자열의 바이트들을 레지스터 파일로 복사하고, 거기서 디스플레이 장치로 복사하여 화면에 출력합니다.
이 과정은 그림 1.7에서 보여 집니다.
