1945년 폰 노이만이 작성한 EDVAC에 대한 보고서에 영감을 받아 stored-program 구조(프로그램을 데이터와 같은 메모리에 저장하는 구조)를 채택한 여러 컴퓨터가 등장하게 됩니다.
EDSAC (1949)
폰 노이만의 보고서에 영감을 받은 모리스 윌크스는 1946년 영국으로 돌아와 그 해 말 EDSAC 컴퓨터의 개발을 시작해 1949년 EDSAC을 완성하게 됩니다. EDSAC 컴퓨터는 진공관과 수은 지연선(delay line) 메모리를 사용하였으며 11kW의 전력을 소모하였습니다. 17-bit 또는 35-bit* (2's complement) 데이터를 처리할 수 있었으며 18-bit 데이터 512개를 저장할 수 있는 메모리가 장착되었고 (이후 1024개 크기로 확장되었습니다.) 입력으로 5줄짜리 천공 테이프를 사용하였으며 출력으로는 전기식 타자기(TTY)를 사용하였습니다. 일반적인 명령을 처리하는 데 1.5 ms, 곱셈에는 6 ms가 소요되었다고 합니다. EDSAC은 여러 수학/과학적 계산에 활용되었습니다.
*TMI: 10자리를 표현하기 위해 35-bit를 선택하였다고 한다. $35 = \left \lceil { 1 + 10 \times \log_2 10 } \right \rceil $
EDSAC의 명령어는 17-bit 인코딩을 사용하며, 데이터로 17-bit (short) 또는 35-bit (long) 정수(integer) 또는 고정소수점(fixed point) 숫자를 사용합니다. 입력은 지정된 메모리 주소의 하위(least significant) 5-bit에 저장되며, 출력은 지정된 주소의 데이터 중 상위(most significant) 5-bit를 내보냅니다. 5-bit는 하나의 문자에 대응됩니다. 17-bit 명령어는 명령어의 종류를 나타내는 5-bit, 예비 비트 1-bit, 피연산자를 가리키는 메모리 주소 10-bit, 피연산자의 크기(17-bit 또는 35-bit)를 나타내는 1-bit로 구성되어 있으며, 10-bit 길이의 Sequential Control Tank를 통해 실행할 명령어의 주소를 지정해 메모리에서 명령어를 가져옵니다. (이 명령어는 17-bit = short 길이의 Order Tank에 저장됩니다.)
*Sequential Control Tank는 이후 컴퓨터의 Program Counter, PC (또는 Instruction Pointer, IP)에 대응되고, Order Tank는 Instruction Register에 대응됩니다.
또 EDSAC에는 덧셈/뺄셈의 결과를 저장하는 누산기(accumulator)와 곱셈의 승수(곱할 수, multiplier)를 저장하는 multiplier tank, 2개의 레지스터*가 있었는데, 이 두 레지스터는 연산 명령어의 암시적인 피연산자로 사용됩니다.
*레지스터: 프로세서 내부에 있는 주 메모리와 별개의 특수한 빠른 메모리로서 각 연산의 결과 또는 데이터의 일부를 잠깐 저장하는 역할을 담당합니다.
여기서 각 명령어가 접근하는 메모리 주소는 명령어 자체에 담겨있는 고정된 값이어서 만약 그 주소를 바꾸고 싶다면 다른 명령어를 통해 그 명령어 자체를 수정하는 기법(self-modifying code)을 사용해야 했습니다.
참고: https://people.computing.clemson.edu/~mark/edsac.html
Manchester Mark I (1949)
1949년 'B-line'이라는 인덱스(index) 레지스터를 사용하는 혁신적인 구조를 도입해 배열에 대한 접근을 쉽게 만든 Manchester Mark 1 컴퓨터가 등장합니다. Mark 1 컴퓨터는 40-bit 데이터 및 20-bit 명령어를 사용하였고, 25 kW의 전력을 소모하였습니다. Mark 1 컴퓨터는 메르센 소수 등의 계산에 활용되었습니다. Manchester Mark 1의 설계는 이후 등장하는 Ferranti Mark 1 등 여러 상용 컴퓨터에 큰 영향을 주게 됩니다.
이후 트랜지스터 및 집적회로의 등장으로 컴퓨터의 크기는 더 작아지고 더 적은 전력을 소모하며, 더 빠르고 더 저렴해졌습니다. 또 컴퓨터에 다양한 기능을 구현할 수 있는 여유가 생겼고, 컴퓨터는 점점 복잡해지기 시작합니다. 또 FORTRAN, COBOL, ALGOL 등의 프로그래밍 언어가 등장해 프로그래머들의 수고가 줄어들었으며, 한 번에 하나의 프로그램을 수동으로 실행해야 했던 이전과 달리 초창기 운영체제가 등장해 하드웨어 자원 관리에 들이는 수고가 줄어들었습니다.
범용 레지스터(General Purpose Register)의 등장
앞서 살펴본 EDSAC, Manchester Mark 1과 같은 초창기 컴퓨터들은 결과를 저장하는 데 쓰는 레지스터(accumulator), 메모리 접근에 사용하는 레지스터 (address, index) 등 각 용도에 따라 한 두개의 특수한 레지스터를 사용하였으나, 이후 컴퓨터에서는 하나의 레지스터를 연산에도 사용하고 메모리 접근에도 사용하는 등 여러 목적으로 사용되는 범용 레지스터(General Purpose Register) 여러 개가 있는 구조가 대세가 됩니다. (8개, 16개, 32개, ...) 결과적으로, 아래 그림과 비슷해졌습니다:
IBM System/360 (1964)
1964년 발표된 System/360은 '마이크로코드'(microcode)라고 하는 CPU 내의 프로그램을 통해 명령어의 형식과 동작 등을 규정하는 아키텍처(architecture)와 실제 머신의 구현을 분리하였고, 표준 인터페이스를 도입해 다양한 가격대의 프로세서와 주변 장치들을 유연하게 구성할 수 있었습니다. System/360은 32-bit 워드(word, 데이터 처리의 단위) 및 8-bit 바이트(byte)를 특징으로 하며 메모리의 주소는 바이트 단위로 부여되었습니다. System/360에는 16개의 32-bit 정수 레지스터와 4개의 64-bit 부동소수점 레지스터가 있었습니다. System/360은 큰 성공을 거두었고 이후 컴퓨터의 구조에 상당한 영향을 주었습니다.
System/360의 명령어는 레지스터끼리 연산하는 RR 형식, 레지스터와 메모리를 모두 사용하는 RX/RS 형식, 어떤 상수를 메모리에 저장하는 SI 형식, 메모리 값끼리 연산해 메모리에 결과를 저장하는 SS 형식 등으로 나뉘었습니다.
DEC PDP-11 (1970)
DEC PDP 시리즈는 '미니컴퓨터'로서 과거 대형 기관의 전유물이었던 메인프레임 컴퓨터와 달리 1960년대 여러 대학이나 민간 연구기관에서 쓰였습니다. 1970년 출시된 PDP-11 컴퓨터는 C언어에 많은 영향을 주었습니다. PDP-11에는 8개의 16-bit 범용 레지스터 및 상태 레지스터가 있었고, 피연산자 레지스터를 8가지 모드로 사용할 수 있었습니다. (레지스터에 들어있는 값을 직접 사용하는 register, 레지스터의 값을 메모리 주소로 쓰는 register deferred, 레지스터의 값을 주소로 써서 메모리에 접근한 다음 레지스터 값을 증가시키거나 감소시키는 autoincrement/autodecrement, 레지스터의 값을 배열의 시작 주소로 두고 인덱스를 더하는 index 등등)
Intel 8086/8088 (1978)
1978년 인텔은 16-bit CPU인 8086 및 8088을 출시하였습니다. 1980년대 초 IBM PC에서 8088을 채택하면서 이후 PC 생태계가 8086의 명령어 집합에 기반을 둔 x86 아키텍처 위주로 형성되었고, 대부분의 데스크탑 및 노트북 PC, 서버에 x86 호환 CPU가 쓰이고 있습니다. 이에 따라 많은 대학의 시스템프로그래밍 강좌에서 x86(및 64-bit 버전인 x86-64)을 사용합니다.
RISC
1980년대 명령어의 수를 줄이고, 연산 명령어는 레지스터만을 사용하며 메모리 접근은 load/store 명령어들로만 제한한 'RISC'라는 개념이 유행하게 됩니다. 'RISC' CPU는 기존의 'CISC' CPU에 비해 더 적은 복잡도로 더 빠르게 동작할 수 있었고, 기존 'CISC' CPU 또한 1990년대 중반 들어 내부적으로 RISC 설계를 채택하게 됩니다. 그러나 기존 프로그램과의 호환성 문제 등으로 기존의 CISC(x86, ...) 생태계를 완전히 대체하지는 못하였습니다. RISC 명령 집합에는 MIPS, ARM, RISC-V, POWER 등이 있습니다. 구조가 간단하기 때문에 많은 컴퓨터구조 강의에서는 RISC 명령 집합을 사용합니다. (과거에는 MIPS, 최근에는 RISC-V를 주로 사용하는 것 같습니다.)
다음 글(1.05)에서는 2.00부터 다룰 내용들에 대한 좀 더 자세히 소개하고, 이후 몇 개 글에서는 관련 배경지식이 없는 독자분들을 위해 컴퓨터의 숫자 표현 방식 및 논리설계 관련 일부 내용을 다루고, 그 다음 본격적으로 컴퓨터구조 관련 내용에 대해 다루겠습니다. 감사합니다.
참고자료
(정리중)
'컴퓨터공학 > 컴퓨터구조' 카테고리의 다른 글
A 1.05: 둘러보기 & 위대한 발상들 (0) | 2023.07.20 |
---|---|
A 1.01: 컴퓨터의 역사 [1] (0) | 2023.07.03 |
A 1.00: 컴퓨터 시스템의 추상화 (0) | 2023.06.07 |
A 0.00: 들어가며 (0) | 2023.06.04 |