먼저 Computer라는 것을 설명해보자. Computer라는 것은 말 그대로 Computaion을 하는 것, 즉 계산을 하는 기계를 의미한다. 계산이라는 것은 숫자를 정해진 규칙에 따라 다른 숫자로 만드는 것을 이야기한다. 컴퓨터는 계산 같은 다양한 일들을 프로그램을 통해 할 수 있다.
프로그램이란 컴퓨터가 실행해야 할 명령어의 집합을 의미한다. 컴퓨터에는 실행할 프로그램을 미리 만들어 놓는 능력이 있다. 이것을 Computer Architecture에서는 Stored Program이라고 한다. 가령 계산기는 미리 프로그램을 만들어 놓은 것이 아니라 우리가 숫자를 누를 때 마다 계산을 하게 된다. 컴퓨터와 계산기가 다른 점은 이러하게 실행할 프로그램을 미리 만들어 놓고 그것을 실행할 수 있는 능력이 있다는 점이다.
저장된 프로그램을 실행하려면 컴퓨터는 명령어를 읽고 실행할 수 있는 그 누군가가 있어야 한다. 이 누군가가 executor이다. 그리고 프로그램을 저장할 수 있는 공간도 필요하다. 이게 Von-Neumann 컴퓨터이다. 즉, 컴퓨터에는 프로그램을 읽고 실행할 수 있는 것과 저장된 공간이 필요하다. 저장된 공간에서 하나하나 읽어서 실행하는 것이 컴퓨터이다.
컴퓨터 공학에서 가장 중요한 두 사람이 있는데, 한 사람은 Von-Neumann이고 다른 한명은 Turing이라는 사람이다. Turing은 이론적인 컴퓨터를 처음 만든 사람이고, 실제로 이러한 컴퓨터를 만든 사람은 Von-Neumann이다.
Computer Architecture의 Stored Program에는 executor와 storage가 있다. executor는 저장된 프로그램을 실행할 수 있는 누군가이고, 그 프로그램을 저장하는 공간을 storage라고 한다.
CPU는 컴퓨터 시스템에서 연산(Computation)과 제어흐름(Flow Of Control)을 담당하는 핵심 구성요소이다.
먼저 CPU는 덧셈, 뺄셈, 곱셈, 나눗셈과 같은 산술 연산, AND,OR,NOT과 같은 논리연산이 있다. 크다, 작다, 같다와 같은 관계연산은 없는데, 이러한 이유는 두 개의 차이를 가지고 부호를 따지면 관계연산이 가능하기 때문이다.
이러한 연산들을 하기 위해 CPU는 레지스터와 ALU(Arithmetic-Logic Unit)을 가진다. 쉽게 설명하자면 레지스터는 연산할 때 필요한 정보들을 임시로 저장을 하고, ALU는 실제 연산을 담당하게 된다.
CPU는 위와 같은 연산 뿐 아니라 제어흐름을 할 수 있다. CPU는 프로그램이 실행될 때 실행 흐름을 제어할 수 있는 명령어를 처리한다. CPU는 실행할 명령어를 해당 메모리 주소에서 읽어와 그 의미를 해석하여 실행한다. 프로그램이 실행이 되면 OS가 필요한 정보를 추가해서 메모리 위에 올리게 되고, 그러면 프로세스가 된다. 프로그램을 loader가 메모리 위에 올리면 한줄한줄 읽으면서 프로그램을 실행시킨다. 이때 어떤 주소의 메모리를 읽어야 하는지에 대한 정보를 알아야하는데 이를 OS가 알려준다. OS가 Register의 PC(Program Count)에서 어떤 주소의 메모리인지 정보를 가져와 알려준다.
가령 loader가 메모리 100번지에 프로그램을 올려놓으면 PC에 100이 저장된다. 100에 저장되어 있다는 정보를 OS가 가져와 해당 프로세스를 실행하게 된다. 만약 실행 순서를 바꾸고 싶으면 PC값을 바꿔주면 된다. 바꾸지 않고 그대로 실행한다면 100, 104, 108 이런 식으로 순차적으로 프로세스가 실행되게 된다. 조건문이나 반복문과 같은 제어문을 처리하여 프로그램의 분기, 반복, 점프 등의 흐름을 제어할 수 있다.
Machine Instruction Design은 컴퓨터 시스템에서 명령어의 집합들을 설계하는 과정을 의미한다. 간단히 말해서, 위에서 설명한 CPU가 할 수 있는 기본적인 연산(Computation), 제어흐름(Flow Of Control) 그리고 입출력(Input/Output)과 같은 것들을 고려해서 설계하는 과정이다. 입출력이란 컴퓨터와 사용자가 상호작용을 하는 과정에서 필요한 데이터들의 흐름을 관리하는 명령어들을 말한다. 이 명령어들은 키보드, 모니터, 마우스에서 들어오고 나가는 데이터들을 처리한다.
BIOS는 컴퓨터의 기본 입출력 시스템(Basic Input Output System)을 의미한다. 우리가 컴퓨터를 처음 샀을 때의 화면 또는 다시 시작을 누르고 F2를 연속으로 눌렀을 때 나오는 부팅과 초기화를 담당하는 화면을 의미한다. BIOS는 ROM에 저장되어 있는데, BIOS를 이해하기 위해서 ROM과 RAM의 차이를 설명해보려고 한다.
ROM(Read Only Memory)는 읽기 전용으로 데이터를 저장하는 메모리이다. ROM은 내용이 변경되지 않는 영구적인 저장공간이다. ROM은 컴퓨터의 가장 기본적인 동작들, 필수적으로 필요한 정보를 가지고 있다. 반면 RAM(Random Access Memory)는 읽기와 쓰기가 모두 가능한 임시적인 저장공간이다. RAM은 ROM과 다르게 컴퓨터가 꺼지게 되면 저장된 데이터가 날라가는 휘발성 메모리이다.
BIOS는 컴퓨터의 기본 입출력 시스템으로 RAM에 저장되어 있지 않고 ROM에 저장되어 있다. 따라서 컴퓨터를 껐다가 켜도 동일한 데이터가 유지될 수 있다.
튜링 기계(Turing Machine)은 Alan Turing이 개발한 개념적인 모델이다. 튜링 기계는 현대 컴퓨터의 기초 개념을 제공하고, 계산과 정보 처리를 추상화한 체계이다. 튜링 기계는 어떤 것이 계산 가능함에 대한 모호했던 정의를 제공해주었고, 현대 컴퓨터의 전신이 되었다.
튜링 기계는 무한한 길이의 테이프와 테이프를 읽고 쓸 수 있는 헤드로 구성된다. 테이프에는 수많은 기호가 적혀있고, 헤드는 테이프 한 칸씩 이동하면서 기호를 읽고 쓸 수 있다. 내부적으로는 상태를 가지고 있어 다양한 동작들을 이 상태에 따라 수행할 수 있다.
튜링 기계의 원리는 무한한 길이의 테이프가 여러 칸으로 나눠져 있고, 각각의 칸에는 기호가 적힐 수 있다. 처음에 테이프를 비워져 있는 상태로 둘 수 있거나, 기호를 미리 적어둘 수 있다. 처음에 헤드는 테이프의 시작 위치를 가리키고 있다. 튜링 기계는 현재 상태와 헤드가 가리키고 있는 기호를 바탕으로 동작한다. 동작들은 미리 정의된 규칙에 따라 결정된다. 가령, 어떠한 상태에서 헤드가 0을 가리키고 있었다면 상태가 바뀌고, 헤드가 1을 쓰고 한 칸 이동하는 동작을 수행할 수 있다. 이러한 동작들을 반복하면서 테이프의 각각의 칸에 기호를 읽고 쓰고, 상태를 변경하며 계산을 수행할 수 있다.
튜링 기계의 이러한 개념은 현대 컴퓨터에 기반이 되는 이론을 제공하였고, 컴퓨터 과학의 발전에 기여를 한 중요 개념이다.
컴퓨터는 계산을 위한 도구였다. 처음 컴퓨터는 입력을 위한 스위치가 있었고, 계산이 필요할 때 값을 입력하는 방식으로 계산을 했었다. 이 당시에는 이 수준을 넘어서는 계산이 필요하지 않았다. 시간이 지나 전쟁에서 미군의 복잡한 탄도를 계산하기 위해 세계 최초의 계산장치인 ENIAC이 만들어졌다. 그러나 ENIAC 한 대의 무게는 30톤 정도여서 사용하는데 제약이 있었다. 무거운 ENIAC이 아니라 1930년에 계산기를 만드는 놀라운 방법이 나오는데 그것이 폰 노이만 구조이다..
폰 노이만 구조(Von-Neumann Architecture)는 컴퓨터 시스템의 구조를 설계하는 방법 중 하나로 현대 컴퓨터 구조의 기반이 되는 중요한 개념이다. 폰 노이만 구조는 예전에 스위치 하나만으로 컴퓨터를 조작하던 방식에서 CPU와 Memory를 분리하는 방식이다. 먼저 간단하게 폰 노이만 구조를 설명하자면, 프로그램과 데이터를 Memory에 저장하고 CPU가 저장된 것들을 순차적으로 실행하는 구조이다.
폰 노이만 구조는 실제 연산을 담당하는 CPU, 데이터와 명령어를 저장하는 공간인 Memory, 외부 장치와 컴퓨터 사이에서 데이터 흐름을 관리하는 IO Device, 컴퓨터 내부의 데이터와 신호를 전송하는 BUS로 구성되어 있다.
저장공간에 프로그램과 데이터가 저장되어 있다고 가정할 때, 프로그램이 실행되면 OS는 해당 프로그램을 Memory 주소에 올리고 프로세스로 바뀐다. CPU는 해당 메모리에서 명령어와 필요한 데이터를 가져와서 연산을 수행한다. 위에서 설명했던 ALU를 통해 Computation 또는 Flow Of Control을 하게 된다. 데이터는 Memory와 CPU의 레지스터 사이, 레지스터와 ALU 사이의 BUS를 통해 전송된다. 이 과정에서 데이터는 저장, 연산, 수정이 된다. 연산이 끝나게 되면 I/O Device를 통해 외부장치와 데이터 교환이 된다. 데이터는 Memory와 I/O Device의 BUS를 통해 전송된다.
폰 노이만의 구조에도 단점이 존재하는데 이는 병목현상이다. Memory에 프로그램과 데이터를 꺼내와서 CPU가 실행할 때 오래 걸리면 나머지 프로그램과 데이터들을 꺼내오는데도 오래 걸릴 것이다. 즉, CPU가 연산을 하고 있을 때 나머지 일들을 처리하지 못한다는 단점이다. 이를 해결하기 위해서 대규모 병렬 처리, 멀티 코어 프로세서에 대한 개념이 나와서 해결하게 되었다.
이와 같은 폰 노이만 구조는 프로그램과 데이터를 Memory에 저장하고 CPU가 저장된 것들을 순차적으로 실행하는 구조로 현대 컴퓨터 구조의 기본이 되는 개념이다.
RISC와 CISC는 컴퓨터 하드웨어 구조 중 2가지이다.
RISC(Reduced Instruction Set Computer)는 적은 수의 명령어를 수행하도록 설계된 마이크로프로세서이다. 수많은 명령어 들의 집합을 자주 사용하는 명령어들을 집합으로 단순화하여 간략하고 일관성 있게 만들어 처리 속도를 향상시킨 프로세서이다. 이를 통해 기본적인 명령어 집합만 가지고 있어서 각 명령어는 단순하고 가볍고 실행 시간도 일정하다. 명령어가 단순하고 실행 시간도 일정해서 병렬로 처리하기에 유리하다. 컴퓨터의 처리 속도를 높이기 위해 복잡한 처리들은 소프트웨어에게 맡겨 명령어를 단순하게 유지하고, 명령어 실행을 위한 하드웨어를 최소화했다. 하드웨어를 최소화했기 때문에 소프트웨어가 복잡하고 크기가 커져 컴파일러의 최적화가 요구된다. 또한 RISC 프로세서는 수많은 레지스터를 가지고 있어서 데이터를 빠르게 접근할 수 있다.
CISC(Complex Instruction Set Computer)는 다양하고 복잡한 명령어를 수행하도록 설계된 마이크로 프로세서이다. CISC 프로세서는 다양한 명령어를 가지고 있고, 하나의 명령어로 다양한 작업을 수행할 수 있다. 명령어가 복잡하고 실행 시간과 명령어의 길이가 일정하지 않아서 RISC와 달리 병렬로 처리하기 어렵다. 다양하고 복잡한 명령어들이 여러 작업을 수행할 수 있어서 속도가 느리다. CISC 프로세서는 Memory 접근을 위해 캐시를 사용하여 성능을 향상시킨다.
간단하게 설명하자면, RISC는 단순하고 간결한 명령어 집합을 가져서 속도가 빠르고, CISC는 다양한 명령어와 복잡한 형식을 가지고 있어 속도가 느린 대신 다양한 작업을 수행할 수 있다.