마이크로프로세서: 저장 프로그램 컴퓨팅의 진화
개요
컴퓨팅 초기, 앨런 튜링과 존 폰 노이만 같은 선구자들은 진정한 유용한 기계가 단순히 명령 목록을 실행하는 것 이상을 해야 함을 인식했습니다. 그것은 동일한 메모리 풀 내에서 데이터를 저장, 검색, 수정할 수 있어야 했습니다. 이 통찰은 저장 프로그램 컴퓨터 개념으로 이어졌습니다.
튜링의 이론적 기계는 프로그램 명령과 데이터를 모두 보유하기 위해 순차 접근 테이프에 의존했습니다. 제어 회로가 테이프를 읽고, 연산을 수행하고, 결과를 테이프에 다시 쓰거나 새 데이터를 읽기 위해 테이프를 이동시켰습니다. 현대 시스템은 그 테이프를 랜덤 액세스 메모리(RAM)로 대체하여 동일한 목적을 훨씬 더 큰 속도와 유연성으로 달성합니다.
유용한 비유는 초기 자동 공작 기계 제어에서 나옵니다. 개방 루프 또는 수치 제어(NC) 시스템은 선반이나 밀링 머신을 종이 테이프에 구멍으로 인코딩된 지시를 따라 안내했습니다. 기계는 공작물의 상태를 인식하지 못한 채 테이프를 맹목적으로 따랐습니다.
장치가 환경에 '눈먼' 상태였기 때문에, 금속 팽창이나 공구 마모 같은 변화를 보상할 수 없었습니다. 프로그래머는 테이프가 읽기 전용이고 기계가 상태를 추적할 내부 메모리가 없었기 때문에 가능한 모든 명령 시퀀스를 예상해야 했습니다.
유한 상태 머신(FSM)으로 업그레이드하면 도구에 기초적 메모리가 생겼습니다: 일부 데이터 비트를 어드레스 로직으로 다시 피드백함으로써, 시스템은 '냉각수 켜짐' 또는 '공구 위치' 같은 단순 상태를 기억할 수 있었습니다. 그러나 이는 여전히 진정한 유연성에 미치지 못했습니다.
돌파구는 폐루프 수치 제어(CNC)와 함께 왔습니다. 프로그램이 쓰기 가능 메모리(RAM)에 새 데이터를 쓸 수 있게 되었습니다. 제어 시스템은 자신이 수행한 것을 기록하고 센서가 감지한 변화에 적응할 수 있었습니다. 마치 기계공이 나중에 참조할 스크래치 패드에 메모를 적는 것과 같습니다.
컴퓨터 과학자들은 경험을 통해 인간의 뇌가 시냅스를 강화하는 것처럼 스스로 코드를 수정할 수 있는 기계를 오랫동안 꿈꿔왔습니다. 그런 자기 수정 프로그램이 가능하려면 실행 코드가 데이터를 저장하는 동일한 쓰기 가능 메모리에 상주해야 합니다. 이 개념은 오늘날에도 연구의 최전선에 있습니다.
대부분 소프트웨어는 여전히 고정된 명령 시퀀스를 따르며 별도 데이터 필드만 변경합니다. 저장 프로그램 모델을 진정으로 지원하려면 FSM 이상이 필요합니다. 읽기/쓰기 메모리, 데이터 처리 장치, 정교한 컨트롤러가 필요합니다.
읽기/쓰기 메모리는 정적 또는 동적 RAM 칩으로 쉽게 제공됩니다. 저렴하고 빠릅니다. 논리 연산은 산술과 불리언 기능을 수행할 수 있는 산술 논리 장치(ALU)가 처리합니다.
제어 장치는 메모리, ALU, 외부 장치 간 데이터 이동을 조정합니다. 트라이스테이트 버퍼를 사용하여 버스에서 데이터를 라우팅하고, 디코딩 로직을 사용하여 이진 명령 코드를 동작으로 변환합니다.
예시 명령: '주소 0010의 값을 주소 1101의 값에 더하라', '주소 0111의 바이트 패리티를 계산하라'. 이진 코드에서 연산으로의 매핑은 초기 ASCII 표준처럼 임의적이지만, 명령어 세트는 일반적으로 제조사별입니다.
읽기/쓰기 메모리, ALU, 제어 장치가 통합될 때(종종 단일 칩), 프로세서를 형성합니다. 최소 외부 메모리를 가진 프로세서는 마이크로프로세서이며, 버스 제어 회로와 결합되면 중앙 처리 장치(CPU)가 됩니다.
CPU의 동작은 페치/실행 사이클로 캡슐화됩니다. 프로그램 카운터가 다음 명령의 주소를 보유합니다. 제어 장치가 그 주소를 메모리 어드레스 버스로 읽어, RAM에서 명령을 가져와 임시 레지스터에 저장합니다.
명령이 피연산자를 필요로 하면, 제어 장치가 추가 메모리 접근을 발행하여 가져온 데이터를 ALU 레지스터로 라우팅합니다. ALU가 요청된 연산을 수행하여 결과를 어큐뮬레이터에 배치합니다. 마지막으로 프로그램 카운터가 증가하고 사이클이 반복됩니다.
마이크로프로세서 (CPU)
--------------------------------------
| ** 프로그램 카운터 ** |
| (외부 메모리 칩으로 전송될 |
| 주소 값 증가하여 다음 |
| 명령어 페치) | ==========> 어드레스 버스
| | (RAM 메모리로)
--------------------------------------
| ** 제어 장치 ** | <=========> 컨트롤 버스
| (메모리의 프로그램에서 읽은 |
| 명령어 디코딩, 데이터 흐름 |
| ALU, 내부 레지스터, 외부 |
| 장치로 인에이블, 모든 버스 |
| 통신 중재) |
--------------------------------------
| ** 산술 논리 장치 (ALU) ** |
| (모든 수학적 계산과 |
| 불리언 기능 수행) |
--------------------------------------
| ** 레지스터 ** |
| (명령어 코드, 에러 코드, |
| ALU 데이터 등을 보관하는 |
| 작은 읽기/쓰기 메모리; |
| '어큐뮬레이터' 포함) | <=========> 데이터 버스
| | (RAM 메모리 및 기타
| | 외부 장치로부터)
--------------------------------------
가장 단순한 연산조차 많은 마이크로 단계가 필요합니다. 거듭제곱 같은 복잡한 산술은 기본 기능의 반복된 반복을 포함합니다. 비행 시뮬레이터의 그래픽 엔진이 매 프레임 디스플레이를 새로 고치기 위해 수행해야 하는 수천 사이클을 고려해 보세요.
페치/실행 사이클의 엄청난 속도가 이를 가능하게 합니다. 일부 설계는 내부 ROM에 마이크로코드라고 하는 작은 프로그램을 내장합니다. 마이크로코드는 복잡한 연산의 하위 단계를 처리하여, 프로그래머가 모든 세부 사항을 작성하는 대신 단일 고수준 명령을 발행할 수 있게 합니다.
이렇게 프로세서는 프로세서를 포함합니다: 개발을 단순화하면서 성능을 보존하는, 프로그램 안에서 실행되는 프로그램입니다.