This post is not yet available in English and is shown in Korean.
지난 글에서는 컴퓨터를 프로그래밍 가능한 기계로 정의하고, 하드웨어와 소프트웨어를 분리한다는 아이디어를 튜링 머신을 통해 살펴보았다. 튜링이 계산하는 기계에 대한 이론적 토대를 마련했지만 여전히 중요한 질문이 남아있었다. 어떻게 그 기계를 현실 세계에 구현할 수 있을까?
이때 등장한 인물이 바로 수학자이자 물리학자이자 컴퓨터 과학자이자 경제학자였던 존 폰 노이만이다. 그가 1945년에 제시한 폰 노이만 구조는 오늘날 우리의 스마트폰부터 슈퍼컴퓨터까지 거의 모든 컴퓨터가 따르고 있는 기본 설계 원리다.
폰 노이만 구조 이전의 초기 컴퓨터들은 비효율적이었다:
ENIAC을 이후의 모든 컴퓨터들과 구분짓는 특이한 점 중 하나는, 명령어를 기계에 설정하는 방식이었다. 그것은 소형 천공 카드 기계의 플러그보드와 유사했지만, ENIAC에서는 수 피트 크기의 플러그보드가 약 40개나 있었고, 문제 하나의 명령어마다 다수의 와이어를 꽂아야 했다. 문제 하나를 실행 준비하기 위해서는 수천 개의 와이어를 연결해야 했으며, 이 작업에는 수일이 걸렸고, 그 설정을 검증하는 데에는 더 많은 날들이 필요했다.
Franz L. Alt, “Archaeology of Computers—Reminiscences, 1945–1947,” Communications of the ACM, Vol. 15, No. 7, July 1972, p. 694.
결국 ENIAC에게 프로그램이란 기계의 물리적인 구조 그 자체였다. 새로운 요리를 할 때마다 부엌 구조를 통째로 바꾸는 셈이다.
폰 노이만은 프로그램을 하드웨어의 배선이 아닌 데이터로 취급함으로써 이 문제를 해결했다. 부엌은 그대로 두고 요리법만 바꾸는 것이다. 이것이 내장형 프로그램 방식(Stored-Program Computer) 이다. 메모리에 저장된 프로그램만 새로 불러오면 컴퓨터가 완전히 다른 작업을 수행한다.
그런데 “프로그램이 데이터”라는 게 구체적으로 무슨 뜻일까? 이를 이해하기 위해서는 컴퓨터가 이해할 수 있는 언어인 기계어가 어떻게 생겼는지 살펴봐야 한다
첫 글에서 살펴봤듯이 컴퓨터는 정보를 0과 1로만 표현하며,
프로그램도 예외는 아니다. 컴퓨터가 이해할 수 있는 언어, 즉 기계어는 모두 0과
1의 조합으로 이루어져 있다. 예를 들어 “두 숫자를 더해라”라는 명령을 컴퓨터에게
내리고 싶다면, 우리는 00110000과 같은 이진 숫자로 번역해서 전달해야 한다.
하지만 여기서 중요한 것은 00110000이 덧셈을 의미한다는 것 자체에는 어떤
마법도 없다는 점이다. 이는 단순히 CPU를 설계하는 사람과 프로그램을 짜는 사람
사이의 약속일 뿐이다. “0011으로 시작하는 명령어를 보면 덧셈 회로를
작동시키자”고 미리 정해둔 규칙인 것이다.
예를 들어 01100011이라는 8비트 숫자는 이렇게 해석될 수 있다:
0110 → “값을 넣어라” (LDI 명령)00 → “R0에” (대상 지정)11 → “숫자 3을” (값 지정)즉 “R0에 3을 저장해라” 라는 뜻이다. 0110이 “값을 넣어라”를 의미한다는 것에
어떤 마법도 없다. CPU 설계자와 프로그래머 사이의 약속일 뿐이다. 이런 약속들을
모아놓은 것을 명령어 집합 구조(Instruction Set Architecture, ISA) 라고
부른다. 이 시리즈에서는 핵심 원리를 이해하기 위해 간단한 8비트 ISA를 직접
설계했다. 다음 글에서 전체 명령어를 살펴본다.
이 기계어를 실행시키는 폰 노이만 구조 컴퓨터는 크게 메모리, CPU, 입출력 장치로 구성된다. 비교적 직관적인 메모리와 입출력 장치부터 살펴보자.
메모리는 프로그램과 데이터를 저장하는 장치다. 이 메모리를 RAM(Random Access Memory) 이라 부르는데, 어떤 주소든 동일한 시간에 접근할 수 있기 때문이다.
| 주소 | 데이터 |
|---|---|
| 0 | 01100011 |
| 1 | 00010001 |
| 2 | 10010101 |
| 3 | 00000000 |
예를 들어 ‘0번 주소에서 데이터를 가져와라’라고 하면 01100011이 나온다. ‘3번
주소에 50을 저장해라’라고 하면 해당 위치의 값이 바뀐다.
여기서 핵심은 프로그램과 데이터가 같은 메모리에 저장된다는 점이다. ENIAC은
프로그램이 물리적인 배선이었기 때문에 데이터와 완전히 별개였다. 폰 노이만 구조
에서는 기계어 명령어도 00110000 같은 숫자일 뿐이므로 데이터와 동일한 방식으로
메모리에 저장된다. 덕분에 프로그램을 바꾸고 싶으면 전선을 만질 필요 없이 메모리
내용만 바꾸면 된다.
CPU가 외부 세계와 소통하는 창구다. 키보드, 마우스, 모니터 등이 여기에 해당한다.
입출력 장치를 구현하는 한 가지 방법은 메모리를 활용하는 것이다. 특정 메모리 주소 영역을 입출력 장치 전용으로 지정해두고, CPU는 해당 주소에 값을 읽거나 쓰는 방식으로 장치를 제어한다.
예를 들어 모니터 화면의 각 픽셀을 메모리 주소에 일대일로 매칭해둘 수 있다. 이 메모리 영역을 비디오 메모리(VRAM)라고 한다.
0: 흰색, 1: 검은색
VRAM 값 1은 검은색, 0은 흰색 픽셀에 대응한다. 값을 바꿔 화면 변화를 확인해보자. 키보드도 비슷하게, 특정 주소에 마지막으로 눌린 키 코드가 기록되면 CPU는 해당 주소를 읽어 입력을 받아올 수 있다.
프로그램을 데이터로 메모리에 저장하는 내장형 프로그램 방식, 그리고 메모리와 입출력 장치의 역할을 살펴보았다. 이 구조 덕분에 전선을 갈아끼울 필요 없이 메모리 내용만 바꾸면 컴퓨터가 전혀 다른 작업을 수행한다.
그러면 명령어를 실행하는 건 누구일까? 다음 글에서 CPU가 명령어를 어떻게 실행하는지 알아보고, 세 부품을 하나로 조립해보자.